ETH Price: $2,376.00 (+0.29%)

Token

Koalaverse: Chummies (CHUMMIES)
 

Overview

Max Total Supply

1,783 CHUMMIES

Holders

141

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
truebreadwinner.eth
Balance
10 CHUMMIES
0xa8e34abad1d5feb4c8222c3966a59872f227ef02
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Chummies

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 13: Chummies.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "./ERC721A.sol";
import "./OwnableWithAdmin.sol";
import "./Strings.sol";
import "./IHappyKoalas.sol";

contract Chummies is ERC721A, OwnableWithAdmin {
    using Strings for uint256;

    uint256 public constant TOTAL_MAX = 4444;

    uint256 public maxPerPublicWallet = 10;
    uint256 public freeMaxTotal = 1200;

    uint256 public publicPrice = 0.007 ether; 

    uint256 freeClaimCount;
    mapping(address => uint256) public addressClaimAmount;

    IHappyKoalas public happyKoalas; // Happy Koalas (AKA Koalaverse: Genesis) holders are guaranteed free mints
    bool[369] public reserveClaimed; // save gas for claimers

    string public baseURI;
    string public baseExtension;

    bool public saleIsActive;
    bool public reserveFunctionRun;
    event SaleStateChanged(bool isActive);

    constructor(address _happyKoalas) ERC721A("Koalaverse: Chummies", "CHUMMIES") {
        happyKoalas = IHappyKoalas(_happyKoalas);
    }

    /* Founder Mint */
    function ownerMint(address _addr, uint256 _qty) external onlyOwnerOrAdmin {
        _mint(_addr, _qty);
    }

    /* Reserve Claim */
    function reserveClaim() external onlyOwnerOrAdmin {
        require(!reserveFunctionRun, "Reserve already claimed");
        for(uint i; i < 41; i++) {
            _mint(address(this), 9);
        }
        reserveFunctionRun = true;
    }
    /*
    * Mint function
    * @notice if you have not claimed a free, subtract .007 ether
    */
    function mintFree(uint256 _quantity) external payable whenSaleIsActive {
        require(totalSupply() < TOTAL_MAX, "Soldout");
        require(freeClaimCount + _quantity < freeMaxTotal, "Sorry, no more freebies available, sorry");
        require(_quantity > 0, "_quantity must be above 0");
        uint256 _addressClaimAmount = addressClaimAmount[msg.sender];
        require(_addressClaimAmount + _quantity <= maxPerPublicWallet, "You are trying to claim more than your allotment");        
        freeClaimCount += _quantity;
        addressClaimAmount[msg.sender] += _quantity;
        _mint(msg.sender, _quantity);
    }


    function mint(uint256 _quantity) external payable whenSaleIsActive {
        require(totalSupply() + _quantity <= TOTAL_MAX, "Soldout"); // always first to save users gas if tx fails
        require(_quantity > 0 && _quantity <= maxPerPublicWallet, "_quantity must be above 0 and below max.");
        require(msg.value >= publicPrice * _quantity, "Incorrect amount of ETH");
        _mint(msg.sender, _quantity);
    }

    function claimReserves(uint256[] calldata _tokenIds) external { 
        require(happyKoalas.isOwnerOf(msg.sender, _tokenIds), "Atleast 1 of those ID's is not your token to claim");
        for(uint i; i < _tokenIds.length; i++) {
            require(!reserveClaimed[_tokenIds[i]], "Atleast 1 of those ID's have already been claimed");  
            reserveClaimed[_tokenIds[i]] = true;
            unchecked {
                _addressData[address(this)].balance -= 1;
                _addressData[msg.sender].balance += 1;

                TokenOwnership storage currSlot = _ownerships[_tokenIds[i]];
                currSlot.addr = msg.sender;
                currSlot.startTimestamp = uint64(block.timestamp);

                // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
                // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
                uint256 nextTokenId = _tokenIds[i] + 1;
                TokenOwnership storage nextSlot = _ownerships[nextTokenId];
                if (nextSlot.addr == address(0)) {
                    // This will suffice for checking _exists(nextTokenId),
                    // as a burned slot cannot contain the zero address.
                    if (nextTokenId != _currentIndex) {
                        nextSlot.addr = address(this);
                    }
                }
            }
        emit Transfer(address(this), msg.sender, _tokenIds[i]);
        }
    }

    modifier whenSaleIsActive() {
        require(saleIsActive, "The sale is not active");
        _;
    }

    function setSaleIsActive(bool _intended) external onlyOwnerOrAdmin {
        require(saleIsActive != _intended, "This is already the value");
        saleIsActive = _intended;
        emit SaleStateChanged(_intended);
    }

    /**
     * @notice set base URI
     */
    function setBaseURI(string calldata _baseURI) external onlyOwnerOrAdmin {
        baseURI = _baseURI;
    }

    /**
     * @notice set base extension
     */
    function setBaseExtension(string calldata _baseExtension) external onlyOwnerOrAdmin {
        baseExtension = _baseExtension;
    }

    /**
     * @notice set public sale price in wei
     */
    function setPrice(uint256 _newPrice) external onlyOwnerOrAdmin {
        publicPrice = _newPrice;
    }

    /**
     * @notice set free claim total
     */
    function setFreeMaxTotal(uint256 _newFreeMaxTotal) external onlyOwnerOrAdmin { 
        freeMaxTotal = _newFreeMaxTotal;
    }

    // GETTERS

    function getFreeAmountLeft() external view returns (uint256) {
        return freeMaxTotal - freeClaimCount;
    }
 
    function getAmountClaimedPublic(address _user) external view returns (uint256) {
        return addressClaimAmount[_user];
    }

    /**
     * @notice token URI
     */
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "Cannot query non-existent token");
        return string(abi.encodePacked(baseURI, _tokenId.toString(), baseExtension));
    }

    address public  founderAddr   =   0xc03f5D2725f1bB7bD599B9FFbA5a16f4A41b459B;
    address public  superdevAddr  =   0x4E9f7618F72F3d497f4e252eBB6a731d715e7af5; //B5
    address public  frontendDev   =   0xB4057C08C729ed8810de0C2a15e74390dD78b09C; //BM
    address public  adminAddr     =   0x07c47A72c65ce8A37622Ea8B15765dAD60163120;
    address public  communityLead =   0x28f0aa00b1659f6a88b0cd8C19230f13bfD932d2;
    address public  tAddr         =   0x32E7709eC2b3346cdf13E07060D4e2DFfd898685; 

    function withdraw() external {
        uint256 balance = address(this).balance;
        sendEth(founderAddr, balance * 36 / 100);
        sendEth(superdevAddr, balance * 30 / 100);
        sendEth(frontendDev, balance * 25 / 100);
        sendEth(adminAddr, balance * 3 / 100);
        sendEth(communityLead, balance * 3 / 100);
        sendEth(tAddr, balance * 3 / 100);
    }

    function sendEth(address to, uint256 amount) internal {
        (bool success, ) = to.call{value: amount}("");
        require(success, "Failed to send ether");
    }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 3 of 13: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (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 4 of 13: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 5 of 13: ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721.sol';
import './IERC721Receiver.sol';
import './IERC721Metadata.sol';
import './Address.sol';
import './Context.sol';
import './Strings.sol';
import './ERC165.sol';

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) internal _addressData; //todo

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement 
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex != end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

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

pragma solidity ^0.8.0;

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

File 7 of 13: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 13: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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 9 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 11 of 13: IHappyKoalas.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;

interface IHappyKoalas {
    function isOwnerOf(address account, uint256[] calldata _tokenIds) external view returns (bool);
}

File 12 of 13: OwnableWithAdmin.sol
// SPDX-License-Identifier: MIT

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 OwnableWithAdmin is Context {
    address private _owner;
    address private _admin;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event NewAdmin(address indexed previousAdmin, address indexed newAdmin);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

    /**
     * @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 forever.
     * NOTE: This function does not remove the admin, so onlyOwnerOrAdmin function 
     * can still be called if an admin was set prior to the renouncing of ownership.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Leaves the contract without owner or admin. It will not be possible to call
     * onlyOwner or onlyOwnerOrAdmin functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership and adminship will leave the contract without an owner or an admin,
     * thereby removing any functionality that is only available to the owner or admin forever.
     */
    function renounceOwnershipandAdminship() public virtual onlyOwner {
        _setOwner(address(0));
        _setAdmin(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 can't be the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    function setAdmin(address newAdmin) public virtual onlyOwner {
        require(newAdmin != address(0), "Ownable: new admin can't be the zero address");
        _setAdmin(newAdmin);
    }
    function _setAdmin(address newAdmin) private {
        address oldAdmin = _admin;
        _admin = newAdmin;
        emit NewAdmin(oldAdmin, newAdmin);
    }
}


File 13 of 13: 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":[{"internalType":"address","name":"_happyKoalas","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","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":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SaleStateChanged","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":"TOTAL_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminAddr","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"communityLead","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founderAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMaxTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frontendDev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAmountClaimedPublic","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":"getFreeAmountLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"happyKoalas","outputs":[{"internalType":"contract IHappyKoalas","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerPublicWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintFree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnershipandAdminship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveFunctionRun","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFreeMaxTotal","type":"uint256"}],"name":"setFreeMaxTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_intended","type":"bool"}],"name":"setSaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superdevAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a80556104b0600b556618de76816d8000600c55601e805475c03f5d2725f1bb7bd599b9ffba5a16f4a41b459b000062010000600160b01b0319909116179055601f80546001600160a01b0319908116734e9f7618f72f3d497f4e252ebb6a731d715e7af51790915560208054821673b4057c08c729ed8810de0c2a15e74390dd78b09c1790556021805482167307c47a72c65ce8a37622ea8b15765dad601631201790556022805482167328f0aa00b1659f6a88b0cd8c19230f13bfd932d2179055602380549091167332e7709ec2b3346cdf13e07060d4e2dffd898685179055348015620000f457600080fd5b5060405162002d0238038062002d028339810160408190526200011791620002c2565b604080518082018252601481527f4b6f616c6176657273653a204368756d6d6965730000000000000000000000006020808301918252835180850190945260088452674348554d4d49455360c01b9084015281519192916200017c916002916200021c565b508051620001929060039060208401906200021c565b50506000805550620001a433620001ca565b600f80546001600160a01b0319166001600160a01b039290921691909117905562000330565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200022a90620002f4565b90600052602060002090601f0160209004810192826200024e576000855562000299565b82601f106200026957805160ff191683800117855562000299565b8280016001018555821562000299579182015b82811115620002995782518255916020019190600101906200027c565b50620002a7929150620002ab565b5090565b5b80821115620002a75760008155600101620002ac565b600060208284031215620002d557600080fd5b81516001600160a01b0381168114620002ed57600080fd5b9392505050565b600181811c908216806200030957607f821691505b6020821081036200032a57634e487b7160e01b600052602260045260246000fd5b50919050565b6129c280620003406000396000f3fe6080604052600436106102c95760003560e01c806391b7f5ed11610175578063c87b56dd116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b1461085b578063f851a4401461087b578063f94939a514610899578063fe70576e146108cf57600080fd5b8063e985e9c5146107e3578063eb8d24441461082c578063ed6e8b681461084657600080fd5b8063c87b56dd1461071e578063c9b5e5551461073e578063cd8e30d214610764578063cdc43f4614610784578063da3ef23f146107a3578063e794b39a146107c357600080fd5b8063a36e06761161012e578063a36e06761461067e578063a4146733146106ab578063a945bf80146106be578063b88d4fde146106d4578063be01ac8b146106f4578063c66828621461070957600080fd5b806391b7f5ed146105ea57806395d89b411461060a578063a0712d681461061f578063a08a81d714610632578063a11dcce814610648578063a22cb4651461065e57600080fd5b80634452680e116102345780636352211e116101ed57806370a08231116101c757806370a0823114610577578063715018a61461059757806381830593146105ac5780638da5cb5b146105cc57600080fd5b80636352211e146105225780636c0360eb14610542578063704b6c021461055757600080fd5b80634452680e14610477578063466a645d14610497578063484b973c146104ad57806351775629146104cd57806355f804b3146104e25780636272b14b1461050257600080fd5b806318160ddd1161028657806318160ddd146103bf5780631849ef4d146103e257806323b872dd146104025780633ccfd60b1461042257806342842e0e1461043757806343891bdb1461045757600080fd5b806301ffc9a7146102ce57806302c889891461030357806306fdde0314610325578063081812fc14610347578063095ea7b31461037f578063125342501461039f575b600080fd5b3480156102da57600080fd5b506102ee6102e93660046122b5565b6108ef565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b5061032361031e3660046122e7565b610941565b005b34801561033157600080fd5b5061033a610a2a565b6040516102fa919061235c565b34801561035357600080fd5b5061036761036236600461236f565b610abc565b6040516001600160a01b0390911681526020016102fa565b34801561038b57600080fd5b5061032361039a3660046123a4565b610b00565b3480156103ab57600080fd5b506103236103ba3660046123ce565b610b8d565b3480156103cb57600080fd5b50600154600054035b6040519081526020016102fa565b3480156103ee57600080fd5b50602254610367906001600160a01b031681565b34801561040e57600080fd5b5061032361041d366004612443565b610eed565b34801561042e57600080fd5b50610323610ef8565b34801561044357600080fd5b50610323610452366004612443565b610fc0565b34801561046357600080fd5b50602354610367906001600160a01b031681565b34801561048357600080fd5b50600f54610367906001600160a01b031681565b3480156104a357600080fd5b506103d4600b5481565b3480156104b957600080fd5b506103236104c83660046123a4565b610fdb565b3480156104d957600080fd5b506103d4611028565b3480156104ee57600080fd5b506103236104fd36600461247f565b61103f565b34801561050e57600080fd5b5061032361051d36600461236f565b61108a565b34801561052e57600080fd5b5061036761053d36600461236f565b6110ce565b34801561054e57600080fd5b5061033a6110e0565b34801561056357600080fd5b506103236105723660046124df565b61116e565b34801561058357600080fd5b506103d46105923660046124df565b61120c565b3480156105a357600080fd5b5061032361125b565b3480156105b857600080fd5b50602154610367906001600160a01b031681565b3480156105d857600080fd5b506008546001600160a01b0316610367565b3480156105f657600080fd5b5061032361060536600461236f565b611291565b34801561061657600080fd5b5061033a6112d5565b61032361062d36600461236f565b6112e4565b34801561063e57600080fd5b506103d461115c81565b34801561065457600080fd5b506103d4600a5481565b34801561066a57600080fd5b506103236106793660046124fa565b611458565b34801561068a57600080fd5b506103d46106993660046124df565b600e6020526000908152604090205481565b6103236106b936600461236f565b6114ed565b3480156106ca57600080fd5b506103d4600c5481565b3480156106e057600080fd5b506103236106ef366004612547565b611708565b34801561070057600080fd5b50610323611759565b34801561071557600080fd5b5061033a611797565b34801561072a57600080fd5b5061033a61073936600461236f565b6117a4565b34801561074a57600080fd5b50601e54610367906201000090046001600160a01b031681565b34801561077057600080fd5b50602054610367906001600160a01b031681565b34801561079057600080fd5b50601e546102ee90610100900460ff1681565b3480156107af57600080fd5b506103236107be36600461247f565b611830565b3480156107cf57600080fd5b506102ee6107de36600461236f565b61187b565b3480156107ef57600080fd5b506102ee6107fe366004612623565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561083857600080fd5b50601e546102ee9060ff1681565b34801561085257600080fd5b506103236118a6565b34801561086757600080fd5b506103236108763660046124df565b611978565b34801561088757600080fd5b506009546001600160a01b0316610367565b3480156108a557600080fd5b506103d46108b43660046124df565b6001600160a01b03166000908152600e602052604090205490565b3480156108db57600080fd5b50601f54610367906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061092057506001600160e01b03198216635b5e139f60e01b145b8061093b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633148061096457506009546001600160a01b031633145b6109895760405162461bcd60e51b815260040161098090612656565b60405180910390fd5b601e5481151560ff9091161515036109e35760405162461bcd60e51b815260206004820152601960248201527f5468697320697320616c7265616479207468652076616c7565000000000000006044820152606401610980565b601e805460ff19168215159081179091556040519081527fe333f8a36ee86e754548af2d6f50c73ff0d501e22e6c784662123dbbe493c6029060200160405180910390a150565b606060028054610a39906126a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a65906126a8565b8015610ab25780601f10610a8757610100808354040283529160200191610ab2565b820191906000526020600020905b815481529060010190602001808311610a9557829003601f168201915b5050505050905090565b6000610ac782611a16565b610ae4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b0b826110ce565b9050806001600160a01b0316836001600160a01b031603610b3f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b5f5750610b5d81336107fe565b155b15610b7d576040516367d9dca160e11b815260040160405180910390fd5b610b88838383611a41565b505050565b600f54604051631351198360e21b81526001600160a01b0390911690634d44660c90610bc1903390869086906004016126e2565b602060405180830381865afa158015610bde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c02919061272f565b610c695760405162461bcd60e51b815260206004820152603260248201527f41746c656173742031206f662074686f73652049442773206973206e6f7420796044820152716f757220746f6b656e20746f20636c61696d60701b6064820152608401610980565b60005b81811015610b88576010838383818110610c8857610c8861274c565b905060200201356101718110610ca057610ca061274c565b602081049091015460ff601f9092166101000a90041615610d1d5760405162461bcd60e51b815260206004820152603160248201527f41746c656173742031206f662074686f73652049442773206861766520616c726044820152701958591e481899595b8818db185a5b5959607a1b6064820152608401610980565b60016010848484818110610d3357610d3361274c565b905060200201356101718110610d4b57610d4b61274c565b602080820492909201805460ff601f9093166101000a9283021916931515919091029290921790915530600090815260059091526040808220805467ffffffffffffffff1980821667ffffffffffffffff928316600019018316179092553384529183208054918216918316600101909216179055600481858585818110610dd557610dd561274c565b60209081029290920135835250810191909152604001600090812080546001600160e01b0319163367ffffffffffffffff60a01b191617600160a01b4267ffffffffffffffff16021781559150848484818110610e3457610e3461274c565b602090810292909201356001016000818152600490935260409092208054929350916001600160a01b03169050610e7f576000548214610e7f5780546001600160a01b031916301781555b505050828282818110610e9457610e9461274c565b90506020020135336001600160a01b0316306001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480610ee581612778565b915050610c6c565b610b88838383611a9d565b601e544790610f2c906201000090046001600160a01b03166064610f1d846024612791565b610f2791906127c6565b611c8c565b601f54610f49906001600160a01b03166064610f1d84601e612791565b602054610f66906001600160a01b03166064610f1d846019612791565b602154610f83906001600160a01b03166064610f1d846003612791565b602254610fa0906001600160a01b03166064610f1d846003612791565b602354610fbd906001600160a01b03166064610f1d846003612791565b50565b610b8883838360405180602001604052806000815250611708565b6008546001600160a01b0316331480610ffe57506009546001600160a01b031633145b61101a5760405162461bcd60e51b815260040161098090612656565b6110248282611d26565b5050565b6000600d54600b5461103a91906127da565b905090565b6008546001600160a01b031633148061106257506009546001600160a01b031633145b61107e5760405162461bcd60e51b815260040161098090612656565b610b88601c8383612206565b6008546001600160a01b03163314806110ad57506009546001600160a01b031633145b6110c95760405162461bcd60e51b815260040161098090612656565b600b55565b60006110d982611e59565b5192915050565b601c80546110ed906126a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611119906126a8565b80156111665780601f1061113b57610100808354040283529160200191611166565b820191906000526020600020905b81548152906001019060200180831161114957829003601f168201915b505050505081565b6008546001600160a01b031633146111985760405162461bcd60e51b8152600401610980906127f1565b6001600160a01b0381166112035760405162461bcd60e51b815260206004820152602c60248201527f4f776e61626c653a206e65772061646d696e2063616e2774206265207468652060448201526b7a65726f206164647265737360a01b6064820152608401610980565b610fbd81611f75565b60006001600160a01b038216611235576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146112855760405162461bcd60e51b8152600401610980906127f1565b61128f6000611fc7565b565b6008546001600160a01b03163314806112b457506009546001600160a01b031633145b6112d05760405162461bcd60e51b815260040161098090612656565b600c55565b606060038054610a39906126a8565b601e5460ff1661132f5760405162461bcd60e51b81526020600482015260166024820152755468652073616c65206973206e6f742061637469766560501b6044820152606401610980565b61115c816113406001546000540390565b61134a919061283a565b11156113825760405162461bcd60e51b815260206004820152600760248201526614dbdb191bdd5d60ca1b6044820152606401610980565b6000811180156113945750600a548111155b6113f15760405162461bcd60e51b815260206004820152602860248201527f5f7175616e74697479206d7573742062652061626f7665203020616e642062656044820152673637bb9036b0bc1760c11b6064820152608401610980565b80600c546113ff9190612791565b34101561144e5760405162461bcd60e51b815260206004820152601760248201527f496e636f727265637420616d6f756e74206f66204554480000000000000000006044820152606401610980565b610fbd3382611d26565b336001600160a01b038316036114815760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b601e5460ff166115385760405162461bcd60e51b81526020600482015260166024820152755468652073616c65206973206e6f742061637469766560501b6044820152606401610980565b61115c6115486001546000540390565b1061157f5760405162461bcd60e51b815260206004820152600760248201526614dbdb191bdd5d60ca1b6044820152606401610980565b600b5481600d54611590919061283a565b106115ee5760405162461bcd60e51b815260206004820152602860248201527f536f7272792c206e6f206d6f726520667265656269657320617661696c61626c604482015267652c20736f72727960c01b6064820152608401610980565b6000811161163e5760405162461bcd60e51b815260206004820152601960248201527f5f7175616e74697479206d7573742062652061626f76652030000000000000006044820152606401610980565b336000908152600e6020526040902054600a5461165b838361283a565b11156116c25760405162461bcd60e51b815260206004820152603060248201527f596f752061726520747279696e6720746f20636c61696d206d6f72652074686160448201526f1b881e5bdd5c88185b1b1bdd1b595b9d60821b6064820152608401610980565b81600d60008282546116d4919061283a565b9091555050336000908152600e6020526040812080548492906116f890849061283a565b9091555061102490503383611d26565b611713848484611a9d565b6001600160a01b0383163b15158015611735575061173384848484612019565b155b15611753576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117835760405162461bcd60e51b8152600401610980906127f1565b61178d6000611fc7565b61128f6000611f75565b601d80546110ed906126a8565b60606117af82611a16565b6117fb5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610980565b601c61180683612105565b601d60405160200161181a939291906128eb565b6040516020818303038152906040529050919050565b6008546001600160a01b031633148061185357506009546001600160a01b031633145b61186f5760405162461bcd60e51b815260040161098090612656565b610b88601d8383612206565b601081610171811061188c57600080fd5b60209182820401919006915054906101000a900460ff1681565b6008546001600160a01b03163314806118c957506009546001600160a01b031633145b6118e55760405162461bcd60e51b815260040161098090612656565b601e54610100900460ff161561193d5760405162461bcd60e51b815260206004820152601760248201527f5265736572766520616c726561647920636c61696d65640000000000000000006044820152606401610980565b60005b602981101561196657611954306009611d26565b8061195e81612778565b915050611940565b50601e805461ff001916610100179055565b6008546001600160a01b031633146119a25760405162461bcd60e51b8152600401610980906127f1565b6001600160a01b038116611a0d5760405162461bcd60e51b815260206004820152602c60248201527f4f776e61626c653a206e6577206f776e65722063616e2774206265207468652060448201526b7a65726f206164647265737360a01b6064820152608401610980565b610fbd81611fc7565b600080548210801561093b575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611aa882611e59565b9050836001600160a01b031681600001516001600160a01b031614611adf5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611afd5750611afd85336107fe565b80611b18575033611b0d84610abc565b6001600160a01b0316145b905080611b3857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611b5f57604051633a954ecd60e21b815260040160405180910390fd5b611b6b60008487611a41565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611c41576000548214611c41578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611cd9576040519150601f19603f3d011682016040523d82523d6000602084013e611cde565b606091505b5050905080610b885760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321032ba3432b960611b6044820152606401610980565b6000546001600160a01b038316611d4f57604051622e076360e81b815260040160405180910390fd5b81600003611d705760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168a0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168a01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203611e0d5750600055505050565b604080516060810182526000808252602082018190529181019190915281600054811015611f5c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611f5a5780516001600160a01b031615611ef0579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611f55579392505050565b611ef0565b505b604051636f96cda160e11b815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc90600090a35050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061204e90339089908890889060040161291e565b6020604051808303816000875af1925050508015612089575060408051601f3d908101601f191682019092526120869181019061295b565b60015b6120e7573d8080156120b7576040519150601f19603f3d011682016040523d82523d6000602084013e6120bc565b606091505b5080516000036120df576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608160000361212c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612156578061214081612778565b915061214f9050600a836127c6565b9150612130565b60008167ffffffffffffffff81111561217157612171612531565b6040519080825280601f01601f19166020018201604052801561219b576020820181803683370190505b5090505b84156120fd576121b06001836127da565b91506121bd600a86612978565b6121c890603061283a565b60f81b8183815181106121dd576121dd61274c565b60200101906001600160f81b031916908160001a9053506121ff600a866127c6565b945061219f565b828054612212906126a8565b90600052602060002090601f016020900481019282612234576000855561227a565b82601f1061224d5782800160ff1982351617855561227a565b8280016001018555821561227a579182015b8281111561227a57823582559160200191906001019061225f565b5061228692915061228a565b5090565b5b80821115612286576000815560010161228b565b6001600160e01b031981168114610fbd57600080fd5b6000602082840312156122c757600080fd5b81356122d28161229f565b9392505050565b8015158114610fbd57600080fd5b6000602082840312156122f957600080fd5b81356122d2816122d9565b60005b8381101561231f578181015183820152602001612307565b838111156117535750506000910152565b60008151808452612348816020860160208601612304565b601f01601f19169290920160200192915050565b6020815260006122d26020830184612330565b60006020828403121561238157600080fd5b5035919050565b80356001600160a01b038116811461239f57600080fd5b919050565b600080604083850312156123b757600080fd5b6123c083612388565b946020939093013593505050565b600080602083850312156123e157600080fd5b823567ffffffffffffffff808211156123f957600080fd5b818501915085601f83011261240d57600080fd5b81358181111561241c57600080fd5b8660208260051b850101111561243157600080fd5b60209290920196919550909350505050565b60008060006060848603121561245857600080fd5b61246184612388565b925061246f60208501612388565b9150604084013590509250925092565b6000806020838503121561249257600080fd5b823567ffffffffffffffff808211156124aa57600080fd5b818501915085601f8301126124be57600080fd5b8135818111156124cd57600080fd5b86602082850101111561243157600080fd5b6000602082840312156124f157600080fd5b6122d282612388565b6000806040838503121561250d57600080fd5b61251683612388565b91506020830135612526816122d9565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561255d57600080fd5b61256685612388565b935061257460208601612388565b925060408501359150606085013567ffffffffffffffff8082111561259857600080fd5b818701915087601f8301126125ac57600080fd5b8135818111156125be576125be612531565b604051601f8201601f19908116603f011681019083821181831017156125e6576125e6612531565b816040528281528a60208487010111156125ff57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561263657600080fd5b61263f83612388565b915061264d60208401612388565b90509250929050565b60208082526032908201527f4f776e61626c655769746841646d696e3a2063616c6c6572206973206e6f74206040820152713a34329037bbb732b91037b91030b236b4b760711b606082015260800190565b600181811c908216806126bc57607f821691505b6020821081036126dc57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b0383111561271257600080fd5b8260051b8085606085013760009201606001918252509392505050565b60006020828403121561274157600080fd5b81516122d2816122d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161278a5761278a612762565b5060010190565b60008160001904831182151516156127ab576127ab612762565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826127d5576127d56127b0565b500490565b6000828210156127ec576127ec612762565b500390565b60208082526029908201527f4f776e61626c655769746841646d696e3a2063616c6c6572206973206e6f74206040820152683a34329037bbb732b960b91b606082015260800190565b6000821982111561284d5761284d612762565b500190565b8054600090600181811c908083168061286c57607f831692505b6020808410820361288d57634e487b7160e01b600052602260045260246000fd5b8180156128a157600181146128b2576128df565b60ff198616895284890196506128df565b60008881526020902060005b868110156128d75781548b8201529085019083016128be565b505084890196505b50505050505092915050565b60006128f78286612852565b8451612907818360208901612304565b61291381830186612852565b979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061295190830184612330565b9695505050505050565b60006020828403121561296d57600080fd5b81516122d28161229f565b600082612987576129876127b0565b50069056fea264697066735822122090ca11a0e89ee2bcbcfc17da2b62f8c7f5fcf4237d7eaf97381e9d9b2b7609db64736f6c634300080e0033000000000000000000000000d3bf218f0f396cd8b0429d2ff9cc2a964d4c36d1

Deployed Bytecode

0x6080604052600436106102c95760003560e01c806391b7f5ed11610175578063c87b56dd116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b1461085b578063f851a4401461087b578063f94939a514610899578063fe70576e146108cf57600080fd5b8063e985e9c5146107e3578063eb8d24441461082c578063ed6e8b681461084657600080fd5b8063c87b56dd1461071e578063c9b5e5551461073e578063cd8e30d214610764578063cdc43f4614610784578063da3ef23f146107a3578063e794b39a146107c357600080fd5b8063a36e06761161012e578063a36e06761461067e578063a4146733146106ab578063a945bf80146106be578063b88d4fde146106d4578063be01ac8b146106f4578063c66828621461070957600080fd5b806391b7f5ed146105ea57806395d89b411461060a578063a0712d681461061f578063a08a81d714610632578063a11dcce814610648578063a22cb4651461065e57600080fd5b80634452680e116102345780636352211e116101ed57806370a08231116101c757806370a0823114610577578063715018a61461059757806381830593146105ac5780638da5cb5b146105cc57600080fd5b80636352211e146105225780636c0360eb14610542578063704b6c021461055757600080fd5b80634452680e14610477578063466a645d14610497578063484b973c146104ad57806351775629146104cd57806355f804b3146104e25780636272b14b1461050257600080fd5b806318160ddd1161028657806318160ddd146103bf5780631849ef4d146103e257806323b872dd146104025780633ccfd60b1461042257806342842e0e1461043757806343891bdb1461045757600080fd5b806301ffc9a7146102ce57806302c889891461030357806306fdde0314610325578063081812fc14610347578063095ea7b31461037f578063125342501461039f575b600080fd5b3480156102da57600080fd5b506102ee6102e93660046122b5565b6108ef565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b5061032361031e3660046122e7565b610941565b005b34801561033157600080fd5b5061033a610a2a565b6040516102fa919061235c565b34801561035357600080fd5b5061036761036236600461236f565b610abc565b6040516001600160a01b0390911681526020016102fa565b34801561038b57600080fd5b5061032361039a3660046123a4565b610b00565b3480156103ab57600080fd5b506103236103ba3660046123ce565b610b8d565b3480156103cb57600080fd5b50600154600054035b6040519081526020016102fa565b3480156103ee57600080fd5b50602254610367906001600160a01b031681565b34801561040e57600080fd5b5061032361041d366004612443565b610eed565b34801561042e57600080fd5b50610323610ef8565b34801561044357600080fd5b50610323610452366004612443565b610fc0565b34801561046357600080fd5b50602354610367906001600160a01b031681565b34801561048357600080fd5b50600f54610367906001600160a01b031681565b3480156104a357600080fd5b506103d4600b5481565b3480156104b957600080fd5b506103236104c83660046123a4565b610fdb565b3480156104d957600080fd5b506103d4611028565b3480156104ee57600080fd5b506103236104fd36600461247f565b61103f565b34801561050e57600080fd5b5061032361051d36600461236f565b61108a565b34801561052e57600080fd5b5061036761053d36600461236f565b6110ce565b34801561054e57600080fd5b5061033a6110e0565b34801561056357600080fd5b506103236105723660046124df565b61116e565b34801561058357600080fd5b506103d46105923660046124df565b61120c565b3480156105a357600080fd5b5061032361125b565b3480156105b857600080fd5b50602154610367906001600160a01b031681565b3480156105d857600080fd5b506008546001600160a01b0316610367565b3480156105f657600080fd5b5061032361060536600461236f565b611291565b34801561061657600080fd5b5061033a6112d5565b61032361062d36600461236f565b6112e4565b34801561063e57600080fd5b506103d461115c81565b34801561065457600080fd5b506103d4600a5481565b34801561066a57600080fd5b506103236106793660046124fa565b611458565b34801561068a57600080fd5b506103d46106993660046124df565b600e6020526000908152604090205481565b6103236106b936600461236f565b6114ed565b3480156106ca57600080fd5b506103d4600c5481565b3480156106e057600080fd5b506103236106ef366004612547565b611708565b34801561070057600080fd5b50610323611759565b34801561071557600080fd5b5061033a611797565b34801561072a57600080fd5b5061033a61073936600461236f565b6117a4565b34801561074a57600080fd5b50601e54610367906201000090046001600160a01b031681565b34801561077057600080fd5b50602054610367906001600160a01b031681565b34801561079057600080fd5b50601e546102ee90610100900460ff1681565b3480156107af57600080fd5b506103236107be36600461247f565b611830565b3480156107cf57600080fd5b506102ee6107de36600461236f565b61187b565b3480156107ef57600080fd5b506102ee6107fe366004612623565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561083857600080fd5b50601e546102ee9060ff1681565b34801561085257600080fd5b506103236118a6565b34801561086757600080fd5b506103236108763660046124df565b611978565b34801561088757600080fd5b506009546001600160a01b0316610367565b3480156108a557600080fd5b506103d46108b43660046124df565b6001600160a01b03166000908152600e602052604090205490565b3480156108db57600080fd5b50601f54610367906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061092057506001600160e01b03198216635b5e139f60e01b145b8061093b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633148061096457506009546001600160a01b031633145b6109895760405162461bcd60e51b815260040161098090612656565b60405180910390fd5b601e5481151560ff9091161515036109e35760405162461bcd60e51b815260206004820152601960248201527f5468697320697320616c7265616479207468652076616c7565000000000000006044820152606401610980565b601e805460ff19168215159081179091556040519081527fe333f8a36ee86e754548af2d6f50c73ff0d501e22e6c784662123dbbe493c6029060200160405180910390a150565b606060028054610a39906126a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a65906126a8565b8015610ab25780601f10610a8757610100808354040283529160200191610ab2565b820191906000526020600020905b815481529060010190602001808311610a9557829003601f168201915b5050505050905090565b6000610ac782611a16565b610ae4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b0b826110ce565b9050806001600160a01b0316836001600160a01b031603610b3f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b5f5750610b5d81336107fe565b155b15610b7d576040516367d9dca160e11b815260040160405180910390fd5b610b88838383611a41565b505050565b600f54604051631351198360e21b81526001600160a01b0390911690634d44660c90610bc1903390869086906004016126e2565b602060405180830381865afa158015610bde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c02919061272f565b610c695760405162461bcd60e51b815260206004820152603260248201527f41746c656173742031206f662074686f73652049442773206973206e6f7420796044820152716f757220746f6b656e20746f20636c61696d60701b6064820152608401610980565b60005b81811015610b88576010838383818110610c8857610c8861274c565b905060200201356101718110610ca057610ca061274c565b602081049091015460ff601f9092166101000a90041615610d1d5760405162461bcd60e51b815260206004820152603160248201527f41746c656173742031206f662074686f73652049442773206861766520616c726044820152701958591e481899595b8818db185a5b5959607a1b6064820152608401610980565b60016010848484818110610d3357610d3361274c565b905060200201356101718110610d4b57610d4b61274c565b602080820492909201805460ff601f9093166101000a9283021916931515919091029290921790915530600090815260059091526040808220805467ffffffffffffffff1980821667ffffffffffffffff928316600019018316179092553384529183208054918216918316600101909216179055600481858585818110610dd557610dd561274c565b60209081029290920135835250810191909152604001600090812080546001600160e01b0319163367ffffffffffffffff60a01b191617600160a01b4267ffffffffffffffff16021781559150848484818110610e3457610e3461274c565b602090810292909201356001016000818152600490935260409092208054929350916001600160a01b03169050610e7f576000548214610e7f5780546001600160a01b031916301781555b505050828282818110610e9457610e9461274c565b90506020020135336001600160a01b0316306001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480610ee581612778565b915050610c6c565b610b88838383611a9d565b601e544790610f2c906201000090046001600160a01b03166064610f1d846024612791565b610f2791906127c6565b611c8c565b601f54610f49906001600160a01b03166064610f1d84601e612791565b602054610f66906001600160a01b03166064610f1d846019612791565b602154610f83906001600160a01b03166064610f1d846003612791565b602254610fa0906001600160a01b03166064610f1d846003612791565b602354610fbd906001600160a01b03166064610f1d846003612791565b50565b610b8883838360405180602001604052806000815250611708565b6008546001600160a01b0316331480610ffe57506009546001600160a01b031633145b61101a5760405162461bcd60e51b815260040161098090612656565b6110248282611d26565b5050565b6000600d54600b5461103a91906127da565b905090565b6008546001600160a01b031633148061106257506009546001600160a01b031633145b61107e5760405162461bcd60e51b815260040161098090612656565b610b88601c8383612206565b6008546001600160a01b03163314806110ad57506009546001600160a01b031633145b6110c95760405162461bcd60e51b815260040161098090612656565b600b55565b60006110d982611e59565b5192915050565b601c80546110ed906126a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611119906126a8565b80156111665780601f1061113b57610100808354040283529160200191611166565b820191906000526020600020905b81548152906001019060200180831161114957829003601f168201915b505050505081565b6008546001600160a01b031633146111985760405162461bcd60e51b8152600401610980906127f1565b6001600160a01b0381166112035760405162461bcd60e51b815260206004820152602c60248201527f4f776e61626c653a206e65772061646d696e2063616e2774206265207468652060448201526b7a65726f206164647265737360a01b6064820152608401610980565b610fbd81611f75565b60006001600160a01b038216611235576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146112855760405162461bcd60e51b8152600401610980906127f1565b61128f6000611fc7565b565b6008546001600160a01b03163314806112b457506009546001600160a01b031633145b6112d05760405162461bcd60e51b815260040161098090612656565b600c55565b606060038054610a39906126a8565b601e5460ff1661132f5760405162461bcd60e51b81526020600482015260166024820152755468652073616c65206973206e6f742061637469766560501b6044820152606401610980565b61115c816113406001546000540390565b61134a919061283a565b11156113825760405162461bcd60e51b815260206004820152600760248201526614dbdb191bdd5d60ca1b6044820152606401610980565b6000811180156113945750600a548111155b6113f15760405162461bcd60e51b815260206004820152602860248201527f5f7175616e74697479206d7573742062652061626f7665203020616e642062656044820152673637bb9036b0bc1760c11b6064820152608401610980565b80600c546113ff9190612791565b34101561144e5760405162461bcd60e51b815260206004820152601760248201527f496e636f727265637420616d6f756e74206f66204554480000000000000000006044820152606401610980565b610fbd3382611d26565b336001600160a01b038316036114815760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b601e5460ff166115385760405162461bcd60e51b81526020600482015260166024820152755468652073616c65206973206e6f742061637469766560501b6044820152606401610980565b61115c6115486001546000540390565b1061157f5760405162461bcd60e51b815260206004820152600760248201526614dbdb191bdd5d60ca1b6044820152606401610980565b600b5481600d54611590919061283a565b106115ee5760405162461bcd60e51b815260206004820152602860248201527f536f7272792c206e6f206d6f726520667265656269657320617661696c61626c604482015267652c20736f72727960c01b6064820152608401610980565b6000811161163e5760405162461bcd60e51b815260206004820152601960248201527f5f7175616e74697479206d7573742062652061626f76652030000000000000006044820152606401610980565b336000908152600e6020526040902054600a5461165b838361283a565b11156116c25760405162461bcd60e51b815260206004820152603060248201527f596f752061726520747279696e6720746f20636c61696d206d6f72652074686160448201526f1b881e5bdd5c88185b1b1bdd1b595b9d60821b6064820152608401610980565b81600d60008282546116d4919061283a565b9091555050336000908152600e6020526040812080548492906116f890849061283a565b9091555061102490503383611d26565b611713848484611a9d565b6001600160a01b0383163b15158015611735575061173384848484612019565b155b15611753576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117835760405162461bcd60e51b8152600401610980906127f1565b61178d6000611fc7565b61128f6000611f75565b601d80546110ed906126a8565b60606117af82611a16565b6117fb5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610980565b601c61180683612105565b601d60405160200161181a939291906128eb565b6040516020818303038152906040529050919050565b6008546001600160a01b031633148061185357506009546001600160a01b031633145b61186f5760405162461bcd60e51b815260040161098090612656565b610b88601d8383612206565b601081610171811061188c57600080fd5b60209182820401919006915054906101000a900460ff1681565b6008546001600160a01b03163314806118c957506009546001600160a01b031633145b6118e55760405162461bcd60e51b815260040161098090612656565b601e54610100900460ff161561193d5760405162461bcd60e51b815260206004820152601760248201527f5265736572766520616c726561647920636c61696d65640000000000000000006044820152606401610980565b60005b602981101561196657611954306009611d26565b8061195e81612778565b915050611940565b50601e805461ff001916610100179055565b6008546001600160a01b031633146119a25760405162461bcd60e51b8152600401610980906127f1565b6001600160a01b038116611a0d5760405162461bcd60e51b815260206004820152602c60248201527f4f776e61626c653a206e6577206f776e65722063616e2774206265207468652060448201526b7a65726f206164647265737360a01b6064820152608401610980565b610fbd81611fc7565b600080548210801561093b575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611aa882611e59565b9050836001600160a01b031681600001516001600160a01b031614611adf5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611afd5750611afd85336107fe565b80611b18575033611b0d84610abc565b6001600160a01b0316145b905080611b3857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611b5f57604051633a954ecd60e21b815260040160405180910390fd5b611b6b60008487611a41565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611c41576000548214611c41578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611cd9576040519150601f19603f3d011682016040523d82523d6000602084013e611cde565b606091505b5050905080610b885760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321032ba3432b960611b6044820152606401610980565b6000546001600160a01b038316611d4f57604051622e076360e81b815260040160405180910390fd5b81600003611d705760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168a0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168a01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203611e0d5750600055505050565b604080516060810182526000808252602082018190529181019190915281600054811015611f5c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611f5a5780516001600160a01b031615611ef0579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611f55579392505050565b611ef0565b505b604051636f96cda160e11b815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc90600090a35050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061204e90339089908890889060040161291e565b6020604051808303816000875af1925050508015612089575060408051601f3d908101601f191682019092526120869181019061295b565b60015b6120e7573d8080156120b7576040519150601f19603f3d011682016040523d82523d6000602084013e6120bc565b606091505b5080516000036120df576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608160000361212c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612156578061214081612778565b915061214f9050600a836127c6565b9150612130565b60008167ffffffffffffffff81111561217157612171612531565b6040519080825280601f01601f19166020018201604052801561219b576020820181803683370190505b5090505b84156120fd576121b06001836127da565b91506121bd600a86612978565b6121c890603061283a565b60f81b8183815181106121dd576121dd61274c565b60200101906001600160f81b031916908160001a9053506121ff600a866127c6565b945061219f565b828054612212906126a8565b90600052602060002090601f016020900481019282612234576000855561227a565b82601f1061224d5782800160ff1982351617855561227a565b8280016001018555821561227a579182015b8281111561227a57823582559160200191906001019061225f565b5061228692915061228a565b5090565b5b80821115612286576000815560010161228b565b6001600160e01b031981168114610fbd57600080fd5b6000602082840312156122c757600080fd5b81356122d28161229f565b9392505050565b8015158114610fbd57600080fd5b6000602082840312156122f957600080fd5b81356122d2816122d9565b60005b8381101561231f578181015183820152602001612307565b838111156117535750506000910152565b60008151808452612348816020860160208601612304565b601f01601f19169290920160200192915050565b6020815260006122d26020830184612330565b60006020828403121561238157600080fd5b5035919050565b80356001600160a01b038116811461239f57600080fd5b919050565b600080604083850312156123b757600080fd5b6123c083612388565b946020939093013593505050565b600080602083850312156123e157600080fd5b823567ffffffffffffffff808211156123f957600080fd5b818501915085601f83011261240d57600080fd5b81358181111561241c57600080fd5b8660208260051b850101111561243157600080fd5b60209290920196919550909350505050565b60008060006060848603121561245857600080fd5b61246184612388565b925061246f60208501612388565b9150604084013590509250925092565b6000806020838503121561249257600080fd5b823567ffffffffffffffff808211156124aa57600080fd5b818501915085601f8301126124be57600080fd5b8135818111156124cd57600080fd5b86602082850101111561243157600080fd5b6000602082840312156124f157600080fd5b6122d282612388565b6000806040838503121561250d57600080fd5b61251683612388565b91506020830135612526816122d9565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561255d57600080fd5b61256685612388565b935061257460208601612388565b925060408501359150606085013567ffffffffffffffff8082111561259857600080fd5b818701915087601f8301126125ac57600080fd5b8135818111156125be576125be612531565b604051601f8201601f19908116603f011681019083821181831017156125e6576125e6612531565b816040528281528a60208487010111156125ff57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561263657600080fd5b61263f83612388565b915061264d60208401612388565b90509250929050565b60208082526032908201527f4f776e61626c655769746841646d696e3a2063616c6c6572206973206e6f74206040820152713a34329037bbb732b91037b91030b236b4b760711b606082015260800190565b600181811c908216806126bc57607f821691505b6020821081036126dc57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b0383111561271257600080fd5b8260051b8085606085013760009201606001918252509392505050565b60006020828403121561274157600080fd5b81516122d2816122d9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161278a5761278a612762565b5060010190565b60008160001904831182151516156127ab576127ab612762565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826127d5576127d56127b0565b500490565b6000828210156127ec576127ec612762565b500390565b60208082526029908201527f4f776e61626c655769746841646d696e3a2063616c6c6572206973206e6f74206040820152683a34329037bbb732b960b91b606082015260800190565b6000821982111561284d5761284d612762565b500190565b8054600090600181811c908083168061286c57607f831692505b6020808410820361288d57634e487b7160e01b600052602260045260246000fd5b8180156128a157600181146128b2576128df565b60ff198616895284890196506128df565b60008881526020902060005b868110156128d75781548b8201529085019083016128be565b505084890196505b50505050505092915050565b60006128f78286612852565b8451612907818360208901612304565b61291381830186612852565b979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061295190830184612330565b9695505050505050565b60006020828403121561296d57600080fd5b81516122d28161229f565b600082612987576129876127b0565b50069056fea264697066735822122090ca11a0e89ee2bcbcfc17da2b62f8c7f5fcf4237d7eaf97381e9d9b2b7609db64736f6c634300080e0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d3bf218f0f396cd8b0429d2ff9cc2a964d4c36d1

-----Decoded View---------------
Arg [0] : _happyKoalas (address): 0xd3BF218F0F396CD8b0429D2ff9Cc2A964d4C36D1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d3bf218f0f396cd8b0429d2ff9cc2a964d4c36d1


Deployed Bytecode Sourcemap

167:6605:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4317:300:4;;;;;;;;;;-1:-1:-1;4317:300:4;;;;;:::i;:::-;;:::i;:::-;;;565:14:13;;558:22;540:41;;528:2;513:18;4317:300:4;;;;;;;;4220:223:1;;;;;;;;;;-1:-1:-1;4220:223:1;;;;;:::i;:::-;;:::i;:::-;;7345:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8801:200::-;;;;;;;;;;-1:-1:-1;8801:200:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:13;;;2043:51;;2031:2;2016:18;8801:200:4;1897:203:13;8378:362:4;;;;;;;;;;-1:-1:-1;8378:362:4;;;;;:::i;:::-;;:::i;2574:1531:1:-;;;;;;;;;;-1:-1:-1;2574:1531:1;;;;;:::i;:::-;;:::i;3588:297:4:-;;;;;;;;;;-1:-1:-1;3838:12:4;;3632:7;3822:13;:28;3588:297;;;3308:25:13;;;3296:2;3281:18;3588:297:4;3162:177:13;6055:76:1;;;;;;;;;;-1:-1:-1;6055:76:1;;;;-1:-1:-1;;;;;6055:76:1;;;9640:164:4;;;;;;;;;;-1:-1:-1;9640:164:4;;;;;:::i;:::-;;:::i;6221:377:1:-;;;;;;;;;;;;;:::i;9870:179:4:-;;;;;;;;;;-1:-1:-1;9870:179:4;;;;;:::i;:::-;;:::i;6137:76:1:-;;;;;;;;;;-1:-1:-1;6137:76:1;;;;-1:-1:-1;;;;;6137:76:1;;;520:31;;;;;;;;;;-1:-1:-1;520:31:1;;;;-1:-1:-1;;;;;520:31:1;;;343:34;;;;;;;;;;;;;;;;1031:109;;;;;;;;;;-1:-1:-1;1031:109:1;;;;;:::i;:::-;;:::i;5162:114::-;;;;;;;;;;;;;:::i;4493:107::-;;;;;;;;;;-1:-1:-1;4493:107:1;;;;;:::i;:::-;;:::i;5014:126::-;;;;;;;;;;-1:-1:-1;5014:126:1;;;;;:::i;:::-;;:::i;7160:123:4:-;;;;;;;;;;-1:-1:-1;7160:123:4;;;;;:::i;:::-;;:::i;696:21:1:-;;;;;;;;;;;;;:::i;3499:186:11:-;;;;;;;;;;-1:-1:-1;3499:186:11;;;;;:::i;:::-;;:::i;4676:203:4:-;;;;;;;;;;-1:-1:-1;4676:203:4;;;;;:::i;:::-;;:::i;2329:92:11:-;;;;;;;;;;;;;:::i;5973:76:1:-;;;;;;;;;;-1:-1:-1;5973:76:1;;;;-1:-1:-1;;;;;5973:76:1;;;1080:85:11;;;;;;;;;;-1:-1:-1;1152:6:11;;-1:-1:-1;;;;;1152:6:11;1080:85;;4853:103:1;;;;;;;;;;-1:-1:-1;4853:103:1;;;;;:::i;:::-;;:::i;7507:102:4:-;;;;;;;;;;;;;:::i;2149:419:1:-;;;;;;:::i;:::-;;:::i;252:40::-;;;;;;;;;;;;288:4;252:40;;299:38;;;;;;;;;;;;;;;;9068:282:4;;;;;;;;;;-1:-1:-1;9068:282:4;;;;;:::i;:::-;;:::i;460:53:1:-;;;;;;;;;;-1:-1:-1;460:53:1;;;;;:::i;:::-;;;;;;;;;;;;;;1514:628;;;;;;:::i;:::-;;:::i;384:40::-;;;;;;;;;;;;;;;;10115:359:4;;;;;;;;;;-1:-1:-1;10115:359:4;;;;;:::i;:::-;;:::i;2833:135:11:-;;;;;;;;;;;;;:::i;723:27:1:-;;;;;;;;;;;;;:::i;5458:253::-;;;;;;;;;;-1:-1:-1;5458:253:1;;;;;:::i;:::-;;:::i;5717:76::-;;;;;;;;;;-1:-1:-1;5717:76:1;;;;;;;-1:-1:-1;;;;;5717:76:1;;;5886;;;;;;;;;;-1:-1:-1;5886:76:1;;;;-1:-1:-1;;;;;5886:76:1;;;787:30;;;;;;;;;;-1:-1:-1;787:30:1;;;;;;;;;;;4656:131;;;;;;;;;;-1:-1:-1;4656:131:1;;;;;:::i;:::-;;:::i;633:31::-;;;;;;;;;;-1:-1:-1;633:31:1;;;;;:::i;:::-;;:::i;9416:162:4:-;;;;;;;;;;-1:-1:-1;9416:162:4;;;;;:::i;:::-;-1:-1:-1;;;;;9536:25:4;;;9513:4;9536:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9416:162;757:24:1;;;;;;;;;;-1:-1:-1;757:24:1;;;;;;;;1170:239;;;;;;;;;;;;;:::i;3123:195:11:-;;;;;;;;;;-1:-1:-1;3123:195:11;;;;;:::i;:::-;;:::i;1241:85::-;;;;;;;;;;-1:-1:-1;1313:6:11;;-1:-1:-1;;;;;1313:6:11;1241:85;;5283:128:1;;;;;;;;;;-1:-1:-1;5283:128:1;;;;;:::i;:::-;-1:-1:-1;;;;;5379:25:1;5353:7;5379:25;;;:18;:25;;;;;;;5283:128;5799:76;;;;;;;;;;-1:-1:-1;5799:76:1;;;;-1:-1:-1;;;;;5799:76:1;;;4317:300:4;4419:4;-1:-1:-1;;;;;;4454:40:4;;-1:-1:-1;;;4454:40:4;;:104;;-1:-1:-1;;;;;;;4510:48:4;;-1:-1:-1;;;4510:48:4;4454:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:3;;;4574:36:4;4435:175;4317:300;-1:-1:-1;;4317:300:4:o;4220:223:1:-;1152:6:11;;-1:-1:-1;;;;;1152:6:11;719:10:2;1687:23:11;;:50;;-1:-1:-1;1313:6:11;;-1:-1:-1;;;;;1313:6:11;719:10:2;1714:23:11;1687:50;1679:113;;;;-1:-1:-1;;;1679:113:11;;;;;;;:::i;:::-;;;;;;;;;4305:12:1::1;::::0;:25;::::1;;:12;::::0;;::::1;:25;;::::0;4297:63:::1;;;::::0;-1:-1:-1;;;4297:63:1;;7175:2:13;4297:63:1::1;::::0;::::1;7157:21:13::0;7214:2;7194:18;;;7187:30;7253:27;7233:18;;;7226:55;7298:18;;4297:63:1::1;6973:349:13::0;4297:63:1::1;4370:12;:24:::0;;-1:-1:-1;;4370:24:1::1;::::0;::::1;;::::0;;::::1;::::0;;;4409:27:::1;::::0;540:41:13;;;4409:27:1::1;::::0;528:2:13;513:18;4409:27:1::1;;;;;;;4220:223:::0;:::o;7345:98:4:-;7399:13;7431:5;7424:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7345:98;:::o;8801:200::-;8869:7;8893:16;8901:7;8893;:16::i;:::-;8888:64;;8918:34;;-1:-1:-1;;;8918:34:4;;;;;;;;;;;8888:64;-1:-1:-1;8970:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;8970:24:4;;8801:200::o;8378:362::-;8450:13;8466:24;8482:7;8466:15;:24::i;:::-;8450:40;;8510:5;-1:-1:-1;;;;;8504:11:4;:2;-1:-1:-1;;;;;8504:11:4;;8500:48;;8524:24;;-1:-1:-1;;;8524:24:4;;;;;;;;;;;8500:48;719:10:2;-1:-1:-1;;;;;8563:21:4;;;;;;:63;;-1:-1:-1;8589:37:4;8606:5;719:10:2;9416:162:4;:::i;8589:37::-;8588:38;8563:63;8559:136;;;8649:35;;-1:-1:-1;;;8649:35:4;;;;;;;;;;;8559:136;8705:28;8714:2;8718:7;8727:5;8705:8;:28::i;:::-;8440:300;8378:362;;:::o;2574:1531:1:-;2655:11;;:44;;-1:-1:-1;;;2655:44:1;;-1:-1:-1;;;;;2655:11:1;;;;:21;;:44;;2677:10;;2689:9;;;;2655:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2647:107;;;;-1:-1:-1;;;2647:107:1;;8752:2:13;2647:107:1;;;8734:21:13;8791:2;8771:18;;;8764:30;8830:34;8810:18;;;8803:62;-1:-1:-1;;;8881:18:13;;;8874:48;8939:19;;2647:107:1;8550:414:13;2647:107:1;2768:6;2764:1335;2776:20;;;2764:1335;;;2826:14;2841:9;;2851:1;2841:12;;;;;;;:::i;:::-;;;;;;;2826:28;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2825:29;2817:91;;;;-1:-1:-1;;;2817:91:1;;9303:2:13;2817:91:1;;;9285:21:13;9342:2;9322:18;;;9315:30;9381:34;9361:18;;;9354:62;-1:-1:-1;;;9432:18:13;;;9425:47;9489:19;;2817:91:1;9101:413:13;2817:91:1;2955:4;2924:14;2939:9;;2949:1;2939:12;;;;;;;:::i;:::-;;;;;;;2924:28;;;;;;;:::i;:::-;;;;;;;;;:35;;;:28;;;;:35;;;;;;;;;;;;;;;;;;;;;3022:4;-1:-1:-1;3001:27:1;;;:12;:27;;;;;;;:40;;-1:-1:-1;;3001:40:1;;;;;;;-1:-1:-1;;3001:40:1;;;;;;;3072:10;3059:24;;;;;:37;;;;;;;;-1:-1:-1;3059:37:1;;;;;;;3149:11;-1:-1:-1;3161:9:1;;3171:1;3161:12;;;;;;;:::i;:::-;;;;;;;;;;3149:25;;-1:-1:-1;3149:25:1;;;;;;;;-1:-1:-1;3149:25:1;;;3192:26;;-1:-1:-1;;;;;;3236:49:1;3208:10;-1:-1:-1;;;;3236:49:1;;-1:-1:-1;;;3269:15:1;3236:49;;;;;;3149:25;-1:-1:-1;3567:9:1;;3577:1;3567:12;;;;;;;:::i;:::-;;;;;;;;;;3582:1;3567:16;3601:31;3635:24;;;:11;:24;;;;;;;3681:13;;3567:16;;-1:-1:-1;3635:24:1;-1:-1:-1;;;;;3681:13:1;;-1:-1:-1;3677:334:1;;3900:13;;3885:11;:28;3881:112;;3941:29;;-1:-1:-1;;;;;;3941:29:1;3965:4;3941:29;;;3881:112;2973:1052;;;4075:9;;4085:1;4075:12;;;;;;;:::i;:::-;;;;;;;4063:10;-1:-1:-1;;;;;4039:49:1;4056:4;-1:-1:-1;;;;;4039:49:1;;;;;;;;;;;2798:3;;;;:::i;:::-;;;;2764:1335;;9640:164:4;9769:28;9779:4;9785:2;9789:7;9769:9;:28::i;6221:377:1:-;6317:11;;6278:21;;6309:40;;6317:11;;;-1:-1:-1;;;;;6317:11:1;6345:3;6330:12;6278:21;6340:2;6330:12;:::i;:::-;:18;;;;:::i;:::-;6309:7;:40::i;:::-;6367:12;;6359:41;;-1:-1:-1;;;;;6367:12:1;6396:3;6381:12;:7;6391:2;6381:12;:::i;6359:41::-;6418:11;;6410:40;;-1:-1:-1;;;;;6418:11:1;6446:3;6431:12;:7;6441:2;6431:12;:::i;6410:40::-;6468:9;;6460:37;;-1:-1:-1;;;;;6468:9:1;6493:3;6479:11;:7;6489:1;6479:11;:::i;6460:37::-;6515:13;;6507:41;;-1:-1:-1;;;;;6515:13:1;6544:3;6530:11;:7;6540:1;6530:11;:::i;6507:41::-;6566:5;;6558:33;;-1:-1:-1;;;;;6566:5:1;6587:3;6573:11;:7;6583:1;6573:11;:::i;6558:33::-;6250:348;6221:377::o;9870:179:4:-;10003:39;10020:4;10026:2;10030:7;10003:39;;;;;;;;;;;;:16;:39::i;1031:109:1:-;1152:6:11;;-1:-1:-1;;;;;1152:6:11;719:10:2;1687:23:11;;:50;;-1:-1:-1;1313:6:11;;-1:-1:-1;;;;;1313:6:11;719:10:2;1714:23:11;1687:50;1679:113;;;;-1:-1:-1;;;1679:113:11;;;;;;;:::i;:::-;1115:18:1::1;1121:5;1128:4;1115:5;:18::i;:::-;1031:109:::0;;:::o;5162:114::-;5214:7;5255:14;;5240:12;;:29;;;;:::i;:::-;5233:36;;5162:114;:::o;4493:107::-;1152:6:11;;-1:-1:-1;;;;;1152:6:11;719:10:2;1687:23:11;;:50;;-1:-1:-1;1313:6:11;;-1:-1:-1;;;;;1313:6:11;719:10:2;1714:23:11;1687:50;1679:113;;;;-1:-1:-1;;;1679:113:11;;;;;;;:::i;:::-;4575:18:1::1;:7;4585:8:::0;;4575:18:::1;:::i;5014:126::-:0;1152:6:11;;-1:-1:-1;;;;;1152:6:11;719:10:2;1687:23:11;;:50;;-1:-1:-1;1313:6:11;;-1:-1:-1;;;;;1313:6:11;719:10:2;1714:23:11;1687:50;1679:113;;;;-1:-1:-1;;;1679:113:11;;;;;;;:::i;:::-;5102:12:1::1;:31:::0;5014:126::o;7160:123:4:-;7224:7;7250:21;7263:7;7250:12;:21::i;:::-;:26;;7160:123;-1:-1:-1;;7160:123:4:o;696:21:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3499:186:11:-;1152:6;;-1:-1:-1;;;;;1152:6:11;719:10:2;1453:23:11;1445:77;;;;-1:-1:-1;;;1445:77:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;3578:22:11;::::1;3570:79;;;::::0;-1:-1:-1;;;3570:79:11;;10963:2:13;3570:79:11::1;::::0;::::1;10945:21:13::0;11002:2;10982:18;;;10975:30;11041:34;11021:18;;;11014:62;-1:-1:-1;;;11092:18:13;;;11085:42;11144:19;;3570:79:11::1;10761:408:13::0;3570:79:11::1;3659:19;3669:8;3659:9;:19::i;4676:203:4:-:0;4740:7;-1:-1:-1;;;;;4763:19:4;;4759:60;;4791:28;;-1:-1:-1;;;4791:28:4;;;;;;;;;;;4759:60;-1:-1:-1;;;;;;4844:19:4;;;;;:12;:19;;;;;:27;;;;4676:203::o;2329:92:11:-;1152:6;;-1:-1:-1;;;;;1152:6:11;719:10:2;1453:23:11;1445:77;;;;-1:-1:-1;;;1445:77:11;;;;;;;:::i;:::-;2393:21:::1;2411:1;2393:9;:21::i;:::-;2329:92::o:0;4853:103:1:-;1152:6:11;;-1:-1:-1;;;;;1152:6:11;719:10:2;1687:23:11;;:50;;-1:-1:-1;1313:6:11;;-1:-1:-1;;;;;1313:6:11;719:10:2;1714:23:11;1687:50;1679:113;;;;-1:-1:-1;;;1679:113:11;;;;;;;:::i;:::-;4926:11:1::1;:23:::0;4853:103::o;7507:102:4:-;7563:13;7595:7;7588:14;;;;;:::i;2149:419:1:-;4157:12;;;;4149:47;;;;-1:-1:-1;;;4149:47:1;;11376:2:13;4149:47:1;;;11358:21:13;11415:2;11395:18;;;11388:30;-1:-1:-1;;;11434:18:13;;;11427:52;11496:18;;4149:47:1;11174:346:13;4149:47:1;288:4:::1;2250:9;2234:13;3838:12:4::0;;3632:7;3822:13;:28;;3588:297;2234:13:1::1;:25;;;;:::i;:::-;:38;;2226:58;;;::::0;-1:-1:-1;;;2226:58:1;;11860:2:13;2226:58:1::1;::::0;::::1;11842:21:13::0;11899:1;11879:18;;;11872:29;-1:-1:-1;;;11917:18:13;;;11910:37;11964:18;;2226:58:1::1;11658:330:13::0;2226:58:1::1;2360:1;2348:9;:13;:48;;;;;2378:18;;2365:9;:31;;2348:48;2340:101;;;::::0;-1:-1:-1;;;2340:101:1;;12195:2:13;2340:101:1::1;::::0;::::1;12177:21:13::0;12234:2;12214:18;;;12207:30;12273:34;12253:18;;;12246:62;-1:-1:-1;;;12324:18:13;;;12317:38;12372:19;;2340:101:1::1;11993:404:13::0;2340:101:1::1;2486:9;2472:11;;:23;;;;:::i;:::-;2459:9;:36;;2451:72;;;::::0;-1:-1:-1;;;2451:72:1;;12604:2:13;2451:72:1::1;::::0;::::1;12586:21:13::0;12643:2;12623:18;;;12616:30;12682:25;12662:18;;;12655:53;12725:18;;2451:72:1::1;12402:347:13::0;2451:72:1::1;2533:28;2539:10;2551:9;2533:5;:28::i;9068:282:4:-:0;719:10:2;-1:-1:-1;;;;;9166:24:4;;;9162:54;;9199:17;;-1:-1:-1;;;9199:17:4;;;;;;;;;;;9162:54;719:10:2;9227:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9227:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;9227:53:4;;;;;;;;;;9295:48;;540:41:13;;;9227:42:4;;719:10:2;9295:48:4;;513:18:13;9295:48:4;;;;;;;9068:282;;:::o;1514:628:1:-;4157:12;;;;4149:47;;;;-1:-1:-1;;;4149:47:1;;11376:2:13;4149:47:1;;;11358:21:13;11415:2;11395:18;;;11388:30;-1:-1:-1;;;11434:18:13;;;11427:52;11496:18;;4149:47:1;11174:346:13;4149:47:1;288:4:::1;1603:13;3838:12:4::0;;3632:7;3822:13;:28;;3588:297;1603:13:1::1;:25;1595:45;;;::::0;-1:-1:-1;;;1595:45:1;;11860:2:13;1595:45:1::1;::::0;::::1;11842:21:13::0;11899:1;11879:18;;;11872:29;-1:-1:-1;;;11917:18:13;;;11910:37;11964:18;;1595:45:1::1;11658:330:13::0;1595:45:1::1;1687:12;;1675:9;1658:14;;:26;;;;:::i;:::-;:41;1650:94;;;::::0;-1:-1:-1;;;1650:94:1;;12956:2:13;1650:94:1::1;::::0;::::1;12938:21:13::0;12995:2;12975:18;;;12968:30;13034:34;13014:18;;;13007:62;-1:-1:-1;;;13085:18:13;;;13078:38;13133:19;;1650:94:1::1;12754:404:13::0;1650:94:1::1;1774:1;1762:9;:13;1754:51;;;::::0;-1:-1:-1;;;1754:51:1;;13365:2:13;1754:51:1::1;::::0;::::1;13347:21:13::0;13404:2;13384:18;;;13377:30;13443:27;13423:18;;;13416:55;13488:18;;1754:51:1::1;13163:349:13::0;1754:51:1::1;1864:10;1815:27;1845:30:::0;;;:18:::1;:30;::::0;;;;;1928:18:::1;::::0;1893:31:::1;1915:9:::0;1845:30;1893:31:::1;:::i;:::-;:53;;1885:114;;;::::0;-1:-1:-1;;;1885:114:1;;13719:2:13;1885:114:1::1;::::0;::::1;13701:21:13::0;13758:2;13738:18;;;13731:30;13797:34;13777:18;;;13770:62;-1:-1:-1;;;13848:18:13;;;13841:46;13904:19;;1885:114:1::1;13517:412:13::0;1885:114:1::1;2035:9;2017:14;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;2073:10:1::1;2054:30;::::0;;;:18:::1;:30;::::0;;;;:43;;2088:9;;2054:30;:43:::1;::::0;2088:9;;2054:43:::1;:::i;:::-;::::0;;;-1:-1:-1;2107:28:1::1;::::0;-1:-1:-1;2113:10:1::1;2125:9:::0;2107:5:::1;:28::i;10115:359:4:-:0;10276:28;10286:4;10292:2;10296:7;10276:9;:28::i;:::-;-1:-1:-1;;;;;10318:13:4;;1465:19:0;:23;;10318:76:4;;;;;10338:56;10369:4;10375:2;10379:7;10388:5;10338:30;:56::i;:::-;10337:57;10318:76;10314:154;;;10417:40;;-1:-1:-1;;;10417:40:4;;;;;;;;;;;10314:154;10115:359;;;;:::o;2833:135:11:-;1152:6;;-1:-1:-1;;;;;1152:6:11;719:10:2;1453:23:11;1445:77;;;;-1:-1:-1;;;1445:77:11;;;;;;;:::i;:::-;2909:21:::1;2927:1;2909:9;:21::i;:::-;2940;2958:1;2940:9;:21::i;723:27:1:-:0;;;;;;;:::i;5458:253::-;5532:13;5565:17;5573:8;5565:7;:17::i;:::-;5557:61;;;;-1:-1:-1;;;5557:61:1;;14136:2:13;5557:61:1;;;14118:21:13;14175:2;14155:18;;;14148:30;14214:33;14194:18;;;14187:61;14265:18;;5557:61:1;13934:355:13;5557:61:1;5659:7;5668:19;:8;:17;:19::i;:::-;5689:13;5642:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5628:76;;5458:253;;;:::o;4656:131::-;1152:6:11;;-1:-1:-1;;;;;1152:6:11;719:10:2;1687:23:11;;:50;;-1:-1:-1;1313:6:11;;-1:-1:-1;;;;;1313:6:11;719:10:2;1714:23:11;1687:50;1679:113;;;;-1:-1:-1;;;1679:113:11;;;;;;;:::i;:::-;4750:30:1::1;:13;4766:14:::0;;4750:30:::1;:::i;633:31::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1170:239::-;1152:6:11;;-1:-1:-1;;;;;1152:6:11;719:10:2;1687:23:11;;:50;;-1:-1:-1;1313:6:11;;-1:-1:-1;;;;;1313:6:11;719:10:2;1714:23:11;1687:50;1679:113;;;;-1:-1:-1;;;1679:113:11;;;;;;;:::i;:::-;1239:18:1::1;::::0;::::1;::::0;::::1;;;1238:19;1230:55;;;::::0;-1:-1:-1;;;1230:55:1;;16061:2:13;1230:55:1::1;::::0;::::1;16043:21:13::0;16100:2;16080:18;;;16073:30;16139:25;16119:18;;;16112:53;16182:18;;1230:55:1::1;15859:347:13::0;1230:55:1::1;1299:6;1295:73;1311:2;1307:1;:6;1295:73;;;1334:23;1348:4;1355:1;1334:5;:23::i;:::-;1315:3:::0;::::1;::::0;::::1;:::i;:::-;;;;1295:73;;;-1:-1:-1::0;1377:18:1::1;:25:::0;;-1:-1:-1;;1377:25:1::1;;;::::0;;1170:239::o;3123:195:11:-;1152:6;;-1:-1:-1;;;;;1152:6:11;719:10:2;1453:23:11;1445:77;;;;-1:-1:-1;;;1445:77:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;3211:22:11;::::1;3203:79;;;::::0;-1:-1:-1;;;3203:79:11;;16413:2:13;3203:79:11::1;::::0;::::1;16395:21:13::0;16452:2;16432:18;;;16425:30;16491:34;16471:18;;;16464:62;-1:-1:-1;;;16542:18:13;;;16535:42;16594:19;;3203:79:11::1;16211:408:13::0;3203:79:11::1;3292:19;3302:8;3292:9;:19::i;10720:172:4:-:0;10777:4;10840:13;;10830:7;:23;10800:85;;;;-1:-1:-1;;10858:20:4;;;;:11;:20;;;;;:27;-1:-1:-1;;;10858:27:4;;;;10857:28;;10720:172::o;19705:189::-;19815:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19815:29:4;-1:-1:-1;;;;;19815:29:4;;;;;;;;;19859:28;;19815:24;;19859:28;;;;;;;19705:189;;;:::o;14780:2082::-;14890:35;14928:21;14941:7;14928:12;:21::i;:::-;14890:59;;14986:4;-1:-1:-1;;;;;14964:26:4;:13;:18;;;-1:-1:-1;;;;;14964:26:4;;14960:67;;14999:28;;-1:-1:-1;;;14999:28:4;;;;;;;;;;;14960:67;15038:22;719:10:2;-1:-1:-1;;;;;15064:20:4;;;;:72;;-1:-1:-1;15100:36:4;15117:4;719:10:2;9416:162:4;:::i;15100:36::-;15064:124;;;-1:-1:-1;719:10:2;15152:20:4;15164:7;15152:11;:20::i;:::-;-1:-1:-1;;;;;15152:36:4;;15064:124;15038:151;;15205:17;15200:66;;15231:35;;-1:-1:-1;;;15231:35:4;;;;;;;;;;;15200:66;-1:-1:-1;;;;;15280:16:4;;15276:52;;15305:23;;-1:-1:-1;;;15305:23:4;;;;;;;;;;;15276:52;15444:35;15461:1;15465:7;15474:4;15444:8;:35::i;:::-;-1:-1:-1;;;;;15769:18:4;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15769:31:4;;;;;;;-1:-1:-1;;15769:31:4;;;;;;;15814:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15814:29:4;;;;;;;;;;;15892:20;;;:11;:20;;;;;;15926:18;;-1:-1:-1;;;;;;15958:49:4;;;;-1:-1:-1;;;15991:15:4;15958:49;;;;;;;;;;16277:11;;16336:24;;;;;16378:13;;15892:20;;16336:24;;16378:13;16374:377;;16585:13;;16570:11;:28;16566:171;;16622:20;;16690:28;;;;16664:54;;-1:-1:-1;;;16664:54:4;-1:-1:-1;;;;;;16664:54:4;;;-1:-1:-1;;;;;16622:20:4;;16664:54;;;;16566:171;15745:1016;;;16795:7;16791:2;-1:-1:-1;;;;;16776:27:4;16785:4;-1:-1:-1;;;;;16776:27:4;;;;;;;;;;;14880:1982;;14780:2082;;;:::o;6604:166:1:-;6669:12;6687:2;-1:-1:-1;;;;;6687:7:1;6702:6;6687:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6668:45;;;6731:7;6723:40;;;;-1:-1:-1;;;6723:40:1;;17036:2:13;6723:40:1;;;17018:21:13;17075:2;17055:18;;;17048:30;-1:-1:-1;;;17094:18:13;;;17087:50;17154:18;;6723:40:1;16834:344:13;13391:1147:4;13455:20;13478:13;-1:-1:-1;;;;;13505:16:4;;13501:48;;13530:19;;-1:-1:-1;;;13530:19:4;;;;;;;;;;;13501:48;13563:8;13575:1;13563:13;13559:44;;13585:18;;-1:-1:-1;;;13585:18:4;;;;;;;;;;;13559:44;-1:-1:-1;;;;;13946:16:4;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;14004:49:4;;13946:44;;;;;;;;14004:49;;;;-1:-1:-1;;13946:44:4;;;;;;14004:49;;;;;;;;;;;;;;;;14068:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;14117:66:4;;;;-1:-1:-1;;;14167:15:4;14117:66;;;;;;;;;;14068:25;14261:23;;;14299:110;14325:40;;14350:14;;;;;-1:-1:-1;;;;;14325:40:4;;;14342:1;;14325:40;;14342:1;;14325:40;14404:3;14388:12;:19;14299:110;;-1:-1:-1;14423:13:4;:28;8440:300;8378:362;;:::o;6019:1084::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6129:7:4;6209:13;;6202:4;:20;6171:868;;;6242:31;6276:17;;;:11;:17;;;;;;;;;6242:51;;;;;;;;;-1:-1:-1;;;;;6242:51:4;;;;-1:-1:-1;;;6242:51:4;;;;;;;;;;;-1:-1:-1;;;6242:51:4;;;;;;;;;;;;;;6311:714;;6360:14;;-1:-1:-1;;;;;6360:28:4;;6356:99;;6423:9;6019:1084;-1:-1:-1;;;6019:1084:4:o;6356:99::-;-1:-1:-1;;;6791:6:4;6835:17;;;;:11;:17;;;;;;;;;6823:29;;;;;;;;;-1:-1:-1;;;;;6823:29:4;;;;;-1:-1:-1;;;6823:29:4;;;;;;;;;;;-1:-1:-1;;;6823:29:4;;;;;;;;;;;;;6882:28;6878:107;;6949:9;6019:1084;-1:-1:-1;;;6019:1084:4:o;6878:107::-;6752:255;;;6224:815;6171:868;7065:31;;-1:-1:-1;;;7065:31:4;;;;;;;;;;;3690:157:11;3764:6;;;-1:-1:-1;;;;;3780:17:11;;;-1:-1:-1;;;;;;3780:17:11;;;;;;;3812:28;;3764:6;;;3780:17;3764:6;;3812:28;;3745:16;;3812:28;3735:112;3690:157;:::o;3324:169::-;3398:6;;;-1:-1:-1;;;;;3414:17:11;;;-1:-1:-1;;;;;;3414:17:11;;;;;;;3446:40;;3398:6;;;3414:17;3398:6;;3446:40;;3379:16;;3446:40;3369:124;3324:169;:::o;20375:650:4:-;20553:72;;-1:-1:-1;;;20553:72:4;;20533:4;;-1:-1:-1;;;;;20553:36:4;;;;;:72;;719:10:2;;20604:4:4;;20610:7;;20619:5;;20553:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20553:72:4;;;;;;;;-1:-1:-1;;20553:72:4;;;;;;;;;;;;:::i;:::-;;;20549:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20784:6;:13;20801:1;20784:18;20780:229;;20829:40;;-1:-1:-1;;;20829:40:4;;;;;;;;;;;20780:229;20969:6;20963:13;20954:6;20950:2;20946:15;20939:38;20549:470;-1:-1:-1;;;;;;20671:55:4;-1:-1:-1;;;20671:55:4;;-1:-1:-1;20549:470:4;20375:650;;;;;;:::o;328:703:12:-;384:13;601:5;610:1;601:10;597:51;;-1:-1:-1;;627:10:12;;;;;;;;;;;;-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;;;;;902:56:12;;;;;;;;-1:-1:-1;972:11:12;981:2;972:11;;:::i;:::-;;;844:150;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:13;-1:-1:-1;;;;;;88:32:13;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:13:o;592:118::-;678:5;671:13;664:21;657:5;654:32;644:60;;700:1;697;690:12;715:241;771:6;824:2;812:9;803:7;799:23;795:32;792:52;;;840:1;837;830:12;792:52;879:9;866:23;898:28;920:5;898:28;:::i;961:258::-;1033:1;1043:113;1057:6;1054:1;1051:13;1043:113;;;1133:11;;;1127:18;1114:11;;;1107:39;1079:2;1072:10;1043:113;;;1174:6;1171:1;1168:13;1165:48;;;-1:-1:-1;;1209:1:13;1191:16;;1184:27;961:258::o;1224:::-;1266:3;1304:5;1298:12;1331:6;1326:3;1319:19;1347:63;1403:6;1396:4;1391:3;1387:14;1380:4;1373:5;1369:16;1347:63;:::i;:::-;1464:2;1443:15;-1:-1:-1;;1439:29:13;1430:39;;;;1471:4;1426:50;;1224:258;-1:-1:-1;;1224:258:13:o;1487:220::-;1636:2;1625:9;1618:21;1599:4;1656:45;1697:2;1686:9;1682:18;1674:6;1656:45;:::i;1712:180::-;1771:6;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;-1:-1:-1;1863:23:13;;1712:180;-1:-1:-1;1712:180:13:o;2105:173::-;2173:20;;-1:-1:-1;;;;;2222:31:13;;2212:42;;2202:70;;2268:1;2265;2258:12;2202:70;2105:173;;;:::o;2283:254::-;2351:6;2359;2412:2;2400:9;2391:7;2387:23;2383:32;2380:52;;;2428:1;2425;2418:12;2380:52;2451:29;2470:9;2451:29;:::i;:::-;2441:39;2527:2;2512:18;;;;2499:32;;-1:-1:-1;;;2283:254:13:o;2542:615::-;2628:6;2636;2689:2;2677:9;2668:7;2664:23;2660:32;2657:52;;;2705:1;2702;2695:12;2657:52;2745:9;2732:23;2774:18;2815:2;2807:6;2804:14;2801:34;;;2831:1;2828;2821:12;2801:34;2869:6;2858:9;2854:22;2844:32;;2914:7;2907:4;2903:2;2899:13;2895:27;2885:55;;2936:1;2933;2926:12;2885:55;2976:2;2963:16;3002:2;2994:6;2991:14;2988:34;;;3018:1;3015;3008:12;2988:34;3071:7;3066:2;3056:6;3053:1;3049:14;3045:2;3041:23;3037:32;3034:45;3031:65;;;3092:1;3089;3082:12;3031:65;3123:2;3115:11;;;;;3145:6;;-1:-1:-1;2542:615:13;;-1:-1:-1;;;;2542:615:13:o;3344:328::-;3421:6;3429;3437;3490:2;3478:9;3469:7;3465:23;3461:32;3458:52;;;3506:1;3503;3496:12;3458:52;3529:29;3548:9;3529:29;:::i;:::-;3519:39;;3577:38;3611:2;3600:9;3596:18;3577:38;:::i;:::-;3567:48;;3662:2;3651:9;3647:18;3634:32;3624:42;;3344:328;;;;;:::o;3906:592::-;3977:6;3985;4038:2;4026:9;4017:7;4013:23;4009:32;4006:52;;;4054:1;4051;4044:12;4006:52;4094:9;4081:23;4123:18;4164:2;4156:6;4153:14;4150:34;;;4180:1;4177;4170:12;4150:34;4218:6;4207:9;4203:22;4193:32;;4263:7;4256:4;4252:2;4248:13;4244:27;4234:55;;4285:1;4282;4275:12;4234:55;4325:2;4312:16;4351:2;4343:6;4340:14;4337:34;;;4367:1;4364;4357:12;4337:34;4412:7;4407:2;4398:6;4394:2;4390:15;4386:24;4383:37;4380:57;;;4433:1;4430;4423:12;4503:186;4562:6;4615:2;4603:9;4594:7;4590:23;4586:32;4583:52;;;4631:1;4628;4621:12;4583:52;4654:29;4673:9;4654:29;:::i;4694:315::-;4759:6;4767;4820:2;4808:9;4799:7;4795:23;4791:32;4788:52;;;4836:1;4833;4826:12;4788:52;4859:29;4878:9;4859:29;:::i;:::-;4849:39;;4938:2;4927:9;4923:18;4910:32;4951:28;4973:5;4951:28;:::i;:::-;4998:5;4988:15;;;4694:315;;;;;:::o;5014:127::-;5075:10;5070:3;5066:20;5063:1;5056:31;5106:4;5103:1;5096:15;5130:4;5127:1;5120:15;5146:1138;5241:6;5249;5257;5265;5318:3;5306:9;5297:7;5293:23;5289:33;5286:53;;;5335:1;5332;5325:12;5286:53;5358:29;5377:9;5358:29;:::i;:::-;5348:39;;5406:38;5440:2;5429:9;5425:18;5406:38;:::i;:::-;5396:48;;5491:2;5480:9;5476:18;5463:32;5453:42;;5546:2;5535:9;5531:18;5518:32;5569:18;5610:2;5602:6;5599:14;5596:34;;;5626:1;5623;5616:12;5596:34;5664:6;5653:9;5649:22;5639:32;;5709:7;5702:4;5698:2;5694:13;5690:27;5680:55;;5731:1;5728;5721:12;5680:55;5767:2;5754:16;5789:2;5785;5782:10;5779:36;;;5795:18;;:::i;:::-;5870:2;5864:9;5838:2;5924:13;;-1:-1:-1;;5920:22:13;;;5944:2;5916:31;5912:40;5900:53;;;5968:18;;;5988:22;;;5965:46;5962:72;;;6014:18;;:::i;:::-;6054:10;6050:2;6043:22;6089:2;6081:6;6074:18;6129:7;6124:2;6119;6115;6111:11;6107:20;6104:33;6101:53;;;6150:1;6147;6140:12;6101:53;6206:2;6201;6197;6193:11;6188:2;6180:6;6176:15;6163:46;6251:1;6246:2;6241;6233:6;6229:15;6225:24;6218:35;6272:6;6262:16;;;;;;;5146:1138;;;;;;;:::o;6289:260::-;6357:6;6365;6418:2;6406:9;6397:7;6393:23;6389:32;6386:52;;;6434:1;6431;6424:12;6386:52;6457:29;6476:9;6457:29;:::i;:::-;6447:39;;6505:38;6539:2;6528:9;6524:18;6505:38;:::i;:::-;6495:48;;6289:260;;;;;:::o;6554:414::-;6756:2;6738:21;;;6795:2;6775:18;;;6768:30;6834:34;6829:2;6814:18;;6807:62;-1:-1:-1;;;6900:2:13;6885:18;;6878:48;6958:3;6943:19;;6554:414::o;7327:380::-;7406:1;7402:12;;;;7449;;;7470:61;;7524:4;7516:6;7512:17;7502:27;;7470:61;7577:2;7569:6;7566:14;7546:18;7543:38;7540:161;;7623:10;7618:3;7614:20;7611:1;7604:31;7658:4;7655:1;7648:15;7686:4;7683:1;7676:15;7540:161;;7327:380;;;:::o;7712:583::-;-1:-1:-1;;;;;7929:32:13;;7911:51;;7998:2;7993;7978:18;;7971:30;;;8017:18;;8010:34;;;-1:-1:-1;;;;;;8056:31:13;;8053:51;;;8100:1;8097;8090:12;8053:51;8134:6;8131:1;8127:14;8191:6;8183;8178:2;8167:9;8163:18;8150:48;8268:1;8221:22;;8245:2;8217:31;8257:13;;;-1:-1:-1;8217:31:13;7712:583;-1:-1:-1;;;7712:583:13:o;8300:245::-;8367:6;8420:2;8408:9;8399:7;8395:23;8391:32;8388:52;;;8436:1;8433;8426:12;8388:52;8468:9;8462:16;8487:28;8509:5;8487:28;:::i;8969:127::-;9030:10;9025:3;9021:20;9018:1;9011:31;9061:4;9058:1;9051:15;9085:4;9082:1;9075:15;9519:127;9580:10;9575:3;9571:20;9568:1;9561:31;9611:4;9608:1;9601:15;9635:4;9632:1;9625:15;9651:135;9690:3;9711:17;;;9708:43;;9731:18;;:::i;:::-;-1:-1:-1;9778:1:13;9767:13;;9651:135::o;9791:168::-;9831:7;9897:1;9893;9889:6;9885:14;9882:1;9879:21;9874:1;9867:9;9860:17;9856:45;9853:71;;;9904:18;;:::i;:::-;-1:-1:-1;9944:9:13;;9791:168::o;9964:127::-;10025:10;10020:3;10016:20;10013:1;10006:31;10056:4;10053:1;10046:15;10080:4;10077:1;10070:15;10096:120;10136:1;10162;10152:35;;10167:18;;:::i;:::-;-1:-1:-1;10201:9:13;;10096:120::o;10221:125::-;10261:4;10289:1;10286;10283:8;10280:34;;;10294:18;;:::i;:::-;-1:-1:-1;10331:9:13;;10221:125::o;10351:405::-;10553:2;10535:21;;;10592:2;10572:18;;;10565:30;10631:34;10626:2;10611:18;;10604:62;-1:-1:-1;;;10697:2:13;10682:18;;10675:39;10746:3;10731:19;;10351:405::o;11525:128::-;11565:3;11596:1;11592:6;11589:1;11586:13;11583:39;;;11602:18;;:::i;:::-;-1:-1:-1;11638:9:13;;11525:128::o;14420:973::-;14505:12;;14470:3;;14560:1;14580:18;;;;14633;;;;14660:61;;14714:4;14706:6;14702:17;14692:27;;14660:61;14740:2;14788;14780:6;14777:14;14757:18;14754:38;14751:161;;14834:10;14829:3;14825:20;14822:1;14815:31;14869:4;14866:1;14859:15;14897:4;14894:1;14887:15;14751:161;14928:18;14955:104;;;;15073:1;15068:319;;;;14921:466;;14955:104;-1:-1:-1;;14988:24:13;;14976:37;;15033:16;;;;-1:-1:-1;14955:104:13;;15068:319;14367:1;14360:14;;;14404:4;14391:18;;15162:1;15176:165;15190:6;15187:1;15184:13;15176:165;;;15268:14;;15255:11;;;15248:35;15311:16;;;;15205:10;;15176:165;;;15180:3;;15370:6;15365:3;15361:16;15354:23;;14921:466;;;;;;;14420:973;;;;:::o;15398:456::-;15619:3;15647:38;15681:3;15673:6;15647:38;:::i;:::-;15714:6;15708:13;15730:52;15775:6;15771:2;15764:4;15756:6;15752:17;15730:52;:::i;:::-;15798:50;15840:6;15836:2;15832:15;15824:6;15798:50;:::i;:::-;15791:57;15398:456;-1:-1:-1;;;;;;;15398:456:13:o;17183:489::-;-1:-1:-1;;;;;17452:15:13;;;17434:34;;17504:15;;17499:2;17484:18;;17477:43;17551:2;17536:18;;17529:34;;;17599:3;17594:2;17579:18;;17572:31;;;17377:4;;17620:46;;17646:19;;17638:6;17620:46;:::i;:::-;17612:54;17183:489;-1:-1:-1;;;;;;17183:489:13:o;17677:249::-;17746:6;17799:2;17787:9;17778:7;17774:23;17770:32;17767:52;;;17815:1;17812;17805:12;17767:52;17847:9;17841:16;17866:30;17890:5;17866:30;:::i;17931:112::-;17963:1;17989;17979:35;;17994:18;;:::i;:::-;-1:-1:-1;18028:9:13;;17931:112::o

Swarm Source

ipfs://90ca11a0e89ee2bcbcfc17da2b62f8c7f5fcf4237d7eaf97381e9d9b2b7609db
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.