ETH Price: $2,917.28 (+3.32%)
 

Overview

Max Total Supply

2,500 TheEveryones

Holders

506

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Everyones by award-winning British artist Ian Murray, makes history as the “FIRST-EVER” collection minted by House of First.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheEveryones

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 14 of 14: TheEveryones.sol
// SPDX-License-Identifier: GPL-3.0

// HOFHOFHOFHOFHOFHOFHOFHOFHOFHOFHHOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHF        HOFHOFHOFHOF
// HOFHOFHOFHOF      HOF          HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF                   HOFHOFHOFHOF
// HOFHOFHOFHOF           	 	  HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOF      HOFHOFH      HOFHOFHOFHOF
// HOFHOFHOFHOFHOFHOFHOFHOFHOFHOFHHOFHOFHOFHOF

// -----------    House Of First   -----------
// -----   The Everyones - Ian Murray    -----

pragma solidity ^0.8.10;
import "./ERC721Enum.sol";
import "./Ownable.sol";
import "./Strings.sol";
import "./ReentrancyGuard.sol";

contract OwnableDelegateProxy {}

/**
 * Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users
 */
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract TheEveryones is ERC721Enum, Ownable, ReentrancyGuard {
    using Strings for uint256;
    string public baseURI;
    
    //sale settings
    uint256 public constant SALE_START_TIMESTAMP = 1639504800; // Tuesday Dec 14th 2021 18:00:00 GMT
    uint256 public price = 0.08 ether;
    uint256 public maxSupply = 5000;
    uint256 public reserved = 250; // 250 NFTs reserved for vault
    uint256 public maxMint = 5; // max per transaction
    bool public salePaused = false;

    // whitelist
    address public constant WHITELIST_SIGNER = 0x9Ae97e577C40AE33443917828E4485C6c3894741;
    uint256 public disableWhitelistTimestamp = SALE_START_TIMESTAMP + (86400 * 1); // whitelist active for 1 day
    mapping(address => uint256) public whitelistPurchases;
    
    string _name = "The Everyones";
    string _symbol = "TheEveryones";
    string _initBaseURI = "https://houseoffirst.com:1335/theeveryones/opensea/";

    address public proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1; // OpenSea Mainnet Proxy Registry address
    
    constructor() ERC721P(_name, _symbol) {
        setBaseURI(_initBaseURI);
    }
    
    // internal
    function _baseURI() internal view virtual returns (string memory) {
        return baseURI;
    }
    
    function mintingHasStarted() public view returns (bool) {
        return block.timestamp > SALE_START_TIMESTAMP;
    }

    function whitelistHasEnded() public view returns (bool) {
        return block.timestamp > disableWhitelistTimestamp;
    }
    
    /**
     * @dev Gets current NFT Price
     */
    function getNFTPrice() public view returns (uint256) {
        return price;
    }
    
    /* whitelist */
    function isWhitelisted(address user, bytes memory signature) public pure returns (bool) {
        bytes32 messageHash = keccak256(abi.encodePacked(user));
        bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash));
        return recoverSigner(ethSignedMessageHash, signature) == WHITELIST_SIGNER;
    }
    
    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) private pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }
    
    function splitSignature(bytes memory sig) private pure returns (bytes32 r, bytes32 s, uint8 v) {
        require(sig.length == 65, "invalid signature length");
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }
    }

    // public minting
    function mintNFT(uint256 numberOfNfts) public payable nonReentrant {
        require(block.timestamp > disableWhitelistTimestamp, "Public Sale has not started");
        uint256 s = _owners.length;
        require(!salePaused, "Sale Paused");
        require(numberOfNfts > 0 && numberOfNfts <= maxMint, "Invalid numberOfNfts");
        require((s + numberOfNfts) <= (maxSupply - reserved), "Exceeds Max Supply");
        require(msg.value >= price * numberOfNfts, "Not Enough ETH");
        
        for (uint256 i = 0; i < numberOfNfts; ++i) {
            _safeMint(msg.sender, s + i, "");
        }
        delete s;
    }

    // whitelist minting
    function whitelistMintNFT(uint256 numberOfNfts, bytes memory signature) public payable nonReentrant {
        require(block.timestamp > SALE_START_TIMESTAMP, "Sale has not started");
        uint256 s = _owners.length;
        require(!salePaused, "Sale Paused");
        require(numberOfNfts > 0 && numberOfNfts <= maxMint, "Invalid numberOfNfts");
        require((s + numberOfNfts) <= (maxSupply - reserved), "Exceeds Max Supply");
        require(msg.value >= price * numberOfNfts, "Not Enough ETH");
        require(whitelistPurchases[msg.sender] + numberOfNfts <= maxMint, "Exceeds Whitelist Allocation");
        require(isWhitelisted(msg.sender, signature), "Address not whitelisted");

        whitelistPurchases[msg.sender] += numberOfNfts;
        for (uint256 i = 0; i < numberOfNfts; ++i) {
            _safeMint(msg.sender, s + i, "");
        }
        delete s;
    }

    // admin minting for reserved NFTs
    function giftNFT(uint256[] calldata quantity, address[] calldata recipient) external onlyOwner {
        require(quantity.length == recipient.length, "Invalid quantities and recipients (length mismatch)");
        uint256 totalQuantity = 0;
        uint256 s = _owners.length;
        for (uint256 i = 0; i < quantity.length; ++i) {
            totalQuantity += quantity[i];
        }
        require(s + totalQuantity <= maxSupply, "Exceeds Max Supply");
        require(totalQuantity <= reserved, "Exceeds Max Reserved");

        // update remaining reserved count
        reserved -= totalQuantity;

        delete totalQuantity;
        for (uint256 i = 0; i < recipient.length; ++i) {
            for (uint256 j = 0; j < quantity[i]; ++j) {
                _safeMint(recipient[i], s++, "");
            }
        }
        delete s;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: Nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : "";
    }

    function setPrice(uint256 _newPrice) public onlyOwner {
        price = _newPrice;
    }

    function setMaxMintAmount(uint256 _newMaxMintAmount) public onlyOwner {
        maxMint = _newMaxMintAmount;
    }

    function setmaxSupply(uint256 _newMaxSupply) public onlyOwner {
        maxSupply = _newMaxSupply;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setSalePaused(bool _salePaused) public onlyOwner {
        salePaused = _salePaused;
    }
    
    function setDisableWhitelistTimestamp(uint256 _disableWhitelistTimestamp) public onlyOwner {
        disableWhitelistTimestamp = _disableWhitelistTimestamp;
    }

    // for transparency regarding ETH raised
    uint256 totalWithdrawn = 0;

    function getTotalWithdrawn() public view returns (uint256) {
        return totalWithdrawn;
    }

    function getTotalBalance() public view returns (uint256) {
        return address(this).balance;
    }

    function getTotalRaised() public view returns (uint256) {
        return getTotalWithdrawn() + getTotalBalance();
    }

    /**
     * withdraw ETH from the contract (callable by Owner only)
     */
    function withdraw() public payable onlyOwner {
        uint256 val = address(this).balance;
        (bool success, ) = payable(msg.sender).call{
            value: val
        }("");
        require(success);
        totalWithdrawn += val;
        delete val;
    }
    /**
     * whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator) override public view returns (bool) {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.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 4 of 14: ERC721Enum.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.10;
import "./ERC721P.sol";
import "./IERC721Enumerable.sol";

abstract contract ERC721Enum is ERC721P, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165, ERC721P)
        returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256 tokenId)
    {
        require(index < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 count;
        for (uint256 i; i < _owners.length; ++i) {
            if (owner == _owners[i]) {
                if (count == index) return i;
                else ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }

    function tokensOfOwner(address owner)
        public
        view
        returns (uint256[] memory)
    {
        require(0 < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }

    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}

File 5 of 14: ERC721P.sol
// SPDX-License-Identifier: GPL-3.0

// Thank you to ToyBoogers & Pagzi Tech for the optimised ERC721
pragma solidity ^0.8.10;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

abstract contract ERC721P is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    
    function getOwners() external view returns (address[] memory) {
        return _owners;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        uint256 count = 0;
        uint256 length = _owners.length;
        for (uint256 i = 0; i < length; ++i) {
            if (owner == _owners[i]) {
                ++count;
            }
        }
        delete length;
        return count;
    }

    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;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721P.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);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    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);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    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);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    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);
    }

    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"
        );
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721P.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    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"
        );
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721P.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721P.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721P.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 6 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 7 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.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 8 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.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 9 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.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 10 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 11 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 12 of 14: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 13 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"SALE_START_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SIGNER","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableWhitelistTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"giftNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingHasStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disableWhitelistTimestamp","type":"uint256"}],"name":"setDisableWhitelistTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_salePaused","type":"bool"}],"name":"setSalePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistHasEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405267011c37937e08000060085561138860095560fa600a556005600b55600c805460ff191690556200003d6361b8dba062015180620004a5565b600d908155604080518082019091528181526c5468652045766572796f6e657360981b60209091019081526200007791600f9190620003ff565b5060408051808201909152600c8082526b54686545766572796f6e657360a01b6020909201918252620000ad91601091620003ff565b5060405180606001604052806033815260200162003cdb603391398051620000de91601191602090910190620003ff565b50601280546001600160a01b03191673a5409ec958c83c3f309868babaca7c86dcb077c117905560006013553480156200011757600080fd5b50600f80546200012790620004cc565b80601f01602080910402602001604051908101604052809291908181526020018280546200015590620004cc565b8015620001a65780601f106200017a57610100808354040283529160200191620001a6565b820191906000526020600020905b8154815290600101906020018083116200018857829003601f168201915b505050505060108054620001ba90620004cc565b80601f0160208091040260200160405190810160405280929190818152602001828054620001e890620004cc565b8015620002395780601f106200020d5761010080835404028352916020019162000239565b820191906000526020600020905b8154815290600101906020018083116200021b57829003601f168201915b5050845162000253935060009250602086019150620003ff565b50805162000269906001906020840190620003ff565b50505062000286620002806200033160201b60201c565b62000335565b6001600655601180546200032b9190620002a090620004cc565b80601f0160208091040260200160405190810160405280929190818152602001828054620002ce90620004cc565b80156200031f5780601f10620002f3576101008083540402835291602001916200031f565b820191906000526020600020905b8154815290600101906020018083116200030157829003601f168201915b50506200038792505050565b62000509565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620003e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620003fb906007906020840190620003ff565b5050565b8280546200040d90620004cc565b90600052602060002090601f0160209004810192826200043157600085556200047c565b82601f106200044c57805160ff19168380011785556200047c565b828001600101855582156200047c579182015b828111156200047c5782518255916020019190600101906200045f565b506200048a9291506200048e565b5090565b5b808211156200048a57600081556001016200048f565b60008219821115620004c757634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620004e157607f821691505b602082108114156200050357634e487b7160e01b600052602260045260246000fd5b50919050565b6137c280620005196000396000f3fe60806040526004361061031e5760003560e01c80637501f741116101a5578063a0e67e2b116100ec578063d5abeb0111610095578063f632fdb01161006f578063f632fdb014610896578063fae40c7c146108ad578063fb107a4f146108c0578063fe60d12c146108d557600080fd5b8063d5abeb0114610840578063e985e9c514610856578063f2fde38b1461087657600080fd5b8063c29af274116100c6578063c29af274146107d3578063c87b56dd146107f3578063cd7c03261461081357600080fd5b8063a0e67e2b14610771578063a22cb46514610793578063b88d4fde146107b357600080fd5b806391b7f5ed1161014e57806395d89b411161012857806395d89b41146107315780639f55029314610746578063a035b1fe1461075b57600080fd5b806391b7f5ed146106e65780639264274414610706578063946807fd1461071957600080fd5b80638d92becd1161017f5780638d92becd1461067b5780638da5cb5b1461069b578063910dc0d8146106c657600080fd5b80637501f741146106235780638462151c1461063957806389404a791461066657600080fd5b8063417b9483116102695780635d08c1ae116102125780636c0360eb116101ec5780636c0360eb146105d957806370a08231146105ee578063715018a61461060e57600080fd5b80635d08c1ae146105725780636343ed8a1461058c5780636352211e146105b957600080fd5b80634f6ccce7116102435780634f6ccce71461051957806354964d271461053957806355f804b31461055257600080fd5b8063417b9483146104bb57806342842e0e146104e35780634298abbe1461050357600080fd5b806318160ddd116102cb57806323b872dd116102a557806323b872dd146104735780632f745c59146104935780633ccfd60b146104b357600080fd5b806318160ddd1461041e5780631f0a8fa714610433578063228025e81461045357600080fd5b8063088a4ed0116102fc578063088a4ed0146103bf578063095ea7b3146103e157806312b583491461040157600080fd5b806301ffc9a71461032357806306fdde0314610358578063081812fc1461037a575b600080fd5b34801561032f57600080fd5b5061034361033e366004612fc0565b6108eb565b60405190151581526020015b60405180910390f35b34801561036457600080fd5b5061036d610947565b60405161034f9190613053565b34801561038657600080fd5b5061039a610395366004613066565b6109d9565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034f565b3480156103cb57600080fd5b506103df6103da366004613066565b610a84565b005b3480156103ed57600080fd5b506103df6103fc3660046130a1565b610af0565b34801561040d57600080fd5b50475b60405190815260200161034f565b34801561042a57600080fd5b50600254610410565b34801561043f57600080fd5b5061034361044e3660046131b0565b610c49565b34801561045f57600080fd5b506103df61046e366004613066565b610d1b565b34801561047f57600080fd5b506103df61048e366004613200565b610d87565b34801561049f57600080fd5b506104106104ae3660046130a1565b610e0e565b6103df610f2a565b3480156104c757600080fd5b5061039a739ae97e577c40ae33443917828e4485c6c389474181565b3480156104ef57600080fd5b506103df6104fe366004613200565b611003565b34801561050f57600080fd5b50610410600d5481565b34801561052557600080fd5b50610410610534366004613066565b61101e565b34801561054557600080fd5b506361b8dba04211610343565b34801561055e57600080fd5b506103df61056d366004613241565b61107b565b34801561057e57600080fd5b50600c546103439060ff1681565b34801561059857600080fd5b506104106105a736600461328a565b600e6020526000908152604090205481565b3480156105c557600080fd5b5061039a6105d4366004613066565b6110f9565b3480156105e557600080fd5b5061036d6111a6565b3480156105fa57600080fd5b5061041061060936600461328a565b611234565b34801561061a57600080fd5b506103df611333565b34801561062f57600080fd5b50610410600b5481565b34801561064557600080fd5b5061065961065436600461328a565b6113a6565b60405161034f91906132a7565b34801561067257600080fd5b50601354610410565b34801561068757600080fd5b506103df610696366004613300565b6114a0565b3480156106a757600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff1661039a565b3480156106d257600080fd5b506103df6106e1366004613066565b611538565b3480156106f257600080fd5b506103df610701366004613066565b6115a4565b6103df610714366004613066565b611610565b34801561072557600080fd5b506104106361b8dba081565b34801561073d57600080fd5b5061036d61187a565b34801561075257600080fd5b50610410611889565b34801561076757600080fd5b5061041060085481565b34801561077d57600080fd5b5061078661189e565b60405161034f919061331b565b34801561079f57600080fd5b506103df6107ae366004613369565b61190c565b3480156107bf57600080fd5b506103df6107ce36600461339e565b611a09565b3480156107df57600080fd5b506103df6107ee366004613456565b611a97565b3480156107ff57600080fd5b5061036d61080e366004613066565b611d25565b34801561081f57600080fd5b5060125461039a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561084c57600080fd5b5061041060095481565b34801561086257600080fd5b506103436108713660046134c2565b611dfe565b34801561088257600080fd5b506103df61089136600461328a565b611eff565b3480156108a257600080fd5b50600d544211610343565b6103df6108bb3660046134fb565b611ffb565b3480156108cc57600080fd5b50600854610410565b3480156108e157600080fd5b50610410600a5481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061094157506109418261233a565b92915050565b6060600080546109569061352c565b80601f01602080910402602001604051908101604052809291908181526020018280546109829061352c565b80156109cf5780601f106109a4576101008083540402835291602001916109cf565b820191906000526020600020905b8154815290600101906020018083116109b257829003601f168201915b5050505050905090565b60006109e48261241d565b610a5b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff163314610aeb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600b55565b6000610afb826110f9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a52565b3373ffffffffffffffffffffffffffffffffffffffff82161480610bc85750610bc88133611dfe565b610c3a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a52565b610c448383612481565b505050565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602080830191909152825180830360140181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401829052845180850390910181526090909301909352815191012060009190739ae97e577c40ae33443917828e4485c6c3894741610cfb8286612521565b73ffffffffffffffffffffffffffffffffffffffff161495945050505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600955565b610d9133826125be565b610e035760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a52565b610c448383836126c5565b6000610e1983611234565b8210610e675760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a52565b6000805b600254811015610ee15760028181548110610e8857610e88613580565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415610ed15783821415610ec55791506109419050565b610ece826135de565b91505b610eda816135de565b9050610e6b565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a52565b60055473ffffffffffffffffffffffffffffffffffffffff163314610f915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b6040514790600090339083908381818185875af1925050503d8060008114610fd5576040519150601f19603f3d011682016040523d82523d6000602084013e610fda565b606091505b5050905080610fe857600080fd5b8160136000828254610ffa9190613617565b90915550505050565b610c4483838360405180602001604052806000815250611a09565b600061102960025490565b82106110775760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610a52565b5090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b80516110f5906007906020840190612f02565b5050565b6000806002838154811061110f5761110f613580565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050806109415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a52565b600780546111b39061352c565b80601f01602080910402602001604051908101604052809291908181526020018280546111df9061352c565b801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b505050505081565b600073ffffffffffffffffffffffffffffffffffffffff82166112bf5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a52565b600254600090815b8181101561132a57600281815481106112e2576112e2613580565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8681169116141561131a57611317836135de565b92505b611323816135de565b90506112c7565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461139a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b6113a46000612894565b565b60606113b182611234565b6000106114005760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a52565b600061140b83611234565b905060008167ffffffffffffffff811115611428576114286130cd565b604051908082528060200260200182016040528015611451578160200160208202803683370190505b50905060005b82811015611498576114698582610e0e565b82828151811061147b5761147b613580565b602090810291909101015280611490816135de565b915050611457565b509392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461159f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600d55565b60055473ffffffffffffffffffffffffffffffffffffffff16331461160b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600855565b600260065414156116635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a52565b6002600655600d5442116116b95760405162461bcd60e51b815260206004820152601b60248201527f5075626c69632053616c6520686173206e6f74207374617274656400000000006044820152606401610a52565b600254600c5460ff161561170f5760405162461bcd60e51b815260206004820152600b60248201527f53616c65205061757365640000000000000000000000000000000000000000006044820152606401610a52565b6000821180156117215750600b548211155b61176d5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e6674730000000000000000000000006044820152606401610a52565b600a5460095461177d919061362f565b6117878383613617565b11156117d55760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c7900000000000000000000000000006044820152606401610a52565b816008546117e39190613646565b3410156118325760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420456e6f756768204554480000000000000000000000000000000000006044820152606401610a52565b60005b82811015611870576118603361184b8385613617565b6040518060200160405280600081525061290b565b611869816135de565b9050611835565b5050600160065550565b6060600180546109569061352c565b6000476013546118999190613617565b905090565b606060028054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116118d8575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff82163314156119725760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a52565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611a1333836125be565b611a855760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a52565b611a9184848484612994565b50505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611afe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b828114611b735760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d6174636829000000000000000000000000006064820152608401610a52565b600254600090815b85811015611bb957868682818110611b9557611b95613580565b9050602002013583611ba79190613617565b9250611bb2816135de565b9050611b7b565b50600954611bc78383613617565b1115611c155760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c7900000000000000000000000000006044820152606401610a52565b600a54821115611c675760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d61782052657365727665640000000000000000000000006044820152606401610a52565b81600a6000828254611c79919061362f565b90915550600092508290505b83811015611d1c5760005b878783818110611ca257611ca2613580565b90506020020135811015611d0b57611cfb868684818110611cc557611cc5613580565b9050602002016020810190611cda919061328a565b84611ce4816135de565b95506040518060200160405280600081525061290b565b611d04816135de565b9050611c90565b50611d15816135de565b9050611c85565b50505050505050565b6060611d308261241d565b611da25760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560448201527f6e000000000000000000000000000000000000000000000000000000000000006064820152608401610a52565b6000611dac612a1d565b90506000815111611dcc5760405180602001604052806000815250611df7565b80611dd684612a2c565b604051602001611de7929190613683565b6040516020818303038152906040525b9392505050565b6012546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a91906136b2565b73ffffffffffffffffffffffffffffffffffffffff161415611ec0576001915050610941565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611f665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b73ffffffffffffffffffffffffffffffffffffffff8116611fef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a52565b611ff881612894565b50565b6002600654141561204e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a52565b60026006556361b8dba042116120a65760405162461bcd60e51b815260206004820152601460248201527f53616c6520686173206e6f7420737461727465640000000000000000000000006044820152606401610a52565b600254600c5460ff16156120fc5760405162461bcd60e51b815260206004820152600b60248201527f53616c65205061757365640000000000000000000000000000000000000000006044820152606401610a52565b60008311801561210e5750600b548311155b61215a5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e6674730000000000000000000000006044820152606401610a52565b600a5460095461216a919061362f565b6121748483613617565b11156121c25760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c7900000000000000000000000000006044820152606401610a52565b826008546121d09190613646565b34101561221f5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420456e6f756768204554480000000000000000000000000000000000006044820152606401610a52565b600b54336000908152600e602052604090205461223d908590613617565b111561228b5760405162461bcd60e51b815260206004820152601c60248201527f457863656564732057686974656c69737420416c6c6f636174696f6e000000006044820152606401610a52565b6122953383610c49565b6122e15760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f742077686974656c69737465640000000000000000006044820152606401610a52565b336000908152600e602052604081208054859290612300908490613617565b90915550600090505b8381101561232f5761231f3361184b8385613617565b612328816135de565b9050612309565b505060016006555050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806123cd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061094157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610941565b600254600090821080156109415750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061245757612457613580565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906124db826110f9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060008061253085612b5e565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa15801561258b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b60006125c98261241d565b61263b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a52565b6000612646836110f9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126b557508373ffffffffffffffffffffffffffffffffffffffff1661269d846109d9565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ef75750611ef78185611dfe565b8273ffffffffffffffffffffffffffffffffffffffff166126e5826110f9565b73ffffffffffffffffffffffffffffffffffffffff161461276e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a52565b73ffffffffffffffffffffffffffffffffffffffff82166127f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a52565b612801600082612481565b816002828154811061281557612815613580565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6129158383612bd2565b6129226000848484612d2c565b610c445760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a52565b61299f8484846126c5565b6129ab84848484612d2c565b611a915760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a52565b6060600780546109569061352c565b606081612a6c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612a965780612a80816135de565b9150612a8f9050600a836136fe565b9150612a70565b60008167ffffffffffffffff811115612ab157612ab16130cd565b6040519080825280601f01601f191660200182016040528015612adb576020820181803683370190505b5090505b8415611ef757612af060018361362f565b9150612afd600a86613712565b612b08906030613617565b60f81b818381518110612b1d57612b1d613580565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b57600a866136fe565b9450612adf565b60008060008351604114612bb45760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610a52565b50505060208101516040820151606090920151909260009190911a90565b73ffffffffffffffffffffffffffffffffffffffff8216612c355760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a52565b612c3e8161241d565b15612c8b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a52565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612ef7576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612da3903390899088908890600401613726565b6020604051808303816000875af1925050508015612dfc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612df99181019061376f565b60015b612eac573d808015612e2a576040519150601f19603f3d011682016040523d82523d6000602084013e612e2f565b606091505b508051612ea45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a52565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611ef7565b506001949350505050565b828054612f0e9061352c565b90600052602060002090601f016020900481019282612f305760008555612f76565b82601f10612f4957805160ff1916838001178555612f76565b82800160010185558215612f76579182015b82811115612f76578251825591602001919060010190612f5b565b506110779291505b808211156110775760008155600101612f7e565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611ff857600080fd5b600060208284031215612fd257600080fd5b8135611df781612f92565b60005b83811015612ff8578181015183820152602001612fe0565b83811115611a915750506000910152565b60008151808452613021816020860160208601612fdd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611df76020830184613009565b60006020828403121561307857600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611ff857600080fd5b600080604083850312156130b457600080fd5b82356130bf8161307f565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115613117576131176130cd565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561315d5761315d6130cd565b8160405280935085815286868601111561317657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126131a157600080fd5b611df7838335602085016130fc565b600080604083850312156131c357600080fd5b82356131ce8161307f565b9150602083013567ffffffffffffffff8111156131ea57600080fd5b6131f685828601613190565b9150509250929050565b60008060006060848603121561321557600080fd5b83356132208161307f565b925060208401356132308161307f565b929592945050506040919091013590565b60006020828403121561325357600080fd5b813567ffffffffffffffff81111561326a57600080fd5b8201601f8101841361327b57600080fd5b611ef7848235602084016130fc565b60006020828403121561329c57600080fd5b8135611df78161307f565b6020808252825182820181905260009190848201906040850190845b818110156132df578351835292840192918401916001016132c3565b50909695505050505050565b803580151581146132fb57600080fd5b919050565b60006020828403121561331257600080fd5b611df7826132eb565b6020808252825182820181905260009190848201906040850190845b818110156132df57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613337565b6000806040838503121561337c57600080fd5b82356133878161307f565b9150613395602084016132eb565b90509250929050565b600080600080608085870312156133b457600080fd5b84356133bf8161307f565b935060208501356133cf8161307f565b925060408501359150606085013567ffffffffffffffff8111156133f257600080fd5b6133fe87828801613190565b91505092959194509250565b60008083601f84011261341c57600080fd5b50813567ffffffffffffffff81111561343457600080fd5b6020830191508360208260051b850101111561344f57600080fd5b9250929050565b6000806000806040858703121561346c57600080fd5b843567ffffffffffffffff8082111561348457600080fd5b6134908883890161340a565b909650945060208701359150808211156134a957600080fd5b506134b68782880161340a565b95989497509550505050565b600080604083850312156134d557600080fd5b82356134e08161307f565b915060208301356134f08161307f565b809150509250929050565b6000806040838503121561350e57600080fd5b82359150602083013567ffffffffffffffff8111156131ea57600080fd5b600181811c9082168061354057607f821691505b6020821081141561357a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613610576136106135af565b5060010190565b6000821982111561362a5761362a6135af565b500190565b600082821015613641576136416135af565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561367e5761367e6135af565b500290565b60008351613695818460208801612fdd565b8351908301906136a9818360208801612fdd565b01949350505050565b6000602082840312156136c457600080fd5b8151611df78161307f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261370d5761370d6136cf565b500490565b600082613721576137216136cf565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526137656080830184613009565b9695505050505050565b60006020828403121561378157600080fd5b8151611df781612f9256fea26469706673582212201e8a8ab5b717d32ef48ab76170f593b2d69653b6d4ae510458eab8f9665b848864736f6c634300080a003368747470733a2f2f686f7573656f6666697273742e636f6d3a313333352f74686565766572796f6e65732f6f70656e7365612f

Deployed Bytecode

0x60806040526004361061031e5760003560e01c80637501f741116101a5578063a0e67e2b116100ec578063d5abeb0111610095578063f632fdb01161006f578063f632fdb014610896578063fae40c7c146108ad578063fb107a4f146108c0578063fe60d12c146108d557600080fd5b8063d5abeb0114610840578063e985e9c514610856578063f2fde38b1461087657600080fd5b8063c29af274116100c6578063c29af274146107d3578063c87b56dd146107f3578063cd7c03261461081357600080fd5b8063a0e67e2b14610771578063a22cb46514610793578063b88d4fde146107b357600080fd5b806391b7f5ed1161014e57806395d89b411161012857806395d89b41146107315780639f55029314610746578063a035b1fe1461075b57600080fd5b806391b7f5ed146106e65780639264274414610706578063946807fd1461071957600080fd5b80638d92becd1161017f5780638d92becd1461067b5780638da5cb5b1461069b578063910dc0d8146106c657600080fd5b80637501f741146106235780638462151c1461063957806389404a791461066657600080fd5b8063417b9483116102695780635d08c1ae116102125780636c0360eb116101ec5780636c0360eb146105d957806370a08231146105ee578063715018a61461060e57600080fd5b80635d08c1ae146105725780636343ed8a1461058c5780636352211e146105b957600080fd5b80634f6ccce7116102435780634f6ccce71461051957806354964d271461053957806355f804b31461055257600080fd5b8063417b9483146104bb57806342842e0e146104e35780634298abbe1461050357600080fd5b806318160ddd116102cb57806323b872dd116102a557806323b872dd146104735780632f745c59146104935780633ccfd60b146104b357600080fd5b806318160ddd1461041e5780631f0a8fa714610433578063228025e81461045357600080fd5b8063088a4ed0116102fc578063088a4ed0146103bf578063095ea7b3146103e157806312b583491461040157600080fd5b806301ffc9a71461032357806306fdde0314610358578063081812fc1461037a575b600080fd5b34801561032f57600080fd5b5061034361033e366004612fc0565b6108eb565b60405190151581526020015b60405180910390f35b34801561036457600080fd5b5061036d610947565b60405161034f9190613053565b34801561038657600080fd5b5061039a610395366004613066565b6109d9565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034f565b3480156103cb57600080fd5b506103df6103da366004613066565b610a84565b005b3480156103ed57600080fd5b506103df6103fc3660046130a1565b610af0565b34801561040d57600080fd5b50475b60405190815260200161034f565b34801561042a57600080fd5b50600254610410565b34801561043f57600080fd5b5061034361044e3660046131b0565b610c49565b34801561045f57600080fd5b506103df61046e366004613066565b610d1b565b34801561047f57600080fd5b506103df61048e366004613200565b610d87565b34801561049f57600080fd5b506104106104ae3660046130a1565b610e0e565b6103df610f2a565b3480156104c757600080fd5b5061039a739ae97e577c40ae33443917828e4485c6c389474181565b3480156104ef57600080fd5b506103df6104fe366004613200565b611003565b34801561050f57600080fd5b50610410600d5481565b34801561052557600080fd5b50610410610534366004613066565b61101e565b34801561054557600080fd5b506361b8dba04211610343565b34801561055e57600080fd5b506103df61056d366004613241565b61107b565b34801561057e57600080fd5b50600c546103439060ff1681565b34801561059857600080fd5b506104106105a736600461328a565b600e6020526000908152604090205481565b3480156105c557600080fd5b5061039a6105d4366004613066565b6110f9565b3480156105e557600080fd5b5061036d6111a6565b3480156105fa57600080fd5b5061041061060936600461328a565b611234565b34801561061a57600080fd5b506103df611333565b34801561062f57600080fd5b50610410600b5481565b34801561064557600080fd5b5061065961065436600461328a565b6113a6565b60405161034f91906132a7565b34801561067257600080fd5b50601354610410565b34801561068757600080fd5b506103df610696366004613300565b6114a0565b3480156106a757600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff1661039a565b3480156106d257600080fd5b506103df6106e1366004613066565b611538565b3480156106f257600080fd5b506103df610701366004613066565b6115a4565b6103df610714366004613066565b611610565b34801561072557600080fd5b506104106361b8dba081565b34801561073d57600080fd5b5061036d61187a565b34801561075257600080fd5b50610410611889565b34801561076757600080fd5b5061041060085481565b34801561077d57600080fd5b5061078661189e565b60405161034f919061331b565b34801561079f57600080fd5b506103df6107ae366004613369565b61190c565b3480156107bf57600080fd5b506103df6107ce36600461339e565b611a09565b3480156107df57600080fd5b506103df6107ee366004613456565b611a97565b3480156107ff57600080fd5b5061036d61080e366004613066565b611d25565b34801561081f57600080fd5b5060125461039a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561084c57600080fd5b5061041060095481565b34801561086257600080fd5b506103436108713660046134c2565b611dfe565b34801561088257600080fd5b506103df61089136600461328a565b611eff565b3480156108a257600080fd5b50600d544211610343565b6103df6108bb3660046134fb565b611ffb565b3480156108cc57600080fd5b50600854610410565b3480156108e157600080fd5b50610410600a5481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061094157506109418261233a565b92915050565b6060600080546109569061352c565b80601f01602080910402602001604051908101604052809291908181526020018280546109829061352c565b80156109cf5780601f106109a4576101008083540402835291602001916109cf565b820191906000526020600020905b8154815290600101906020018083116109b257829003601f168201915b5050505050905090565b60006109e48261241d565b610a5b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff163314610aeb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600b55565b6000610afb826110f9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a52565b3373ffffffffffffffffffffffffffffffffffffffff82161480610bc85750610bc88133611dfe565b610c3a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a52565b610c448383612481565b505050565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602080830191909152825180830360140181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401829052845180850390910181526090909301909352815191012060009190739ae97e577c40ae33443917828e4485c6c3894741610cfb8286612521565b73ffffffffffffffffffffffffffffffffffffffff161495945050505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600955565b610d9133826125be565b610e035760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a52565b610c448383836126c5565b6000610e1983611234565b8210610e675760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a52565b6000805b600254811015610ee15760028181548110610e8857610e88613580565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415610ed15783821415610ec55791506109419050565b610ece826135de565b91505b610eda816135de565b9050610e6b565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a52565b60055473ffffffffffffffffffffffffffffffffffffffff163314610f915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b6040514790600090339083908381818185875af1925050503d8060008114610fd5576040519150601f19603f3d011682016040523d82523d6000602084013e610fda565b606091505b5050905080610fe857600080fd5b8160136000828254610ffa9190613617565b90915550505050565b610c4483838360405180602001604052806000815250611a09565b600061102960025490565b82106110775760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610a52565b5090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b80516110f5906007906020840190612f02565b5050565b6000806002838154811061110f5761110f613580565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050806109415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a52565b600780546111b39061352c565b80601f01602080910402602001604051908101604052809291908181526020018280546111df9061352c565b801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b505050505081565b600073ffffffffffffffffffffffffffffffffffffffff82166112bf5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a52565b600254600090815b8181101561132a57600281815481106112e2576112e2613580565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8681169116141561131a57611317836135de565b92505b611323816135de565b90506112c7565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461139a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b6113a46000612894565b565b60606113b182611234565b6000106114005760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a52565b600061140b83611234565b905060008167ffffffffffffffff811115611428576114286130cd565b604051908082528060200260200182016040528015611451578160200160208202803683370190505b50905060005b82811015611498576114698582610e0e565b82828151811061147b5761147b613580565b602090810291909101015280611490816135de565b915050611457565b509392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461159f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600d55565b60055473ffffffffffffffffffffffffffffffffffffffff16331461160b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b600855565b600260065414156116635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a52565b6002600655600d5442116116b95760405162461bcd60e51b815260206004820152601b60248201527f5075626c69632053616c6520686173206e6f74207374617274656400000000006044820152606401610a52565b600254600c5460ff161561170f5760405162461bcd60e51b815260206004820152600b60248201527f53616c65205061757365640000000000000000000000000000000000000000006044820152606401610a52565b6000821180156117215750600b548211155b61176d5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e6674730000000000000000000000006044820152606401610a52565b600a5460095461177d919061362f565b6117878383613617565b11156117d55760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c7900000000000000000000000000006044820152606401610a52565b816008546117e39190613646565b3410156118325760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420456e6f756768204554480000000000000000000000000000000000006044820152606401610a52565b60005b82811015611870576118603361184b8385613617565b6040518060200160405280600081525061290b565b611869816135de565b9050611835565b5050600160065550565b6060600180546109569061352c565b6000476013546118999190613617565b905090565b606060028054806020026020016040519081016040528092919081815260200182805480156109cf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116118d8575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff82163314156119725760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a52565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611a1333836125be565b611a855760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a52565b611a9184848484612994565b50505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611afe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b828114611b735760405162461bcd60e51b815260206004820152603360248201527f496e76616c6964207175616e74697469657320616e6420726563697069656e7460448201527f7320286c656e677468206d69736d6174636829000000000000000000000000006064820152608401610a52565b600254600090815b85811015611bb957868682818110611b9557611b95613580565b9050602002013583611ba79190613617565b9250611bb2816135de565b9050611b7b565b50600954611bc78383613617565b1115611c155760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c7900000000000000000000000000006044820152606401610a52565b600a54821115611c675760405162461bcd60e51b815260206004820152601460248201527f45786365656473204d61782052657365727665640000000000000000000000006044820152606401610a52565b81600a6000828254611c79919061362f565b90915550600092508290505b83811015611d1c5760005b878783818110611ca257611ca2613580565b90506020020135811015611d0b57611cfb868684818110611cc557611cc5613580565b9050602002016020810190611cda919061328a565b84611ce4816135de565b95506040518060200160405280600081525061290b565b611d04816135de565b9050611c90565b50611d15816135de565b9050611c85565b50505050505050565b6060611d308261241d565b611da25760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560448201527f6e000000000000000000000000000000000000000000000000000000000000006064820152608401610a52565b6000611dac612a1d565b90506000815111611dcc5760405180602001604052806000815250611df7565b80611dd684612a2c565b604051602001611de7929190613683565b6040516020818303038152906040525b9392505050565b6012546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a91906136b2565b73ffffffffffffffffffffffffffffffffffffffff161415611ec0576001915050610941565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611f665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a52565b73ffffffffffffffffffffffffffffffffffffffff8116611fef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a52565b611ff881612894565b50565b6002600654141561204e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a52565b60026006556361b8dba042116120a65760405162461bcd60e51b815260206004820152601460248201527f53616c6520686173206e6f7420737461727465640000000000000000000000006044820152606401610a52565b600254600c5460ff16156120fc5760405162461bcd60e51b815260206004820152600b60248201527f53616c65205061757365640000000000000000000000000000000000000000006044820152606401610a52565b60008311801561210e5750600b548311155b61215a5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206e756d6265724f664e6674730000000000000000000000006044820152606401610a52565b600a5460095461216a919061362f565b6121748483613617565b11156121c25760405162461bcd60e51b815260206004820152601260248201527f45786365656473204d617820537570706c7900000000000000000000000000006044820152606401610a52565b826008546121d09190613646565b34101561221f5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420456e6f756768204554480000000000000000000000000000000000006044820152606401610a52565b600b54336000908152600e602052604090205461223d908590613617565b111561228b5760405162461bcd60e51b815260206004820152601c60248201527f457863656564732057686974656c69737420416c6c6f636174696f6e000000006044820152606401610a52565b6122953383610c49565b6122e15760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f742077686974656c69737465640000000000000000006044820152606401610a52565b336000908152600e602052604081208054859290612300908490613617565b90915550600090505b8381101561232f5761231f3361184b8385613617565b612328816135de565b9050612309565b505060016006555050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806123cd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061094157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610941565b600254600090821080156109415750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061245757612457613580565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906124db826110f9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060008061253085612b5e565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa15801561258b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b60006125c98261241d565b61263b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a52565b6000612646836110f9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126b557508373ffffffffffffffffffffffffffffffffffffffff1661269d846109d9565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ef75750611ef78185611dfe565b8273ffffffffffffffffffffffffffffffffffffffff166126e5826110f9565b73ffffffffffffffffffffffffffffffffffffffff161461276e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a52565b73ffffffffffffffffffffffffffffffffffffffff82166127f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a52565b612801600082612481565b816002828154811061281557612815613580565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6129158383612bd2565b6129226000848484612d2c565b610c445760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a52565b61299f8484846126c5565b6129ab84848484612d2c565b611a915760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a52565b6060600780546109569061352c565b606081612a6c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612a965780612a80816135de565b9150612a8f9050600a836136fe565b9150612a70565b60008167ffffffffffffffff811115612ab157612ab16130cd565b6040519080825280601f01601f191660200182016040528015612adb576020820181803683370190505b5090505b8415611ef757612af060018361362f565b9150612afd600a86613712565b612b08906030613617565b60f81b818381518110612b1d57612b1d613580565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b57600a866136fe565b9450612adf565b60008060008351604114612bb45760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610a52565b50505060208101516040820151606090920151909260009190911a90565b73ffffffffffffffffffffffffffffffffffffffff8216612c355760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a52565b612c3e8161241d565b15612c8b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a52565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612ef7576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612da3903390899088908890600401613726565b6020604051808303816000875af1925050508015612dfc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612df99181019061376f565b60015b612eac573d808015612e2a576040519150601f19603f3d011682016040523d82523d6000602084013e612e2f565b606091505b508051612ea45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a52565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611ef7565b506001949350505050565b828054612f0e9061352c565b90600052602060002090601f016020900481019282612f305760008555612f76565b82601f10612f4957805160ff1916838001178555612f76565b82800160010185558215612f76579182015b82811115612f76578251825591602001919060010190612f5b565b506110779291505b808211156110775760008155600101612f7e565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611ff857600080fd5b600060208284031215612fd257600080fd5b8135611df781612f92565b60005b83811015612ff8578181015183820152602001612fe0565b83811115611a915750506000910152565b60008151808452613021816020860160208601612fdd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611df76020830184613009565b60006020828403121561307857600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611ff857600080fd5b600080604083850312156130b457600080fd5b82356130bf8161307f565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115613117576131176130cd565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561315d5761315d6130cd565b8160405280935085815286868601111561317657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126131a157600080fd5b611df7838335602085016130fc565b600080604083850312156131c357600080fd5b82356131ce8161307f565b9150602083013567ffffffffffffffff8111156131ea57600080fd5b6131f685828601613190565b9150509250929050565b60008060006060848603121561321557600080fd5b83356132208161307f565b925060208401356132308161307f565b929592945050506040919091013590565b60006020828403121561325357600080fd5b813567ffffffffffffffff81111561326a57600080fd5b8201601f8101841361327b57600080fd5b611ef7848235602084016130fc565b60006020828403121561329c57600080fd5b8135611df78161307f565b6020808252825182820181905260009190848201906040850190845b818110156132df578351835292840192918401916001016132c3565b50909695505050505050565b803580151581146132fb57600080fd5b919050565b60006020828403121561331257600080fd5b611df7826132eb565b6020808252825182820181905260009190848201906040850190845b818110156132df57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613337565b6000806040838503121561337c57600080fd5b82356133878161307f565b9150613395602084016132eb565b90509250929050565b600080600080608085870312156133b457600080fd5b84356133bf8161307f565b935060208501356133cf8161307f565b925060408501359150606085013567ffffffffffffffff8111156133f257600080fd5b6133fe87828801613190565b91505092959194509250565b60008083601f84011261341c57600080fd5b50813567ffffffffffffffff81111561343457600080fd5b6020830191508360208260051b850101111561344f57600080fd5b9250929050565b6000806000806040858703121561346c57600080fd5b843567ffffffffffffffff8082111561348457600080fd5b6134908883890161340a565b909650945060208701359150808211156134a957600080fd5b506134b68782880161340a565b95989497509550505050565b600080604083850312156134d557600080fd5b82356134e08161307f565b915060208301356134f08161307f565b809150509250929050565b6000806040838503121561350e57600080fd5b82359150602083013567ffffffffffffffff8111156131ea57600080fd5b600181811c9082168061354057607f821691505b6020821081141561357a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613610576136106135af565b5060010190565b6000821982111561362a5761362a6135af565b500190565b600082821015613641576136416135af565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561367e5761367e6135af565b500290565b60008351613695818460208801612fdd565b8351908301906136a9818360208801612fdd565b01949350505050565b6000602082840312156136c457600080fd5b8151611df78161307f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261370d5761370d6136cf565b500490565b600082613721576137216136cf565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526137656080830184613009565b9695505050505050565b60006020828403121561378157600080fd5b8151611df781612f9256fea26469706673582212201e8a8ab5b717d32ef48ab76170f593b2d69653b6d4ae510458eab8f9665b848864736f6c634300080a0033

Deployed Bytecode Sourcemap

1122:7586:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;191:301:3;;;;;;;;;;-1:-1:-1;191:301:3;;;;;:::i;:::-;;:::i;:::-;;;611:14:14;;604:22;586:41;;574:2;559:18;191:301:3;;;;;;;;2089:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2729:308::-;;;;;;;;;;-1:-1:-1;2729:308:4;;;;;:::i;:::-;;:::i;:::-;;;1809:42:14;1797:55;;;1779:74;;1767:2;1752:18;2729:308:4;1633:226:14;6783:116:13;;;;;;;;;;-1:-1:-1;6783:116:13;;;;;:::i;:::-;;:::i;:::-;;2309:412:4;;;;;;;;;;-1:-1:-1;2309:412:4;;;;;:::i;:::-;;:::i;7606:104:13:-;;;;;;;;;;-1:-1:-1;7681:21:13;7606:104;;;2489:25:14;;;2477:2;2462:18;7606:104:13;2343:177:14;1470:110:3;;;;;;;;;;-1:-1:-1;1558:7:3;:14;1470:110;;2861:364:13;;;;;;;;;;-1:-1:-1;2861:364:13;;;;;:::i;:::-;;:::i;6907:106::-;;;;;;;;;;-1:-1:-1;6907:106:13;;;;;:::i;:::-;;:::i;3602:376:4:-;;;;;;;;;;-1:-1:-1;3602:376:4;;;;;:::i;:::-;;:::i;500:504:3:-;;;;;;;;;;-1:-1:-1;500:504:3;;;;;:::i;:::-;;:::i;7929:273:13:-;;;:::i;1638:85::-;;;;;;;;;;;;1681:42;1638:85;;3986:185:4;;;;;;;;;;-1:-1:-1;3986:185:4;;;;;:::i;:::-;;:::i;1730:77:13:-;;;;;;;;;;;;;;;;1588:244:3;;;;;;;;;;-1:-1:-1;1588:244:3;;;;;:::i;:::-;;:::i;2425:120:13:-;;;;;;;;;;-1:-1:-1;1325:10:13;2499:15;:38;2425:120;;7021:104;;;;;;;;;;-1:-1:-1;7021:104:13;;;;;:::i;:::-;;:::i;1581:30::-;;;;;;;;;;-1:-1:-1;1581:30:13;;;;;;;;1844:53;;;;;;;;;;-1:-1:-1;1844:53:13;;;;;:::i;:::-;;;;;;;;;;;;;;1755:326:4;;;;;;;;;;-1:-1:-1;1755:326:4;;;;;:::i;:::-;;:::i;1223:21:13:-;;;;;;;;;;;;;:::i;1229:518:4:-;;;;;;;;;;-1:-1:-1;1229:518:4;;;;;:::i;:::-;;:::i;1661:101:10:-;;;;;;;;;;;;;:::i;1525:26:13:-;;;;;;;;;;;;;;;;1012:450:3;;;;;;;;;;-1:-1:-1;1012:450:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7499:99:13:-;;;;;;;;;;-1:-1:-1;7576:14:13;;7499:99;;7133:101;;;;;;;;;;-1:-1:-1;7133:101:13;;;;;:::i;:::-;;:::i;1029:85:10:-;;;;;;;;;;-1:-1:-1;1101:6:10;;;;1029:85;;7246:164:13;;;;;;;;;;-1:-1:-1;7246:164:13;;;;;:::i;:::-;;:::i;6685:90::-;;;;;;;;;;-1:-1:-1;6685:90:13;;;;;:::i;:::-;;:::i;3849:637::-;;;;;;:::i;:::-;;:::i;1278:57::-;;;;;;;;;;;;1325:10;1278:57;;2197:104:4;;;;;;;;;;;;;:::i;7718:121:13:-;;;;;;;;;;;;;:::i;1380:33::-;;;;;;;;;;;;;;;;763:95:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3045:327::-;;;;;;;;;;-1:-1:-1;3045:327:4;;;;;:::i;:::-;;:::i;4179:365::-;;;;;;;;;;-1:-1:-1;4179:365:4;;;;;:::i;:::-;;:::i;5466:864:13:-;;;;;;;;;;-1:-1:-1;5466:864:13;;;;;:::i;:::-;;:::i;6338:339::-;;;;;;;;;;-1:-1:-1;6338:339:13;;;;;:::i;:::-;;:::i;2069:80::-;;;;;;;;;;-1:-1:-1;2069:80:13;;;;;;;;1420:31;;;;;;;;;;;;;;;;8303:402;;;;;;;;;;-1:-1:-1;8303:402:13;;;;;:::i;:::-;;:::i;1911:198:10:-;;;;;;;;;;-1:-1:-1;1911:198:10;;;;;:::i;:::-;;:::i;2553:125:13:-;;;;;;;;;;-1:-1:-1;2645:25:13;;2627:15;:43;2553:125;;4520:898;;;;;;:::i;:::-;;:::i;2744:84::-;;;;;;;;;;-1:-1:-1;2815:5:13;;2744:84;;1458:29;;;;;;;;;;;;;;;;191:301:3;339:4;381:50;;;396:35;381:50;;:103;;;448:36;472:11;448:23;:36::i;:::-;361:123;191:301;-1:-1:-1;;191:301:3:o;2089:100:4:-;2143:13;2176:5;2169:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2089:100;:::o;2729:308::-;2850:7;2897:16;2905:7;2897;:16::i;:::-;2875:110;;;;-1:-1:-1;;;2875:110:4;;10505:2:14;2875:110:4;;;10487:21:14;10544:2;10524:18;;;10517:30;10583:34;10563:18;;;10556:62;10654:14;10634:18;;;10627:42;10686:19;;2875:110:4;;;;;;;;;-1:-1:-1;3005:24:4;;;;:15;:24;;;;;;;;;2729:308::o;6783:116:13:-;1101:6:10;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;6864:7:13::1;:27:::0;6783:116::o;2309:412:4:-;2390:13;2406:24;2422:7;2406:15;:24::i;:::-;2390:40;;2455:5;2449:11;;:2;:11;;;;2441:57;;;;-1:-1:-1;;;2441:57:4;;11279:2:14;2441:57:4;;;11261:21:14;11318:2;11298:18;;;11291:30;11357:34;11337:18;;;11330:62;11428:3;11408:18;;;11401:31;11449:19;;2441:57:4;11077:397:14;2441:57:4;719:10:1;2533:21:4;;;;;:62;;-1:-1:-1;2558:37:4;2575:5;719:10:1;8303:402:13;:::i;2558:37:4:-;2511:168;;;;-1:-1:-1;;;2511:168:4;;11681:2:14;2511:168:4;;;11663:21:14;11720:2;11700:18;;;11693:30;11759:34;11739:18;;;11732:62;11830:26;11810:18;;;11803:54;11874:19;;2511:168:4;11479:420:14;2511:168:4;2692:21;2701:2;2705:7;2692:8;:21::i;:::-;2379:342;2309:412;;:::o;2861:364:13:-;2992:22;;;12066:66:14;12053:2;12049:15;;;12045:88;2992:22:13;;;;12033:101:14;;;;2992:22:13;;;;;;;;;12150:12:14;;;2992:22:13;;2982:33;;;;;;12415:66:14;3067:65:13;;;12403:79:14;12498:12;;;;12491:28;;;3067:65:13;;;;;;;;;;12535:12:14;;;;3067:65:13;;;3057:76;;;;;-1:-1:-1;;2982:33:13;1681:42;3151:46;3057:76;3187:9;3151:13;:46::i;:::-;:66;;;;2861:364;-1:-1:-1;;;;;2861:364:13:o;6907:106::-;1101:6:10;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;6980:9:13::1;:25:::0;6907:106::o;3602:376:4:-;3811:41;719:10:1;3844:7:4;3811:18;:41::i;:::-;3789:140;;;;-1:-1:-1;;;3789:140:4;;12760:2:14;3789:140:4;;;12742:21:14;12799:2;12779:18;;;12772:30;12838:34;12818:18;;;12811:62;12909:19;12889:18;;;12882:47;12946:19;;3789:140:4;12558:413:14;3789:140:4;3942:28;3952:4;3958:2;3962:7;3942:9;:28::i;500:504:3:-;625:15;674:24;692:5;674:17;:24::i;:::-;666:5;:32;658:67;;;;-1:-1:-1;;;658:67:3;;13178:2:14;658:67:3;;;13160:21:14;13217:2;13197:18;;;13190:30;13256:24;13236:18;;;13229:52;13298:18;;658:67:3;12976:346:14;658:67:3;736:13;765:9;760:186;780:7;:14;776:18;;760:186;;;829:7;837:1;829:10;;;;;;;;:::i;:::-;;;;;;;;;;;;820:19;;;829:10;;820:19;816:119;;;873:5;864;:14;860:59;;;887:1;-1:-1:-1;880:8:3;;-1:-1:-1;880:8:3;860:59;912:7;;;:::i;:::-;;;860:59;796:3;;;:::i;:::-;;;760:186;;;-1:-1:-1;956:40:3;;-1:-1:-1;;;956:40:3;;13178:2:14;956:40:3;;;13160:21:14;13217:2;13197:18;;;13190:30;13256:24;13236:18;;;13229:52;13298:18;;956:40:3;12976:346:14;7929:273:13;1101:6:10;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;8050:64:13::1;::::0;7999:21:::1;::::0;7985:11:::1;::::0;8058:10:::1;::::0;7999:21;;7985:11;8050:64;7985:11;8050:64;7999:21;8058:10;8050:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8031:83;;;8133:7;8125:16;;;::::0;::::1;;8170:3;8152:14;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;7929:273:13:o;3986:185:4:-;4124:39;4141:4;4147:2;4151:7;4124:39;;;;;;;;;;;;:16;:39::i;1588:244:3:-;1708:7;1749:24;1558:7;:14;;1470:110;1749:24;1741:5;:32;1733:68;;;;-1:-1:-1;;;1733:68:3;;14450:2:14;1733:68:3;;;14432:21:14;14489:2;14469:18;;;14462:30;14528:25;14508:18;;;14501:53;14571:18;;1733:68:3;14248:347:14;1733:68:3;-1:-1:-1;1819:5:3;1588:244::o;7021:104:13:-;1101:6:10;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;7096:21:13;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;7021:104:::0;:::o;1755:326:4:-;1872:7;1897:13;1913:7;1921;1913:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;1962:19:4;1940:110;;;;-1:-1:-1;;;1940:110:4;;14802:2:14;1940:110:4;;;14784:21:14;14841:2;14821:18;;;14814:30;14880:34;14860:18;;;14853:62;14951:11;14931:18;;;14924:39;14980:19;;1940:110:4;14600:405:14;1223:21:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1229:518:4:-;1346:7;1393:19;;;1371:111;;;;-1:-1:-1;;;1371:111:4;;15212:2:14;1371:111:4;;;15194:21:14;15251:2;15231:18;;;15224:30;15290:34;15270:18;;;15263:62;15361:12;15341:18;;;15334:40;15391:19;;1371:111:4;15010:406:14;1371:111:4;1538:7;:14;1493:13;;;1563:130;1587:6;1583:1;:10;1563:130;;;1628:7;1636:1;1628:10;;;;;;;;:::i;:::-;;;;;;;;;;;;1619:19;;;1628:10;;1619:19;1615:67;;;1659:7;;;:::i;:::-;;;1615:67;1595:3;;;:::i;:::-;;;1563:130;;;-1:-1:-1;1734:5:4;;1229:518;-1:-1:-1;;;1229:518:4:o;1661:101:10:-;1101:6;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1012:450:3:-;1098:16;1144:24;1162:5;1144:17;:24::i;:::-;1140:1;:28;1132:63;;;;-1:-1:-1;;;1132:63:3;;13178:2:14;1132:63:3;;;13160:21:14;13217:2;13197:18;;;13190:30;13256:24;13236:18;;;13229:52;13298:18;;1132:63:3;12976:346:14;1132:63:3;1206:18;1227:16;1237:5;1227:9;:16::i;:::-;1206:37;;1254:25;1296:10;1282:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1282:25:3;;1254:53;;1323:9;1318:111;1342:10;1338:1;:14;1318:111;;;1388:29;1408:5;1415:1;1388:19;:29::i;:::-;1374:8;1383:1;1374:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;1354:3;;;;:::i;:::-;;;;1318:111;;;-1:-1:-1;1446:8:3;1012:450;-1:-1:-1;;;1012:450:3:o;7133:101:13:-;1101:6:10;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;7202:10:13::1;:24:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;7133:101::o;7246:164::-;1101:6:10;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;7348:25:13::1;:54:::0;7246:164::o;6685:90::-;1101:6:10;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;6750:5:13::1;:17:::0;6685:90::o;3849:637::-;1744:1:11;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:11;;15623:2:14;2317:63:11;;;15605:21:14;15662:2;15642:18;;;15635:30;15701:33;15681:18;;;15674:61;15752:18;;2317:63:11;15421:355:14;2317:63:11;1744:1;2455:7;:18;3953:25:13::1;::::0;3935:15:::1;:43;3927:83;;;::::0;-1:-1:-1;;;3927:83:13;;15983:2:14;3927:83:13::1;::::0;::::1;15965:21:14::0;16022:2;16002:18;;;15995:30;16061:29;16041:18;;;16034:57;16108:18;;3927:83:13::1;15781:351:14::0;3927:83:13::1;4033:7;:14:::0;4067:10:::1;::::0;::::1;;4066:11;4058:35;;;::::0;-1:-1:-1;;;4058:35:13;;16339:2:14;4058:35:13::1;::::0;::::1;16321:21:14::0;16378:2;16358:18;;;16351:30;16417:13;16397:18;;;16390:41;16448:18;;4058:35:13::1;16137:335:14::0;4058:35:13::1;4127:1;4112:12;:16;:43;;;;;4148:7;;4132:12;:23;;4112:43;4104:76;;;::::0;-1:-1:-1;;;4104:76:13;;16679:2:14;4104:76:13::1;::::0;::::1;16661:21:14::0;16718:2;16698:18;;;16691:30;16757:22;16737:18;;;16730:50;16797:18;;4104:76:13::1;16477:344:14::0;4104:76:13::1;4234:8;;4222:9;;:20;;;;:::i;:::-;4200:16;4204:12:::0;4200:1;:16:::1;:::i;:::-;4199:44;;4191:75;;;::::0;-1:-1:-1;;;4191:75:13;;17158:2:14;4191:75:13::1;::::0;::::1;17140:21:14::0;17197:2;17177:18;;;17170:30;17236:20;17216:18;;;17209:48;17274:18;;4191:75:13::1;16956:342:14::0;4191:75:13::1;4306:12;4298:5;;:20;;;;:::i;:::-;4285:9;:33;;4277:60;;;::::0;-1:-1:-1;;;4277:60:13;;17738:2:14;4277:60:13::1;::::0;::::1;17720:21:14::0;17777:2;17757:18;;;17750:30;17816:16;17796:18;;;17789:44;17850:18;;4277:60:13::1;17536:338:14::0;4277:60:13::1;4363:9;4358:102;4382:12;4378:1;:16;4358:102;;;4416:32;4426:10;4438:5;4442:1:::0;4438;:5:::1;:::i;:::-;4416:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;4396:3;::::0;::::1;:::i;:::-;;;4358:102;;;-1:-1:-1::0;;1701:1:11;2628:7;:22;-1:-1:-1;3849:637:13:o;2197:104:4:-;2253:13;2286:7;2279:14;;;;;:::i;7718:121:13:-;7765:7;7681:21;7576:14;;7792:39;;;;:::i;:::-;7785:46;;7718:121;:::o;763:95:4:-;807:16;843:7;836:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;763:95;:::o;3045:327::-;3180:24;;;719:10:1;3180:24:4;;3172:62;;;;-1:-1:-1;;;3172:62:4;;18081:2:14;3172:62:4;;;18063:21:14;18120:2;18100:18;;;18093:30;18159:27;18139:18;;;18132:55;18204:18;;3172:62:4;17879:349:14;3172:62:4;719:10:1;3247:32:4;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;3316:48;;586:41:14;;;3247:42:4;;719:10:1;3316:48:4;;559:18:14;3316:48:4;;;;;;;3045:327;;:::o;4179:365::-;4368:41;719:10:1;4401:7:4;4368:18;:41::i;:::-;4346:140;;;;-1:-1:-1;;;4346:140:4;;12760:2:14;4346:140:4;;;12742:21:14;12799:2;12779:18;;;12772:30;12838:34;12818:18;;;12811:62;12909:19;12889:18;;;12882:47;12946:19;;4346:140:4;12558:413:14;4346:140:4;4497:39;4511:4;4517:2;4521:7;4530:5;4497:13;:39::i;:::-;4179:365;;;;:::o;5466:864:13:-;1101:6:10;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;5580:35:13;;::::1;5572:99;;;::::0;-1:-1:-1;;;5572:99:13;;18435:2:14;5572:99:13::1;::::0;::::1;18417:21:14::0;18474:2;18454:18;;;18447:30;18513:34;18493:18;;;18486:62;18584:21;18564:18;;;18557:49;18623:19;;5572:99:13::1;18233:415:14::0;5572:99:13::1;5730:7;:14:::0;5682:21:::1;::::0;;5755:101:::1;5775:19:::0;;::::1;5755:101;;;5833:8;;5842:1;5833:11;;;;;;;:::i;:::-;;;;;;;5816:28;;;;;:::i;:::-;::::0;-1:-1:-1;5796:3:13::1;::::0;::::1;:::i;:::-;;;5755:101;;;-1:-1:-1::0;5895:9:13::1;::::0;5874:17:::1;5878:13:::0;5874:1;:17:::1;:::i;:::-;:30;;5866:61;;;::::0;-1:-1:-1;;;5866:61:13;;17158:2:14;5866:61:13::1;::::0;::::1;17140:21:14::0;17197:2;17177:18;;;17170:30;17236:20;17216:18;;;17209:48;17274:18;;5866:61:13::1;16956:342:14::0;5866:61:13::1;5963:8;;5946:13;:25;;5938:58;;;::::0;-1:-1:-1;;;5938:58:13;;18855:2:14;5938:58:13::1;::::0;::::1;18837:21:14::0;18894:2;18874:18;;;18867:30;18933:22;18913:18;;;18906:50;18973:18;;5938:58:13::1;18653:344:14::0;5938:58:13::1;6065:13;6053:8;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;6091:20:13::1;::::0;-1:-1:-1;6091:20:13;;-1:-1:-1;6122:182:13::1;6142:20:::0;;::::1;6122:182;;;6189:9;6184:109;6208:8;;6217:1;6208:11;;;;;;;:::i;:::-;;;;;;;6204:1;:15;6184:109;;;6245:32;6255:9;;6265:1;6255:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6269:3:::0;::::1;::::0;::::1;:::i;:::-;;;6245:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;6221:3;::::0;::::1;:::i;:::-;;;6184:109;;;-1:-1:-1::0;6164:3:13::1;::::0;::::1;:::i;:::-;;;6122:182;;;-1:-1:-1::0;;;;;;;5466:864:13:o;6338:339::-;6411:13;6445:16;6453:7;6445;:16::i;:::-;6437:62;;;;-1:-1:-1;;;6437:62:13;;19204:2:14;6437:62:13;;;19186:21:14;19243:2;19223:18;;;19216:30;19282:34;19262:18;;;19255:62;19353:3;19333:18;;;19326:31;19374:19;;6437:62:13;19002:397:14;6437:62:13;6510:28;6541:10;:8;:10::i;:::-;6510:41;;6600:1;6575:14;6569:28;:32;:100;;;;;;;;;;;;;;;;;6628:14;6644:18;:7;:16;:18::i;:::-;6611:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6569:100;6562:107;6338:339;-1:-1:-1;;;6338:339:13:o;8303:402::-;8516:20;;8560:28;;;;;8516:20;1797:55:14;;;8560:28:13;;;1779:74:14;8392:4:13;;8516:20;;;8552:49;;;;8516:20;;8560:21;;1752:18:14;;8560:28:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8552:49;;;8548:93;;;8625:4;8618:11;;;;;8548:93;3551:25:4;;;;3522:4;3551:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8658:39:13;8651:46;8303:402;-1:-1:-1;;;;8303:402:13:o;1911:198:10:-;1101:6;;1241:23;1101:6;719:10:1;1241:23:10;1233:68;;;;-1:-1:-1;;;1233:68:10;;10918:2:14;1233:68:10;;;10900:21:14;;;10937:18;;;10930:30;10996:34;10976:18;;;10969:62;11048:18;;1233:68:10;10716:356:14;1233:68:10;1999:22:::1;::::0;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:10;;20366:2:14;1991:73:10::1;::::0;::::1;20348:21:14::0;20405:2;20385:18;;;20378:30;20444:34;20424:18;;;20417:62;20515:8;20495:18;;;20488:36;20541:19;;1991:73:10::1;20164:402:14::0;1991:73:10::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;4520:898:13:-;1744:1:11;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:11;;15623:2:14;2317:63:11;;;15605:21:14;15662:2;15642:18;;;15635:30;15701:33;15681:18;;;15674:61;15752:18;;2317:63:11;15421:355:14;2317:63:11;1744:1;2455:7;:18;1325:10:13::1;4639:15;:38;4631:71;;;::::0;-1:-1:-1;;;4631:71:13;;20773:2:14;4631:71:13::1;::::0;::::1;20755:21:14::0;20812:2;20792:18;;;20785:30;20851:22;20831:18;;;20824:50;20891:18;;4631:71:13::1;20571:344:14::0;4631:71:13::1;4725:7;:14:::0;4759:10:::1;::::0;::::1;;4758:11;4750:35;;;::::0;-1:-1:-1;;;4750:35:13;;16339:2:14;4750:35:13::1;::::0;::::1;16321:21:14::0;16378:2;16358:18;;;16351:30;16417:13;16397:18;;;16390:41;16448:18;;4750:35:13::1;16137:335:14::0;4750:35:13::1;4819:1;4804:12;:16;:43;;;;;4840:7;;4824:12;:23;;4804:43;4796:76;;;::::0;-1:-1:-1;;;4796:76:13;;16679:2:14;4796:76:13::1;::::0;::::1;16661:21:14::0;16718:2;16698:18;;;16691:30;16757:22;16737:18;;;16730:50;16797:18;;4796:76:13::1;16477:344:14::0;4796:76:13::1;4926:8;;4914:9;;:20;;;;:::i;:::-;4892:16;4896:12:::0;4892:1;:16:::1;:::i;:::-;4891:44;;4883:75;;;::::0;-1:-1:-1;;;4883:75:13;;17158:2:14;4883:75:13::1;::::0;::::1;17140:21:14::0;17197:2;17177:18;;;17170:30;17236:20;17216:18;;;17209:48;17274:18;;4883:75:13::1;16956:342:14::0;4883:75:13::1;4998:12;4990:5;;:20;;;;:::i;:::-;4977:9;:33;;4969:60;;;::::0;-1:-1:-1;;;4969:60:13;;17738:2:14;4969:60:13::1;::::0;::::1;17720:21:14::0;17777:2;17757:18;;;17750:30;17816:16;17796:18;;;17789:44;17850:18;;4969:60:13::1;17536:338:14::0;4969:60:13::1;5097:7;::::0;5067:10:::1;5048:30;::::0;;;:18:::1;:30;::::0;;;;;:45:::1;::::0;5081:12;;5048:45:::1;:::i;:::-;:56;;5040:97;;;::::0;-1:-1:-1;;;5040:97:13;;21122:2:14;5040:97:13::1;::::0;::::1;21104:21:14::0;21161:2;21141:18;;;21134:30;21200;21180:18;;;21173:58;21248:18;;5040:97:13::1;20920:352:14::0;5040:97:13::1;5156:36;5170:10;5182:9;5156:13;:36::i;:::-;5148:72;;;::::0;-1:-1:-1;;;5148:72:13;;21479:2:14;5148:72:13::1;::::0;::::1;21461:21:14::0;21518:2;21498:18;;;21491:30;21557:25;21537:18;;;21530:53;21600:18;;5148:72:13::1;21277:347:14::0;5148:72:13::1;5252:10;5233:30;::::0;;;:18:::1;:30;::::0;;;;:46;;5267:12;;5233:30;:46:::1;::::0;5267:12;;5233:46:::1;:::i;:::-;::::0;;;-1:-1:-1;5295:9:13::1;::::0;-1:-1:-1;5290:102:13::1;5314:12;5310:1;:16;5290:102;;;5348:32;5358:10;5370:5;5374:1:::0;5370;:5:::1;:::i;5348:32::-;5328:3;::::0;::::1;:::i;:::-;;;5290:102;;;-1:-1:-1::0;;1701:1:11;2628:7;:22;-1:-1:-1;;4520:898:13:o;866:355:4:-;1013:4;1055:40;;;1070:25;1055:40;;:105;;-1:-1:-1;1112:48:4;;;1127:33;1112:48;1055:105;:158;;;-1:-1:-1;952:25:2;937:40;;;;1177:36:4;829:155:2;4912::4;5011:7;:14;4977:4;;5001:24;;:58;;;;;5057:1;5029:30;;:7;5037;5029:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;:30;;4994:65;4912:155;-1:-1:-1;;4912:155:4:o;7240:175::-;7315:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;7369;7315;7369:15;:24::i;:::-;7360:47;;;;;;;;;;;;7240:175;;:::o;3237:248:13:-;3338:7;3359:9;3370;3381:7;3392:26;3407:10;3392:14;:26::i;:::-;3436:41;;;;;;;;;;;;21856:25:14;;;21929:4;21917:17;;21897:18;;;21890:45;;;;21951:18;;;21944:34;;;21994:18;;;21987:34;;;3358:60:13;;-1:-1:-1;3358:60:13;;-1:-1:-1;3358:60:13;-1:-1:-1;3436:41:13;;21828:19:14;;3436:41:13;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3436:41:13;;;;;;3237:248;-1:-1:-1;;;;;;;3237:248:13:o;5075:453:4:-;5204:4;5248:16;5256:7;5248;:16::i;:::-;5226:110;;;;-1:-1:-1;;;5226:110:4;;22234:2:14;5226:110:4;;;22216:21:14;22273:2;22253:18;;;22246:30;22312:34;22292:18;;;22285:62;22383:14;22363:18;;;22356:42;22415:19;;5226:110:4;22032:408:14;5226:110:4;5347:13;5363:24;5379:7;5363:15;:24::i;:::-;5347:40;;5417:5;5406:16;;:7;:16;;;:64;;;;5463:7;5439:31;;:20;5451:7;5439:11;:20::i;:::-;:31;;;5406:64;:113;;;;5487:32;5504:5;5511:7;5487:16;:32::i;6678:554::-;6852:4;6824:32;;:24;6840:7;6824:15;:24::i;:::-;:32;;;6802:123;;;;-1:-1:-1;;;6802:123:4;;22647:2:14;6802:123:4;;;22629:21:14;22686:2;22666:18;;;22659:30;22725:34;22705:18;;;22698:62;22796:11;22776:18;;;22769:39;22825:19;;6802:123:4;22445:405:14;6802:123:4;6944:16;;;6936:65;;;;-1:-1:-1;;;6936:65:4;;23057:2:14;6936:65:4;;;23039:21:14;23096:2;23076:18;;;23069:30;23135:34;23115:18;;;23108:62;23206:6;23186:18;;;23179:34;23230:19;;6936:65:4;22855:400:14;6936:65:4;7118:29;7135:1;7139:7;7118:8;:29::i;:::-;7177:2;7158:7;7166;7158:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;;;;;;;7197:27;;7216:7;;7197:27;;;;;;;;;;7158:16;7197:27;6678:554;;;:::o;2263:187:10:-;2355:6;;;;2371:17;;;;;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;5654:321:4:-;5784:18;5790:2;5794:7;5784:5;:18::i;:::-;5835:54;5866:1;5870:2;5874:7;5883:5;5835:22;:54::i;:::-;5813:154;;;;-1:-1:-1;;;5813:154:4;;23462:2:14;5813:154:4;;;23444:21:14;23501:2;23481:18;;;23474:30;23540:34;23520:18;;;23513:62;23611:20;23591:18;;;23584:48;23649:19;;5813:154:4;23260:414:14;4552:352:4;4709:28;4719:4;4725:2;4729:7;4709:9;:28::i;:::-;4770:48;4793:4;4799:2;4803:7;4812:5;4770:22;:48::i;:::-;4748:148;;;;-1:-1:-1;;;4748:148:4;;23462:2:14;4748:148:4;;;23444:21:14;23501:2;23481:18;;;23474:30;23540:34;23520:18;;;23513:62;23611:20;23591:18;;;23584:48;23649:19;;4748:148:4;23260:414:14;2314:99:13;2365:13;2398:7;2391:14;;;;;:::i;328:703:12:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:12;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:12;;-1:-1:-1;773:2:12;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:12;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:12;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:12;981:2;972:11;;:::i;:::-;;;844:150;;3497:321:13;3561:9;3572;3583:7;3611:3;:10;3625:2;3611:16;3603:53;;;;-1:-1:-1;;;3603:53:13;;24312:2:14;3603:53:13;;;24294:21:14;24351:2;24331:18;;;24324:30;24390:26;24370:18;;;24363:54;24434:18;;3603:53:13;24110:348:14;3603:53:13;-1:-1:-1;;;3711:2:13;3702:12;;3696:19;3749:2;3740:12;;3734:19;3795:2;3786:12;;;3780:19;3696;;3777:1;3772:28;;;;;3497:321::o;5983:346:4:-;6063:16;;;6055:61;;;;-1:-1:-1;;;6055:61:4;;24665:2:14;6055:61:4;;;24647:21:14;;;24684:18;;;24677:30;24743:34;24723:18;;;24716:62;24795:18;;6055:61:4;24463:356:14;6055:61:4;6136:16;6144:7;6136;:16::i;:::-;6135:17;6127:58;;;;-1:-1:-1;;;6127:58:4;;25026:2:14;6127:58:4;;;25008:21:14;25065:2;25045:18;;;25038:30;25104;25084:18;;;25077:58;25152:18;;6127:58:4;24824:352:14;6127:58:4;6254:7;:16;;;;;;;-1:-1:-1;6254:16:4;;;;;;;;;;;;;;;;;;6288:33;;6313:7;;-1:-1:-1;6288:33:4;;-1:-1:-1;;6288:33:4;5983:346;;:::o;7423:980::-;7578:4;7599:13;;;1087:20:0;1133:8;7595:801:4;;7652:175;;;;;:36;;;;;;:175;;719:10:1;;7746:4:4;;7773:7;;7803:5;;7652:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7652:175:4;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;7631:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8010:13:4;;8006:320;;8053:108;;-1:-1:-1;;;8053:108:4;;23462:2:14;8053:108:4;;;23444:21:14;23501:2;23481:18;;;23474:30;23540:34;23520:18;;;23513:62;23611:20;23591:18;;;23584:48;23649:19;;8053:108:4;23260:414:14;8006:320:4;8276:6;8270:13;8261:6;8257:2;8253:15;8246:38;7631:710;7891:51;;7901:41;7891:51;;-1:-1:-1;7884:58:4;;7595:801;-1:-1:-1;8380:4:4;7423:980;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:14;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:14;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:14:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:14;;1448:180;-1:-1:-1;1448:180:14:o;1864:154::-;1950:42;1943:5;1939:54;1932:5;1929:65;1919:93;;2008:1;2005;1998:12;2023:315;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:14:o;2525:184::-;2577:77;2574:1;2567:88;2674:4;2671:1;2664:15;2698:4;2695:1;2688:15;2714:690;2778:5;2808:18;2849:2;2841:6;2838:14;2835:40;;;2855:18;;:::i;:::-;2989:2;2983:9;3055:2;3043:15;;2894:66;3039:24;;;3065:2;3035:33;3031:42;3019:55;;;3089:18;;;3109:22;;;3086:46;3083:72;;;3135:18;;:::i;:::-;3175:10;3171:2;3164:22;3204:6;3195:15;;3234:6;3226;3219:22;3274:3;3265:6;3260:3;3256:16;3253:25;3250:45;;;3291:1;3288;3281:12;3250:45;3341:6;3336:3;3329:4;3321:6;3317:17;3304:44;3396:1;3389:4;3380:6;3372;3368:19;3364:30;3357:41;;;;2714:690;;;;;:::o;3409:220::-;3451:5;3504:3;3497:4;3489:6;3485:17;3481:27;3471:55;;3522:1;3519;3512:12;3471:55;3544:79;3619:3;3610:6;3597:20;3590:4;3582:6;3578:17;3544:79;:::i;3634:455::-;3711:6;3719;3772:2;3760:9;3751:7;3747:23;3743:32;3740:52;;;3788:1;3785;3778:12;3740:52;3827:9;3814:23;3846:31;3871:5;3846:31;:::i;:::-;3896:5;-1:-1:-1;3952:2:14;3937:18;;3924:32;3979:18;3968:30;;3965:50;;;4011:1;4008;4001:12;3965:50;4034:49;4075:7;4066:6;4055:9;4051:22;4034:49;:::i;:::-;4024:59;;;3634:455;;;;;:::o;4094:456::-;4171:6;4179;4187;4240:2;4228:9;4219:7;4215:23;4211:32;4208:52;;;4256:1;4253;4246:12;4208:52;4295:9;4282:23;4314:31;4339:5;4314:31;:::i;:::-;4364:5;-1:-1:-1;4421:2:14;4406:18;;4393:32;4434:33;4393:32;4434:33;:::i;:::-;4094:456;;4486:7;;-1:-1:-1;;;4540:2:14;4525:18;;;;4512:32;;4094:456::o;4555:450::-;4624:6;4677:2;4665:9;4656:7;4652:23;4648:32;4645:52;;;4693:1;4690;4683:12;4645:52;4733:9;4720:23;4766:18;4758:6;4755:30;4752:50;;;4798:1;4795;4788:12;4752:50;4821:22;;4874:4;4866:13;;4862:27;-1:-1:-1;4852:55:14;;4903:1;4900;4893:12;4852:55;4926:73;4991:7;4986:2;4973:16;4968:2;4964;4960:11;4926:73;:::i;5010:247::-;5069:6;5122:2;5110:9;5101:7;5097:23;5093:32;5090:52;;;5138:1;5135;5128:12;5090:52;5177:9;5164:23;5196:31;5221:5;5196:31;:::i;5262:632::-;5433:2;5485:21;;;5555:13;;5458:18;;;5577:22;;;5404:4;;5433:2;5656:15;;;;5630:2;5615:18;;;5404:4;5699:169;5713:6;5710:1;5707:13;5699:169;;;5774:13;;5762:26;;5843:15;;;;5808:12;;;;5735:1;5728:9;5699:169;;;-1:-1:-1;5885:3:14;;5262:632;-1:-1:-1;;;;;;5262:632:14:o;5899:160::-;5964:20;;6020:13;;6013:21;6003:32;;5993:60;;6049:1;6046;6039:12;5993:60;5899:160;;;:::o;6064:180::-;6120:6;6173:2;6161:9;6152:7;6148:23;6144:32;6141:52;;;6189:1;6186;6179:12;6141:52;6212:26;6228:9;6212:26;:::i;6249:681::-;6420:2;6472:21;;;6542:13;;6445:18;;;6564:22;;;6391:4;;6420:2;6643:15;;;;6617:2;6602:18;;;6391:4;6686:218;6700:6;6697:1;6694:13;6686:218;;;6765:13;;6780:42;6761:62;6749:75;;6879:15;;;;6844:12;;;;6722:1;6715:9;6686:218;;6935:315;7000:6;7008;7061:2;7049:9;7040:7;7036:23;7032:32;7029:52;;;7077:1;7074;7067:12;7029:52;7116:9;7103:23;7135:31;7160:5;7135:31;:::i;:::-;7185:5;-1:-1:-1;7209:35:14;7240:2;7225:18;;7209:35;:::i;:::-;7199:45;;6935:315;;;;;:::o;7255:665::-;7350:6;7358;7366;7374;7427:3;7415:9;7406:7;7402:23;7398:33;7395:53;;;7444:1;7441;7434:12;7395:53;7483:9;7470:23;7502:31;7527:5;7502:31;:::i;:::-;7552:5;-1:-1:-1;7609:2:14;7594:18;;7581:32;7622:33;7581:32;7622:33;:::i;:::-;7674:7;-1:-1:-1;7728:2:14;7713:18;;7700:32;;-1:-1:-1;7783:2:14;7768:18;;7755:32;7810:18;7799:30;;7796:50;;;7842:1;7839;7832:12;7796:50;7865:49;7906:7;7897:6;7886:9;7882:22;7865:49;:::i;:::-;7855:59;;;7255:665;;;;;;;:::o;7925:367::-;7988:8;7998:6;8052:3;8045:4;8037:6;8033:17;8029:27;8019:55;;8070:1;8067;8060:12;8019:55;-1:-1:-1;8093:20:14;;8136:18;8125:30;;8122:50;;;8168:1;8165;8158:12;8122:50;8205:4;8197:6;8193:17;8181:29;;8265:3;8258:4;8248:6;8245:1;8241:14;8233:6;8229:27;8225:38;8222:47;8219:67;;;8282:1;8279;8272:12;8219:67;7925:367;;;;;:::o;8297:773::-;8419:6;8427;8435;8443;8496:2;8484:9;8475:7;8471:23;8467:32;8464:52;;;8512:1;8509;8502:12;8464:52;8552:9;8539:23;8581:18;8622:2;8614:6;8611:14;8608:34;;;8638:1;8635;8628:12;8608:34;8677:70;8739:7;8730:6;8719:9;8715:22;8677:70;:::i;:::-;8766:8;;-1:-1:-1;8651:96:14;-1:-1:-1;8854:2:14;8839:18;;8826:32;;-1:-1:-1;8870:16:14;;;8867:36;;;8899:1;8896;8889:12;8867:36;;8938:72;9002:7;8991:8;8980:9;8976:24;8938:72;:::i;:::-;8297:773;;;;-1:-1:-1;9029:8:14;-1:-1:-1;;;;8297:773:14:o;9075:388::-;9143:6;9151;9204:2;9192:9;9183:7;9179:23;9175:32;9172:52;;;9220:1;9217;9210:12;9172:52;9259:9;9246:23;9278:31;9303:5;9278:31;:::i;:::-;9328:5;-1:-1:-1;9385:2:14;9370:18;;9357:32;9398:33;9357:32;9398:33;:::i;:::-;9450:7;9440:17;;;9075:388;;;;;:::o;9468:::-;9545:6;9553;9606:2;9594:9;9585:7;9581:23;9577:32;9574:52;;;9622:1;9619;9612:12;9574:52;9658:9;9645:23;9635:33;;9719:2;9708:9;9704:18;9691:32;9746:18;9738:6;9735:30;9732:50;;;9778:1;9775;9768:12;9861:437;9940:1;9936:12;;;;9983;;;10004:61;;10058:4;10050:6;10046:17;10036:27;;10004:61;10111:2;10103:6;10100:14;10080:18;10077:38;10074:218;;;10148:77;10145:1;10138:88;10249:4;10246:1;10239:15;10277:4;10274:1;10267:15;10074:218;;9861:437;;;:::o;13327:184::-;13379:77;13376:1;13369:88;13476:4;13473:1;13466:15;13500:4;13497:1;13490:15;13516:184;13568:77;13565:1;13558:88;13665:4;13662:1;13655:15;13689:4;13686:1;13679:15;13705:195;13744:3;13775:66;13768:5;13765:77;13762:103;;;13845:18;;:::i;:::-;-1:-1:-1;13892:1:14;13881:13;;13705:195::o;14115:128::-;14155:3;14186:1;14182:6;14179:1;14176:13;14173:39;;;14192:18;;:::i;:::-;-1:-1:-1;14228:9:14;;14115:128::o;16826:125::-;16866:4;16894:1;16891;16888:8;16885:34;;;16899:18;;:::i;:::-;-1:-1:-1;16936:9:14;;16826:125::o;17303:228::-;17343:7;17469:1;17401:66;17397:74;17394:1;17391:81;17386:1;17379:9;17372:17;17368:105;17365:131;;;17476:18;;:::i;:::-;-1:-1:-1;17516:9:14;;17303:228::o;19404:470::-;19583:3;19621:6;19615:13;19637:53;19683:6;19678:3;19671:4;19663:6;19659:17;19637:53;:::i;:::-;19753:13;;19712:16;;;;19775:57;19753:13;19712:16;19809:4;19797:17;;19775:57;:::i;:::-;19848:20;;19404:470;-1:-1:-1;;;;19404:470:14:o;19879:280::-;19978:6;20031:2;20019:9;20010:7;20006:23;20002:32;19999:52;;;20047:1;20044;20037:12;19999:52;20079:9;20073:16;20098:31;20123:5;20098:31;:::i;23679:184::-;23731:77;23728:1;23721:88;23828:4;23825:1;23818:15;23852:4;23849:1;23842:15;23868:120;23908:1;23934;23924:35;;23939:18;;:::i;:::-;-1:-1:-1;23973:9:14;;23868:120::o;23993:112::-;24025:1;24051;24041:35;;24056:18;;:::i;:::-;-1:-1:-1;24090:9:14;;23993:112::o;25181:512::-;25375:4;25404:42;25485:2;25477:6;25473:15;25462:9;25455:34;25537:2;25529:6;25525:15;25520:2;25509:9;25505:18;25498:43;;25577:6;25572:2;25561:9;25557:18;25550:34;25620:3;25615:2;25604:9;25600:18;25593:31;25641:46;25682:3;25671:9;25667:19;25659:6;25641:46;:::i;:::-;25633:54;25181:512;-1:-1:-1;;;;;;25181:512:14:o;25698:249::-;25767:6;25820:2;25808:9;25799:7;25795:23;25791:32;25788:52;;;25836:1;25833;25826:12;25788:52;25868:9;25862:16;25887:30;25911:5;25887:30;:::i

Swarm Source

ipfs://1e8a8ab5b717d32ef48ab76170f593b2d69653b6d4ae510458eab8f9665b8488
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.