ETH Price: $3,911.94 (+7.07%)

Token

Super Shiba Club (SSC)
 

Overview

Max Total Supply

10,010 SSC

Holders

2,997

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 SSC
0x44c72539f0cb7a2f3922a9be3a0f68af56fd8825
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

10,010 Super Shibas, handcrafted by @LaughAndBelly.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SuperShibaClub

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 14: SuperShibaClub.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./SafeMath.sol";

contract SuperShibaClub is ERC721Enumerable, Ownable {
    using SafeMath for uint256;

    uint256 public constant MAX_SHIBAS = 10010;
    uint256 public constant MAX_MINT = 5;
    uint256 public constant MAX_EARLY_MINT = 2;
    uint256 public constant PRICE = 0.05 ether;
    uint256 public constant RESERVED = 200;
    
    uint256 private reservedMinted;
    address public superShibaClubTreasury;
    string private baseTokenURI;
    bool public isRevealed;
    
    IERC721 private bssc;
    bool public isBsscSalesActive = false; // BSSC
    mapping(uint256 => bool) private bsscRedeemed;

    bool public isWhitelistSalesActive = false; // Whitelist
    mapping(address => uint256) private whitelistSales;
    mapping(address => bool) private whitelistedMap;

    bool public isPublicSalesActive = false;

    constructor(address _treasury, address _bssc) ERC721("Super Shiba Club", "SSC") {
        superShibaClubTreasury = _treasury;
        bssc = IERC721(_bssc);
    }
    
    function treasuryReserve() public onlyOwner {        
        uint supply = totalSupply();
        uint maxPerTx = 50;
        require(reservedMinted < RESERVED, "Reserved fully minted");
        require(supply.add(maxPerTx) <= MAX_SHIBAS.sub(RESERVED).add(reservedMinted), "Fully minted");
        for (uint256 i; i < maxPerTx; i++) {
            _safeMint(superShibaClubTreasury, supply + i);
        }
        reservedMinted = reservedMinted.add(maxPerTx);
    }
    
    function bsscMint(uint256[] calldata ids) public {
        require(isBsscSalesActive, "BAMC x Super Shiba Club sales not active");
        uint256 supply = totalSupply();
        require(supply.add(ids.length) <= MAX_SHIBAS.sub(RESERVED).add(reservedMinted), "Fully minted");
        
        for (uint256 i; i < ids.length; i++) {
            require(bsscRedeemed[ids[i]] == false, "Token already redeemed!");
            require(bssc.ownerOf(ids[i]) == msg.sender, "Token owner only");
            _safeMint(msg.sender, supply + i);
            bsscRedeemed[ids[i]] = true;
        }
    }
    
    function isBsscRedeemed(uint256 bsscId) public view returns (bool){
        require(bssc.ownerOf(bsscId) != address(0), "Token not exist");
        return bsscRedeemed[bsscId];
    }

    function whitelistMint(uint256 num) public payable {
        require(isWhitelistSalesActive, "Whitelist sales not active");
        (bool isWhitelist, bool isBssc, uint256 minted) = isWhitelisted(msg.sender);
        require(isWhitelist || isBssc, "Not whitelisted");
        uint256 max;
        if(isWhitelist || isBssc){
            max = MAX_EARLY_MINT;
            if(minted > 0 && minted <= MAX_EARLY_MINT){
                max = max.sub(minted);
            }
            if(isWhitelist && isBssc){
                max = MAX_EARLY_MINT.add(MAX_EARLY_MINT).sub(minted);
            }
        }
        require(
            num <= max,
            "Reached max, wait for public sales"
        );
        uint256 supply = totalSupply();
        require(supply.add(num) <= MAX_SHIBAS.sub(RESERVED).add(reservedMinted), "Fully minted");
        require(msg.value >= num * PRICE, "Invalid price");

        for (uint256 i; i < num; i++) {
            _safeMint(msg.sender, supply + i);
        }
        whitelistSales[msg.sender] = whitelistSales[msg.sender].add(num);
    }

    function isWhitelisted(address _address) public view returns (bool, bool, uint256) {
        return (whitelistedMap[_address], bssc.balanceOf(_address) > 0, whitelistSales[_address]);
    }

    function publicMint(uint256 num) public payable {
        require(isPublicSalesActive, "Public sales not active");
        uint256 supply = totalSupply();
        require(num <= MAX_MINT, "Reached max per transaction");
        require(supply.add(num) <= MAX_SHIBAS.sub(RESERVED).add(reservedMinted), "Fully minted");
        require(msg.value >= num * PRICE, "Invalid price");

        for (uint256 i; i < num; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }
    
    function withdraw() public onlyOwner {
        payable(superShibaClubTreasury).transfer(address(this).balance);
    }

    function setSalesState(bool _bssc, bool _whitelist, bool _public) external onlyOwner {
        isBsscSalesActive = _bssc;
        isWhitelistSalesActive = _whitelist;
        isPublicSalesActive = _public;
    }

    function addWhitelist(address[] calldata _address) public onlyOwner {
        for(uint i = 0; i < _address.length; i++){
            whitelistedMap[_address[i]] = true;
        }
    }

    function removeWhitelist(address[] calldata _address) public onlyOwner {
        for(uint i = 0; i < _address.length; i++){
            whitelistedMap[_address[i]] = false;
        }
    }

    function changeRevealed() public onlyOwner {
        isRevealed = !isRevealed;
    }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 14: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 3 of 14: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 4 of 14: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 5 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 6 of 14: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 7 of 14: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 8 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 9 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 10 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 11 of 14: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

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

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

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

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

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

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

File 12 of 14: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 13 of 14: Strings.sol
// SPDX-License-Identifier: MIT

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":"_treasury","type":"address"},{"internalType":"address","name":"_bssc","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_EARLY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SHIBAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"bsscMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bsscId","type":"uint256"}],"name":"isBsscRedeemed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBsscSalesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSalesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSalesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_bssc","type":"bool"},{"internalType":"bool","name":"_whitelist","type":"bool"},{"internalType":"bool","name":"_public","type":"bool"}],"name":"setSalesState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superShibaClubTreasury","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600e805460ff60a81b191690556010805460ff199081169091556013805490911690553480156200003457600080fd5b5060405162002f4138038062002f41833981016040819052620000579162000236565b604080518082018252601081526f29bab832b91029b434b1309021b63ab160811b60208083019182528351808501909452600384526253534360e81b908401528151919291620000aa9160009162000173565b508051620000c090600190602084019062000173565b505050620000dd620000d76200011d60201b60201c565b62000121565b600c80546001600160a01b039384166001600160a01b0319909116179055600e80549190921661010002610100600160a81b0319909116179055620002aa565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000181906200026d565b90600052602060002090601f016020900481019282620001a55760008555620001f0565b82601f10620001c057805160ff1916838001178555620001f0565b82800160010185558215620001f0579182015b82811115620001f0578251825591602001919060010190620001d3565b50620001fe92915062000202565b5090565b5b80821115620001fe576000815560010162000203565b80516001600160a01b03811681146200023157600080fd5b919050565b6000806040838503121562000249578182fd5b620002548362000219565b9150620002646020840162000219565b90509250929050565b600181811c908216806200028257607f821691505b60208210811415620002a457634e487b7160e01b600052602260045260246000fd5b50919050565b612c8780620002ba6000396000f3fe6080604052600436106102465760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461066f578063e985e9c51461068f578063edac985b146106d8578063f0292a03146106f8578063f2fde38b1461070d578063f4114a221461072d57600080fd5b8063a22cb465146105df578063aa592f25146105ff578063b88d4fde14610614578063beab8b8514610634578063c1bbd93c1461064e57600080fd5b8063868ff4a2116100fd578063868ff4a21461055e57806387cf0683146105715780638d859f3e146105915780638da5cb5b146105ac57806395d89b41146105ca57600080fd5b80636352211e146104d45780636b9f7b42146104f457806370a0823114610514578063715018a61461053457806385d998021461054957600080fd5b80633a87bfe0116101c757806354214f691161018b57806354214f691461045a57806355f804b31461047457806358a0b18d1461049457806359297dbf146104a95780635fbae649146104be57600080fd5b80633a87bfe0146103ae5780633af32abf146103c85780633ccfd60b1461040557806342842e0e1461041a5780634f6ccce71461043a57600080fd5b8063232452161161020e578063232452161461031b57806323b872dd1461033b5780632a7302f41461035b5780632db115441461037b5780632f745c591461038e57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612895565b61074d565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610778565b60405161027791906129db565b3480156102ae57600080fd5b506102c26102bd366004612913565b61080a565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046127e8565b6108a4565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa610336366004612813565b6109ba565b34801561034757600080fd5b506102fa6103563660046126f7565b610a64565b34801561036757600080fd5b506102fa610376366004612853565b610a95565b6102fa610389366004612913565b610aff565b34801561039a57600080fd5b5061030d6103a93660046127e8565b610c71565b3480156103ba57600080fd5b5060105461026b9060ff1681565b3480156103d457600080fd5b506103e86103e3366004612687565b610d07565b604080519315158452911515602084015290820152606001610277565b34801561041157600080fd5b506102fa610dce565b34801561042657600080fd5b506102fa6104353660046126f7565b610e34565b34801561044657600080fd5b5061030d610455366004612913565b610e4f565b34801561046657600080fd5b50600e5461026b9060ff1681565b34801561048057600080fd5b506102fa61048f3660046128cd565b610ef0565b3480156104a057600080fd5b5061030d600281565b3480156104b557600080fd5b506102fa610f31565b3480156104ca57600080fd5b5061030d61271a81565b3480156104e057600080fd5b506102c26104ef366004612913565b611040565b34801561050057600080fd5b506102fa61050f366004612813565b6110b7565b34801561052057600080fd5b5061030d61052f366004612687565b611373565b34801561054057600080fd5b506102fa6113fa565b34801561055557600080fd5b506102fa611430565b6102fa61056c366004612913565b61146e565b34801561057d57600080fd5b50600c546102c2906001600160a01b031681565b34801561059d57600080fd5b5061030d66b1a2bc2ec5000081565b3480156105b857600080fd5b50600a546001600160a01b03166102c2565b3480156105d657600080fd5b506102956116ca565b3480156105eb57600080fd5b506102fa6105fa3660046127b4565b6116d9565b34801561060b57600080fd5b5061030d60c881565b34801561062057600080fd5b506102fa61062f366004612737565b61179e565b34801561064057600080fd5b5060135461026b9060ff1681565b34801561065a57600080fd5b50600e5461026b90600160a81b900460ff1681565b34801561067b57600080fd5b5061029561068a366004612913565b6117d0565b34801561069b57600080fd5b5061026b6106aa3660046126bf565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106e457600080fd5b506102fa6106f3366004612813565b6118ab565b34801561070457600080fd5b5061030d600581565b34801561071957600080fd5b506102fa610728366004612687565b611955565b34801561073957600080fd5b5061026b610748366004612913565b6119ed565b60006001600160e01b0319821663780e9d6360e01b1480610772575061077282611ad9565b92915050565b60606000805461078790612b7a565b80601f01602080910402602001604051908101604052809291908181526020018280546107b390612b7a565b80156108005780601f106107d557610100808354040283529160200191610800565b820191906000526020600020905b8154815290600101906020018083116107e357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108af82611040565b9050806001600160a01b0316836001600160a01b0316141561091d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161087f565b336001600160a01b0382161480610939575061093981336106aa565b6109ab5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087f565b6109b58383611b29565b505050565b600a546001600160a01b031633146109e45760405162461bcd60e51b815260040161087f90612a66565b60005b818110156109b557600060126000858585818110610a1557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a2a9190612687565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610a5c81612bb5565b9150506109e7565b610a6e3382611b97565b610a8a5760405162461bcd60e51b815260040161087f90612a9b565b6109b5838383611c8e565b600a546001600160a01b03163314610abf5760405162461bcd60e51b815260040161087f90612a66565b600e8054931515600160a81b0260ff60a81b19909416939093179092556010805491151560ff199283161790556013805492151592909116919091179055565b60135460ff16610b515760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c6573206e6f7420616374697665000000000000000000604482015260640161087f565b6000610b5c60085490565b90506005821115610baf5760405162461bcd60e51b815260206004820152601b60248201527f52656163686564206d617820706572207472616e73616374696f6e0000000000604482015260640161087f565b600b54610bc990610bc361271a60c8611e39565b90611e45565b610bd38284611e45565b1115610bf15760405162461bcd60e51b815260040161087f90612a40565b610c0266b1a2bc2ec5000083612b18565b341015610c415760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b604482015260640161087f565b60005b828110156109b557610c5f33610c5a8385612aec565b611e51565b80610c6981612bb5565b915050610c44565b6000610c7c83611373565b8210610cde5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161087f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381811660008181526012602052604080822054600e5491516370a0823160e01b8152600481019490945291938493849360ff1692849261010090910416906370a082319060240160206040518083038186803b158015610d6e57600080fd5b505afa158015610d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da6919061292b565b6001600160a01b03871660009081526011602052604090205492955011925090509193909250565b600a546001600160a01b03163314610df85760405162461bcd60e51b815260040161087f90612a66565b600c546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610e31573d6000803e3d6000fd5b50565b6109b58383836040518060200160405280600081525061179e565b6000610e5a60085490565b8210610ebd5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161087f565b60088281548110610ede57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610f1a5760405162461bcd60e51b815260040161087f90612a66565b8051610f2d90600d906020840190612519565b5050565b600a546001600160a01b03163314610f5b5760405162461bcd60e51b815260040161087f90612a66565b6000610f6660085490565b905060006032905060c8600b5410610fb85760405162461bcd60e51b815260206004820152601560248201527414995cd95c9d995908199d5b1b1e481b5a5b9d1959605a1b604482015260640161087f565b600b54610fcc90610bc361271a60c8611e39565b610fd68383611e45565b1115610ff45760405162461bcd60e51b815260040161087f90612a40565b60005b8181101561102b57600c54611019906001600160a01b0316610c5a8386612aec565b8061102381612bb5565b915050610ff7565b50600b546110399082611e45565b600b555050565b6000818152600260205260408120546001600160a01b0316806107725760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161087f565b600e54600160a81b900460ff166111215760405162461bcd60e51b815260206004820152602860248201527f42414d43207820537570657220536869626120436c75622073616c6573206e6f604482015267742061637469766560c01b606482015260840161087f565b600061112c60085490565b600b5490915061114390610bc361271a60c8611e39565b61114d8284611e45565b111561116b5760405162461bcd60e51b815260040161087f90612a40565b60005b8281101561136d57600f600085858481811061119a57634e487b7160e01b600052603260045260246000fd5b602090810292909201358352508101919091526040016000205460ff16156112045760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20616c72656164792072656465656d656421000000000000000000604482015260640161087f565b600e54339061010090046001600160a01b0316636352211e86868581811061123c57634e487b7160e01b600052603260045260246000fd5b905060200201356040518263ffffffff1660e01b815260040161126191815260200190565b60206040518083038186803b15801561127957600080fd5b505afa15801561128d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b191906126a3565b6001600160a01b0316146112fa5760405162461bcd60e51b815260206004820152601060248201526f546f6b656e206f776e6572206f6e6c7960801b604482015260640161087f565b61130833610c5a8385612aec565b6001600f600086868581811061132e57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061136590612bb5565b91505061116e565b50505050565b60006001600160a01b0382166113de5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161087f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146114245760405162461bcd60e51b815260040161087f90612a66565b61142e6000611e6b565b565b600a546001600160a01b0316331461145a5760405162461bcd60e51b815260040161087f90612a66565b600e805460ff19811660ff90911615179055565b60105460ff166114c05760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c6573206e6f7420616374697665000000000000604482015260640161087f565b60008060006114ce33610d07565b92509250925082806114dd5750815b61151b5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161087f565b600083806115265750825b1561157757506002811580159061153e575060028211155b156115505761154d8183611e39565b90505b83801561155a5750825b15611577576115748261156e600280611e45565b90611e39565b90505b808511156115d25760405162461bcd60e51b815260206004820152602260248201527f52656163686564206d61782c207761697420666f72207075626c69632073616c604482015261657360f01b606482015260840161087f565b60006115dd60085490565b600b549091506115f490610bc361271a60c8611e39565b6115fe8288611e45565b111561161c5760405162461bcd60e51b815260040161087f90612a40565b61162d66b1a2bc2ec5000087612b18565b34101561166c5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b604482015260640161087f565b60005b868110156116975761168533610c5a8385612aec565b8061168f81612bb5565b91505061166f565b50336000908152601160205260409020546116b29087611e45565b33600090815260116020526040902055505050505050565b60606001805461078790612b7a565b6001600160a01b0382163314156117325760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117a83383611b97565b6117c45760405162461bcd60e51b815260040161087f90612a9b565b61136d84848484611ebd565b6000818152600260205260409020546060906001600160a01b031661184f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161087f565b6000611859611ef0565b9050600081511161187957604051806020016040528060008152506118a4565b8061188384611eff565b60405160200161189492919061296f565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146118d55760405162461bcd60e51b815260040161087f90612a66565b60005b818110156109b55760016012600085858581811061190657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061191b9190612687565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061194d81612bb5565b9150506118d8565b600a546001600160a01b0316331461197f5760405162461bcd60e51b815260040161087f90612a66565b6001600160a01b0381166119e45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161087f565b610e3181611e6b565b600e546040516331a9108f60e11b815260009182916101009091046001600160a01b031690636352211e90611a2a90869060040190815260200190565b60206040518083038186803b158015611a4257600080fd5b505afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a91906126a3565b6001600160a01b03161415611ac35760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015260640161087f565b506000908152600f602052604090205460ff1690565b60006001600160e01b031982166380ac58cd60e01b1480611b0a57506001600160e01b03198216635b5e139f60e01b145b8061077257506301ffc9a760e01b6001600160e01b0319831614610772565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b5e82611040565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c105760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087f565b6000611c1b83611040565b9050806001600160a01b0316846001600160a01b03161480611c565750836001600160a01b0316611c4b8461080a565b6001600160a01b0316145b80611c8657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ca182611040565b6001600160a01b031614611d095760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161087f565b6001600160a01b038216611d6b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161087f565b611d76838383612019565b611d81600082611b29565b6001600160a01b0383166000908152600360205260408120805460019290611daa908490612b37565b90915550506001600160a01b0382166000908152600360205260408120805460019290611dd8908490612aec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006118a48284612b37565b60006118a48284612aec565b610f2d8282604051806020016040528060008152506120d1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ec8848484611c8e565b611ed484848484612104565b61136d5760405162461bcd60e51b815260040161087f906129ee565b6060600d805461078790612b7a565b606081611f235750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f4d5780611f3781612bb5565b9150611f469050600a83612b04565b9150611f27565b60008167ffffffffffffffff811115611f7657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fa0576020820181803683370190505b5090505b8415611c8657611fb5600183612b37565b9150611fc2600a86612bd0565b611fcd906030612aec565b60f81b818381518110611ff057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612012600a86612b04565b9450611fa4565b6001600160a01b0383166120745761206f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612097565b816001600160a01b0316836001600160a01b031614612097576120978382612211565b6001600160a01b0382166120ae576109b5816122ae565b826001600160a01b0316826001600160a01b0316146109b5576109b58282612387565b6120db83836123cb565b6120e86000848484612104565b6109b55760405162461bcd60e51b815260040161087f906129ee565b60006001600160a01b0384163b1561220657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061214890339089908890889060040161299e565b602060405180830381600087803b15801561216257600080fd5b505af1925050508015612192575060408051601f3d908101601f1916820190925261218f918101906128b1565b60015b6121ec573d8080156121c0576040519150601f19603f3d011682016040523d82523d6000602084013e6121c5565b606091505b5080516121e45760405162461bcd60e51b815260040161087f906129ee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c86565b506001949350505050565b6000600161221e84611373565b6122289190612b37565b60008381526007602052604090205490915080821461227b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906122c090600190612b37565b600083815260096020526040812054600880549394509092849081106122f657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061232557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061236b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061239283611373565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124215760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087f565b6000818152600260205260409020546001600160a01b0316156124865760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087f565b61249260008383612019565b6001600160a01b03821660009081526003602052604081208054600192906124bb908490612aec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461252590612b7a565b90600052602060002090601f016020900481019282612547576000855561258d565b82601f1061256057805160ff191683800117855561258d565b8280016001018555821561258d579182015b8281111561258d578251825591602001919060010190612572565b5061259992915061259d565b5090565b5b80821115612599576000815560010161259e565b600067ffffffffffffffff808411156125cd576125cd612c10565b604051601f8501601f19908116603f011681019082821181831017156125f5576125f5612c10565b8160405280935085815286868601111561260e57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612639578182fd5b50813567ffffffffffffffff811115612650578182fd5b6020830191508360208260051b850101111561266b57600080fd5b9250929050565b8035801515811461268257600080fd5b919050565b600060208284031215612698578081fd5b81356118a481612c26565b6000602082840312156126b4578081fd5b81516118a481612c26565b600080604083850312156126d1578081fd5b82356126dc81612c26565b915060208301356126ec81612c26565b809150509250929050565b60008060006060848603121561270b578081fd5b833561271681612c26565b9250602084013561272681612c26565b929592945050506040919091013590565b6000806000806080858703121561274c578081fd5b843561275781612c26565b9350602085013561276781612c26565b925060408501359150606085013567ffffffffffffffff811115612789578182fd5b8501601f81018713612799578182fd5b6127a8878235602084016125b2565b91505092959194509250565b600080604083850312156127c6578182fd5b82356127d181612c26565b91506127df60208401612672565b90509250929050565b600080604083850312156127fa578182fd5b823561280581612c26565b946020939093013593505050565b60008060208385031215612825578182fd5b823567ffffffffffffffff81111561283b578283fd5b61284785828601612628565b90969095509350505050565b600080600060608486031215612867578283fd5b61287084612672565b925061287e60208501612672565b915061288c60408501612672565b90509250925092565b6000602082840312156128a6578081fd5b81356118a481612c3b565b6000602082840312156128c2578081fd5b81516118a481612c3b565b6000602082840312156128de578081fd5b813567ffffffffffffffff8111156128f4578182fd5b8201601f81018413612904578182fd5b611c86848235602084016125b2565b600060208284031215612924578081fd5b5035919050565b60006020828403121561293c578081fd5b5051919050565b6000815180845261295b816020860160208601612b4e565b601f01601f19169290920160200192915050565b60008351612981818460208801612b4e565b835190830190612995818360208801612b4e565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129d190830184612943565b9695505050505050565b6020815260006118a46020830184612943565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600c908201526b119d5b1b1e481b5a5b9d195960a21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612aff57612aff612be4565b500190565b600082612b1357612b13612bfa565b500490565b6000816000190483118215151615612b3257612b32612be4565b500290565b600082821015612b4957612b49612be4565b500390565b60005b83811015612b69578181015183820152602001612b51565b8381111561136d5750506000910152565b600181811c90821680612b8e57607f821691505b60208210811415612baf57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612bc957612bc9612be4565b5060010190565b600082612bdf57612bdf612bfa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e3157600080fd5b6001600160e01b031981168114610e3157600080fdfea2646970667358221220cb9b456120b0a1b353db74f6df3b4fc1af5318443b676bdf4db489027921265864736f6c634300080400330000000000000000000000000831ead2a2259ad76e228d2ce51c7efe70b67660000000000000000000000000df7cafb1449e62aa6ba35afb8f692feb67356e25

Deployed Bytecode

0x6080604052600436106102465760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461066f578063e985e9c51461068f578063edac985b146106d8578063f0292a03146106f8578063f2fde38b1461070d578063f4114a221461072d57600080fd5b8063a22cb465146105df578063aa592f25146105ff578063b88d4fde14610614578063beab8b8514610634578063c1bbd93c1461064e57600080fd5b8063868ff4a2116100fd578063868ff4a21461055e57806387cf0683146105715780638d859f3e146105915780638da5cb5b146105ac57806395d89b41146105ca57600080fd5b80636352211e146104d45780636b9f7b42146104f457806370a0823114610514578063715018a61461053457806385d998021461054957600080fd5b80633a87bfe0116101c757806354214f691161018b57806354214f691461045a57806355f804b31461047457806358a0b18d1461049457806359297dbf146104a95780635fbae649146104be57600080fd5b80633a87bfe0146103ae5780633af32abf146103c85780633ccfd60b1461040557806342842e0e1461041a5780634f6ccce71461043a57600080fd5b8063232452161161020e578063232452161461031b57806323b872dd1461033b5780632a7302f41461035b5780632db115441461037b5780632f745c591461038e57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612895565b61074d565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610778565b60405161027791906129db565b3480156102ae57600080fd5b506102c26102bd366004612913565b61080a565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046127e8565b6108a4565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa610336366004612813565b6109ba565b34801561034757600080fd5b506102fa6103563660046126f7565b610a64565b34801561036757600080fd5b506102fa610376366004612853565b610a95565b6102fa610389366004612913565b610aff565b34801561039a57600080fd5b5061030d6103a93660046127e8565b610c71565b3480156103ba57600080fd5b5060105461026b9060ff1681565b3480156103d457600080fd5b506103e86103e3366004612687565b610d07565b604080519315158452911515602084015290820152606001610277565b34801561041157600080fd5b506102fa610dce565b34801561042657600080fd5b506102fa6104353660046126f7565b610e34565b34801561044657600080fd5b5061030d610455366004612913565b610e4f565b34801561046657600080fd5b50600e5461026b9060ff1681565b34801561048057600080fd5b506102fa61048f3660046128cd565b610ef0565b3480156104a057600080fd5b5061030d600281565b3480156104b557600080fd5b506102fa610f31565b3480156104ca57600080fd5b5061030d61271a81565b3480156104e057600080fd5b506102c26104ef366004612913565b611040565b34801561050057600080fd5b506102fa61050f366004612813565b6110b7565b34801561052057600080fd5b5061030d61052f366004612687565b611373565b34801561054057600080fd5b506102fa6113fa565b34801561055557600080fd5b506102fa611430565b6102fa61056c366004612913565b61146e565b34801561057d57600080fd5b50600c546102c2906001600160a01b031681565b34801561059d57600080fd5b5061030d66b1a2bc2ec5000081565b3480156105b857600080fd5b50600a546001600160a01b03166102c2565b3480156105d657600080fd5b506102956116ca565b3480156105eb57600080fd5b506102fa6105fa3660046127b4565b6116d9565b34801561060b57600080fd5b5061030d60c881565b34801561062057600080fd5b506102fa61062f366004612737565b61179e565b34801561064057600080fd5b5060135461026b9060ff1681565b34801561065a57600080fd5b50600e5461026b90600160a81b900460ff1681565b34801561067b57600080fd5b5061029561068a366004612913565b6117d0565b34801561069b57600080fd5b5061026b6106aa3660046126bf565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106e457600080fd5b506102fa6106f3366004612813565b6118ab565b34801561070457600080fd5b5061030d600581565b34801561071957600080fd5b506102fa610728366004612687565b611955565b34801561073957600080fd5b5061026b610748366004612913565b6119ed565b60006001600160e01b0319821663780e9d6360e01b1480610772575061077282611ad9565b92915050565b60606000805461078790612b7a565b80601f01602080910402602001604051908101604052809291908181526020018280546107b390612b7a565b80156108005780601f106107d557610100808354040283529160200191610800565b820191906000526020600020905b8154815290600101906020018083116107e357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108af82611040565b9050806001600160a01b0316836001600160a01b0316141561091d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161087f565b336001600160a01b0382161480610939575061093981336106aa565b6109ab5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087f565b6109b58383611b29565b505050565b600a546001600160a01b031633146109e45760405162461bcd60e51b815260040161087f90612a66565b60005b818110156109b557600060126000858585818110610a1557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a2a9190612687565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610a5c81612bb5565b9150506109e7565b610a6e3382611b97565b610a8a5760405162461bcd60e51b815260040161087f90612a9b565b6109b5838383611c8e565b600a546001600160a01b03163314610abf5760405162461bcd60e51b815260040161087f90612a66565b600e8054931515600160a81b0260ff60a81b19909416939093179092556010805491151560ff199283161790556013805492151592909116919091179055565b60135460ff16610b515760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c6573206e6f7420616374697665000000000000000000604482015260640161087f565b6000610b5c60085490565b90506005821115610baf5760405162461bcd60e51b815260206004820152601b60248201527f52656163686564206d617820706572207472616e73616374696f6e0000000000604482015260640161087f565b600b54610bc990610bc361271a60c8611e39565b90611e45565b610bd38284611e45565b1115610bf15760405162461bcd60e51b815260040161087f90612a40565b610c0266b1a2bc2ec5000083612b18565b341015610c415760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b604482015260640161087f565b60005b828110156109b557610c5f33610c5a8385612aec565b611e51565b80610c6981612bb5565b915050610c44565b6000610c7c83611373565b8210610cde5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161087f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381811660008181526012602052604080822054600e5491516370a0823160e01b8152600481019490945291938493849360ff1692849261010090910416906370a082319060240160206040518083038186803b158015610d6e57600080fd5b505afa158015610d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da6919061292b565b6001600160a01b03871660009081526011602052604090205492955011925090509193909250565b600a546001600160a01b03163314610df85760405162461bcd60e51b815260040161087f90612a66565b600c546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610e31573d6000803e3d6000fd5b50565b6109b58383836040518060200160405280600081525061179e565b6000610e5a60085490565b8210610ebd5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161087f565b60088281548110610ede57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610f1a5760405162461bcd60e51b815260040161087f90612a66565b8051610f2d90600d906020840190612519565b5050565b600a546001600160a01b03163314610f5b5760405162461bcd60e51b815260040161087f90612a66565b6000610f6660085490565b905060006032905060c8600b5410610fb85760405162461bcd60e51b815260206004820152601560248201527414995cd95c9d995908199d5b1b1e481b5a5b9d1959605a1b604482015260640161087f565b600b54610fcc90610bc361271a60c8611e39565b610fd68383611e45565b1115610ff45760405162461bcd60e51b815260040161087f90612a40565b60005b8181101561102b57600c54611019906001600160a01b0316610c5a8386612aec565b8061102381612bb5565b915050610ff7565b50600b546110399082611e45565b600b555050565b6000818152600260205260408120546001600160a01b0316806107725760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161087f565b600e54600160a81b900460ff166111215760405162461bcd60e51b815260206004820152602860248201527f42414d43207820537570657220536869626120436c75622073616c6573206e6f604482015267742061637469766560c01b606482015260840161087f565b600061112c60085490565b600b5490915061114390610bc361271a60c8611e39565b61114d8284611e45565b111561116b5760405162461bcd60e51b815260040161087f90612a40565b60005b8281101561136d57600f600085858481811061119a57634e487b7160e01b600052603260045260246000fd5b602090810292909201358352508101919091526040016000205460ff16156112045760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20616c72656164792072656465656d656421000000000000000000604482015260640161087f565b600e54339061010090046001600160a01b0316636352211e86868581811061123c57634e487b7160e01b600052603260045260246000fd5b905060200201356040518263ffffffff1660e01b815260040161126191815260200190565b60206040518083038186803b15801561127957600080fd5b505afa15801561128d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b191906126a3565b6001600160a01b0316146112fa5760405162461bcd60e51b815260206004820152601060248201526f546f6b656e206f776e6572206f6e6c7960801b604482015260640161087f565b61130833610c5a8385612aec565b6001600f600086868581811061132e57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061136590612bb5565b91505061116e565b50505050565b60006001600160a01b0382166113de5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161087f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146114245760405162461bcd60e51b815260040161087f90612a66565b61142e6000611e6b565b565b600a546001600160a01b0316331461145a5760405162461bcd60e51b815260040161087f90612a66565b600e805460ff19811660ff90911615179055565b60105460ff166114c05760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c6573206e6f7420616374697665000000000000604482015260640161087f565b60008060006114ce33610d07565b92509250925082806114dd5750815b61151b5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161087f565b600083806115265750825b1561157757506002811580159061153e575060028211155b156115505761154d8183611e39565b90505b83801561155a5750825b15611577576115748261156e600280611e45565b90611e39565b90505b808511156115d25760405162461bcd60e51b815260206004820152602260248201527f52656163686564206d61782c207761697420666f72207075626c69632073616c604482015261657360f01b606482015260840161087f565b60006115dd60085490565b600b549091506115f490610bc361271a60c8611e39565b6115fe8288611e45565b111561161c5760405162461bcd60e51b815260040161087f90612a40565b61162d66b1a2bc2ec5000087612b18565b34101561166c5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b604482015260640161087f565b60005b868110156116975761168533610c5a8385612aec565b8061168f81612bb5565b91505061166f565b50336000908152601160205260409020546116b29087611e45565b33600090815260116020526040902055505050505050565b60606001805461078790612b7a565b6001600160a01b0382163314156117325760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117a83383611b97565b6117c45760405162461bcd60e51b815260040161087f90612a9b565b61136d84848484611ebd565b6000818152600260205260409020546060906001600160a01b031661184f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161087f565b6000611859611ef0565b9050600081511161187957604051806020016040528060008152506118a4565b8061188384611eff565b60405160200161189492919061296f565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146118d55760405162461bcd60e51b815260040161087f90612a66565b60005b818110156109b55760016012600085858581811061190657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061191b9190612687565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061194d81612bb5565b9150506118d8565b600a546001600160a01b0316331461197f5760405162461bcd60e51b815260040161087f90612a66565b6001600160a01b0381166119e45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161087f565b610e3181611e6b565b600e546040516331a9108f60e11b815260009182916101009091046001600160a01b031690636352211e90611a2a90869060040190815260200190565b60206040518083038186803b158015611a4257600080fd5b505afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a91906126a3565b6001600160a01b03161415611ac35760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015260640161087f565b506000908152600f602052604090205460ff1690565b60006001600160e01b031982166380ac58cd60e01b1480611b0a57506001600160e01b03198216635b5e139f60e01b145b8061077257506301ffc9a760e01b6001600160e01b0319831614610772565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b5e82611040565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c105760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087f565b6000611c1b83611040565b9050806001600160a01b0316846001600160a01b03161480611c565750836001600160a01b0316611c4b8461080a565b6001600160a01b0316145b80611c8657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ca182611040565b6001600160a01b031614611d095760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161087f565b6001600160a01b038216611d6b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161087f565b611d76838383612019565b611d81600082611b29565b6001600160a01b0383166000908152600360205260408120805460019290611daa908490612b37565b90915550506001600160a01b0382166000908152600360205260408120805460019290611dd8908490612aec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006118a48284612b37565b60006118a48284612aec565b610f2d8282604051806020016040528060008152506120d1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ec8848484611c8e565b611ed484848484612104565b61136d5760405162461bcd60e51b815260040161087f906129ee565b6060600d805461078790612b7a565b606081611f235750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f4d5780611f3781612bb5565b9150611f469050600a83612b04565b9150611f27565b60008167ffffffffffffffff811115611f7657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fa0576020820181803683370190505b5090505b8415611c8657611fb5600183612b37565b9150611fc2600a86612bd0565b611fcd906030612aec565b60f81b818381518110611ff057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612012600a86612b04565b9450611fa4565b6001600160a01b0383166120745761206f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612097565b816001600160a01b0316836001600160a01b031614612097576120978382612211565b6001600160a01b0382166120ae576109b5816122ae565b826001600160a01b0316826001600160a01b0316146109b5576109b58282612387565b6120db83836123cb565b6120e86000848484612104565b6109b55760405162461bcd60e51b815260040161087f906129ee565b60006001600160a01b0384163b1561220657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061214890339089908890889060040161299e565b602060405180830381600087803b15801561216257600080fd5b505af1925050508015612192575060408051601f3d908101601f1916820190925261218f918101906128b1565b60015b6121ec573d8080156121c0576040519150601f19603f3d011682016040523d82523d6000602084013e6121c5565b606091505b5080516121e45760405162461bcd60e51b815260040161087f906129ee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c86565b506001949350505050565b6000600161221e84611373565b6122289190612b37565b60008381526007602052604090205490915080821461227b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906122c090600190612b37565b600083815260096020526040812054600880549394509092849081106122f657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061232557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061236b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061239283611373565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124215760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087f565b6000818152600260205260409020546001600160a01b0316156124865760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087f565b61249260008383612019565b6001600160a01b03821660009081526003602052604081208054600192906124bb908490612aec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461252590612b7a565b90600052602060002090601f016020900481019282612547576000855561258d565b82601f1061256057805160ff191683800117855561258d565b8280016001018555821561258d579182015b8281111561258d578251825591602001919060010190612572565b5061259992915061259d565b5090565b5b80821115612599576000815560010161259e565b600067ffffffffffffffff808411156125cd576125cd612c10565b604051601f8501601f19908116603f011681019082821181831017156125f5576125f5612c10565b8160405280935085815286868601111561260e57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612639578182fd5b50813567ffffffffffffffff811115612650578182fd5b6020830191508360208260051b850101111561266b57600080fd5b9250929050565b8035801515811461268257600080fd5b919050565b600060208284031215612698578081fd5b81356118a481612c26565b6000602082840312156126b4578081fd5b81516118a481612c26565b600080604083850312156126d1578081fd5b82356126dc81612c26565b915060208301356126ec81612c26565b809150509250929050565b60008060006060848603121561270b578081fd5b833561271681612c26565b9250602084013561272681612c26565b929592945050506040919091013590565b6000806000806080858703121561274c578081fd5b843561275781612c26565b9350602085013561276781612c26565b925060408501359150606085013567ffffffffffffffff811115612789578182fd5b8501601f81018713612799578182fd5b6127a8878235602084016125b2565b91505092959194509250565b600080604083850312156127c6578182fd5b82356127d181612c26565b91506127df60208401612672565b90509250929050565b600080604083850312156127fa578182fd5b823561280581612c26565b946020939093013593505050565b60008060208385031215612825578182fd5b823567ffffffffffffffff81111561283b578283fd5b61284785828601612628565b90969095509350505050565b600080600060608486031215612867578283fd5b61287084612672565b925061287e60208501612672565b915061288c60408501612672565b90509250925092565b6000602082840312156128a6578081fd5b81356118a481612c3b565b6000602082840312156128c2578081fd5b81516118a481612c3b565b6000602082840312156128de578081fd5b813567ffffffffffffffff8111156128f4578182fd5b8201601f81018413612904578182fd5b611c86848235602084016125b2565b600060208284031215612924578081fd5b5035919050565b60006020828403121561293c578081fd5b5051919050565b6000815180845261295b816020860160208601612b4e565b601f01601f19169290920160200192915050565b60008351612981818460208801612b4e565b835190830190612995818360208801612b4e565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129d190830184612943565b9695505050505050565b6020815260006118a46020830184612943565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600c908201526b119d5b1b1e481b5a5b9d195960a21b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612aff57612aff612be4565b500190565b600082612b1357612b13612bfa565b500490565b6000816000190483118215151615612b3257612b32612be4565b500290565b600082821015612b4957612b49612be4565b500390565b60005b83811015612b69578181015183820152602001612b51565b8381111561136d5750506000910152565b600181811c90821680612b8e57607f821691505b60208210811415612baf57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612bc957612bc9612be4565b5060010190565b600082612bdf57612bdf612bfa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e3157600080fd5b6001600160e01b031981168114610e3157600080fdfea2646970667358221220cb9b456120b0a1b353db74f6df3b4fc1af5318443b676bdf4db489027921265864736f6c63430008040033

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

0000000000000000000000000831ead2a2259ad76e228d2ce51c7efe70b67660000000000000000000000000df7cafb1449e62aa6ba35afb8f692feb67356e25

-----Decoded View---------------
Arg [0] : _treasury (address): 0x0831eAD2A2259ad76e228d2Ce51C7efe70b67660
Arg [1] : _bssc (address): 0xdf7cafB1449e62aA6bA35afB8F692Feb67356E25

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000831ead2a2259ad76e228d2ce51c7efe70b67660
Arg [1] : 000000000000000000000000df7cafb1449e62aa6ba35afb8f692feb67356e25


Deployed Bytecode Sourcemap

141:5054:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;909:222:4;;;;;;;;;;-1:-1:-1;909:222:4;;;;;:::i;:::-;;:::i;:::-;;;8367:14:14;;8360:22;8342:41;;8330:2;8315:18;909:222:4;;;;;;;;2349:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3860:217::-;;;;;;;;;;-1:-1:-1;3860:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7665:32:14;;;7647:51;;7635:2;7620:18;3860:217:3;7602:102:14;3398:401:3;;;;;;;;;;-1:-1:-1;3398:401:3;;;;;:::i;:::-;;:::i;:::-;;1534:111:4;;;;;;;;;;-1:-1:-1;1621:10:4;:17;1534:111;;;20608:25:14;;;20596:2;20581:18;1534:111:4;20563:76:14;4915:188:13;;;;;;;;;;-1:-1:-1;4915:188:13;;;;;:::i;:::-;;:::i;4724:330:3:-;;;;;;;;;;-1:-1:-1;4724:330:3;;;;;:::i;:::-;;:::i;4508:211:13:-;;;;;;;;;;-1:-1:-1;4508:211:13;;;;;:::i;:::-;;:::i;3672:481::-;;;;;;:::i;:::-;;:::i;1210:253:4:-;;;;;;;;;;-1:-1:-1;1210:253:4;;;;;:::i;:::-;;:::i;742:42:13:-;;;;;;;;;;-1:-1:-1;742:42:13;;;;;;;;3477:189;;;;;;;;;;-1:-1:-1;3477:189:13;;;;;:::i;:::-;;:::i;:::-;;;;8609:14:14;;8602:22;8584:41;;8668:14;;8661:22;8656:2;8641:18;;8634:50;8700:18;;;8693:34;8572:2;8557:18;3477:189:13;8539:194:14;4385:117:13;;;;;;;;;;;;;:::i;5120:179:3:-;;;;;;;;;;-1:-1:-1;5120:179:3;;;;;:::i;:::-;;:::i;1717:230:4:-;;;;;;;;;;-1:-1:-1;1717:230:4;;;;;:::i;:::-;;:::i;580:22:13:-;;;;;;;;;;-1:-1:-1;580:22:13;;;;;;;;4276:99;;;;;;;;;;-1:-1:-1;4276:99:13;;;;;:::i;:::-;;:::i;323:42::-;;;;;;;;;;;;364:1;323:42;;1131:465;;;;;;;;;;;;;:::i;233:42::-;;;;;;;;;;;;270:5;233:42;;2052:235:3;;;;;;;;;;-1:-1:-1;2052:235:3;;;;;:::i;:::-;;:::i;1606:591:13:-;;;;;;;;;;-1:-1:-1;1606:591:13;;;;;:::i;:::-;;:::i;1790:205:3:-;;;;;;;;;;-1:-1:-1;1790:205:3;;;;;:::i;:::-;;:::i;1598:92:10:-;;;;;;;;;;;;;:::i;5109:84:13:-;;;;;;;;;;;;;:::i;2395:1076::-;;;;;;:::i;:::-;;:::i;504:37::-;;;;;;;;;;-1:-1:-1;504:37:13;;;;-1:-1:-1;;;;;504:37:13;;;371:42;;;;;;;;;;;;403:10;371:42;;966:85:10;;;;;;;;;;-1:-1:-1;1038:6:10;;-1:-1:-1;;;;;1038:6:10;966:85;;2511:102:3;;;;;;;;;;;;;:::i;4144:290::-;;;;;;;;;;-1:-1:-1;4144:290:3;;;;;:::i;:::-;;:::i;419:38:13:-;;;;;;;;;;;;454:3;419:38;;5365:320:3;;;;;;;;;;-1:-1:-1;5365:320:3;;;;;:::i;:::-;;:::i;913:39:13:-;;;;;;;;;;-1:-1:-1;913:39:13;;;;;;;;639:37;;;;;;;;;;-1:-1:-1;639:37:13;;;;-1:-1:-1;;;639:37:13;;;;;;2679:329:3;;;;;;;;;;-1:-1:-1;2679:329:3;;;;;:::i;:::-;;:::i;4500:162::-;;;;;;;;;;-1:-1:-1;4500:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4620:25:3;;;4597:4;4620:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4500:162;4725:184:13;;;;;;;;;;-1:-1:-1;4725:184:13;;;;;:::i;:::-;;:::i;281:36::-;;;;;;;;;;;;316:1;281:36;;1839:189:10;;;;;;;;;;-1:-1:-1;1839:189:10;;;;;:::i;:::-;;:::i;2207:182:13:-;;;;;;;;;;-1:-1:-1;2207:182:13;;;;;:::i;:::-;;:::i;909:222:4:-;1011:4;-1:-1:-1;;;;;;1034:50:4;;-1:-1:-1;;;1034:50:4;;:90;;;1088:36;1112:11;1088:23;:36::i;:::-;1027:97;909:222;-1:-1:-1;;909:222:4:o;2349:98:3:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;7245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7245:16:3;3955:73;;;;-1:-1:-1;;;3955:73:3;;15680:2:14;3955:73:3;;;15662:21:14;15719:2;15699:18;;;15692:30;15758:34;15738:18;;;15731:62;-1:-1:-1;;;15809:18:14;;;15802:42;15861:19;;3955:73:3;;;;;;;;;-1:-1:-1;4046:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4046:24:3;;3860:217::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;-1:-1:-1;;;;;3535:11:3;:2;-1:-1:-1;;;;;3535:11:3;;;3527:57;;;;-1:-1:-1;;;3527:57:3;;17625:2:14;3527:57:3;;;17607:21:14;17664:2;17644:18;;;17637:30;17703:34;17683:18;;;17676:62;-1:-1:-1;;;17754:18:14;;;17747:31;17795:19;;3527:57:3;17597:223:14;3527:57:3;666:10:1;-1:-1:-1;;;;;3616:21:3;;;;:62;;-1:-1:-1;3641:37:3;3658:5;666:10:1;4500:162:3;:::i;3641:37::-;3595:165;;;;-1:-1:-1;;;3595:165:3;;13027:2:14;3595:165:3;;;13009:21:14;13066:2;13046:18;;;13039:30;13105:34;13085:18;;;13078:62;13176:26;13156:18;;;13149:54;13220:19;;3595:165:3;12999:246:14;3595:165:3;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3398:401;;;:::o;4915:188:13:-;1038:6:10;;-1:-1:-1;;;;;1038:6:10;666:10:1;1178:23:10;1170:68;;;;-1:-1:-1;;;1170:68:10;;;;;;;:::i;:::-;5000:6:13::1;4996:101;5012:19:::0;;::::1;4996:101;;;5081:5;5051:14;:27;5066:8;;5075:1;5066:11;;;;;-1:-1:-1::0;;;5066:11:13::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5051:27:13::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;5051:27:13;:35;;-1:-1:-1;;5051:35:13::1;::::0;::::1;;::::0;;;::::1;::::0;;5033:3;::::1;::::0;::::1;:::i;:::-;;;;4996:101;;4724:330:3::0;4913:41;666:10:1;4946:7:3;4913:18;:41::i;:::-;4905:103;;;;-1:-1:-1;;;4905:103:3;;;;;;;:::i;:::-;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;4508:211:13:-;1038:6:10;;-1:-1:-1;;;;;1038:6:10;666:10:1;1178:23:10;1170:68;;;;-1:-1:-1;;;1170:68:10;;;;;;;:::i;:::-;4603:17:13::1;:25:::0;;;::::1;;-1:-1:-1::0;;;4603:25:13::1;-1:-1:-1::0;;;;4603:25:13;;::::1;::::0;;;::::1;::::0;;;4638:22:::1;:35:::0;;;::::1;;-1:-1:-1::0;;4638:35:13;;::::1;;::::0;;4683:19:::1;:29:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;4508:211::o;3672:481::-;3738:19;;;;3730:55;;;;-1:-1:-1;;;3730:55:13;;14617:2:14;3730:55:13;;;14599:21:14;14656:2;14636:18;;;14629:30;14695:25;14675:18;;;14668:53;14738:18;;3730:55:13;14589:173:14;3730:55:13;3795:14;3812:13;1621:10:4;:17;;1534:111;3812:13:13;3795:30;;316:1;3843:3;:15;;3835:55;;;;-1:-1:-1;;;3835:55:13;;19557:2:14;3835:55:13;;;19539:21:14;19596:2;19576:18;;;19569:30;19635:29;19615:18;;;19608:57;19682:18;;3835:55:13;19529:177:14;3835:55:13;3956:14;;3927:44;;:24;270:5;454:3;3927:14;:24::i;:::-;:28;;:44::i;:::-;3908:15;:6;3919:3;3908:10;:15::i;:::-;:63;;3900:88;;;;-1:-1:-1;;;3900:88:13;;;;;;;:::i;:::-;4019:11;403:10;4019:3;:11;:::i;:::-;4006:9;:24;;3998:50;;;;-1:-1:-1;;;3998:50:13;;19913:2:14;3998:50:13;;;19895:21:14;19952:2;19932:18;;;19925:30;-1:-1:-1;;;19971:18:14;;;19964:43;20024:18;;3998:50:13;19885:163:14;3998:50:13;4064:9;4059:88;4079:3;4075:1;:7;4059:88;;;4103:33;4113:10;4125;4134:1;4125:6;:10;:::i;:::-;4103:9;:33::i;:::-;4084:3;;;;:::i;:::-;;;;4059:88;;1210:253:4;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;-1:-1:-1;;;1326:87:4;;9567:2:14;1326:87:4;;;9549:21:14;9606:2;9586:18;;;9579:30;9645:34;9625:18;;;9618:62;-1:-1:-1;;;9696:18:14;;;9689:41;9747:19;;1326:87:4;9539:233:14;1326:87:4;-1:-1:-1;;;;;;1430:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1210:253::o;3477:189:13:-;-1:-1:-1;;;;;3578:24:13;;;3539:4;3578:24;;;:14;:24;;;;;;;3604:4;;:24;;-1:-1:-1;;;3604:24:13;;;;;7647:51:14;;;;3539:4:13;;;;;;3578:24;;;3539:4;;3578:24;3604:4;;;;;:14;;7620:18:14;;3604:24:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3634:24:13;;;;;;:14;:24;;;;;;3570:89;;-1:-1:-1;3604:28:13;;-1:-1:-1;3634:24:13;-1:-1:-1;3477:189:13;;;;;:::o;4385:117::-;1038:6:10;;-1:-1:-1;;;;;1038:6:10;666:10:1;1178:23:10;1170:68;;;;-1:-1:-1;;;1170:68:10;;;;;;;:::i;:::-;4440:22:13::1;::::0;4432:63:::1;::::0;-1:-1:-1;;;;;4440:22:13;;::::1;::::0;4473:21:::1;4432:63:::0;::::1;;;::::0;4440:22:::1;4432:63:::0;4440:22;4432:63;4473:21;4440:22;4432:63;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;4385:117::o:0;5120:179:3:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;1717:230:4:-;1792:7;1827:30;1621:10;:17;;1534:111;1827:30;1819:5;:38;1811:95;;;;-1:-1:-1;;;1811:95:4;;18800:2:14;1811:95:4;;;18782:21:14;18839:2;18819:18;;;18812:30;18878:34;18858:18;;;18851:62;-1:-1:-1;;;18929:18:14;;;18922:42;18981:19;;1811:95:4;18772:234:14;1811:95:4;1923:10;1934:5;1923:17;;;;;;-1:-1:-1;;;1923:17:4;;;;;;;;;;;;;;;;;1916:24;;1717:230;;;:::o;4276:99:13:-;1038:6:10;;-1:-1:-1;;;;;1038:6:10;666:10:1;1178:23:10;1170:68;;;;-1:-1:-1;;;1170:68:10;;;;;;;:::i;:::-;4346:22:13;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;4276:99:::0;:::o;1131:465::-;1038:6:10;;-1:-1:-1;;;;;1038:6:10;666:10:1;1178:23:10;1170:68;;;;-1:-1:-1;;;1170:68:10;;;;;;;:::i;:::-;1193:11:13::1;1207:13;1621:10:4::0;:17;;1534:111;1207:13:13::1;1193:27;;1230:13;1246:2;1230:18;;454:3;1266:14;;:25;1258:59;;;::::0;-1:-1:-1;;;1258:59:13;;14969:2:14;1258:59:13::1;::::0;::::1;14951:21:14::0;15008:2;14988:18;;;14981:30;-1:-1:-1;;;15027:18:14;;;15020:51;15088:18;;1258:59:13::1;14941:171:14::0;1258:59:13::1;1388:14;::::0;1359:44:::1;::::0;:24:::1;270:5;454:3;1359:14;:24::i;:44::-;1335:20;:6:::0;1346:8;1335:10:::1;:20::i;:::-;:68;;1327:93;;;;-1:-1:-1::0;;;1327:93:13::1;;;;;;;:::i;:::-;1435:9;1430:105;1450:8;1446:1;:12;1430:105;;;1489:22;::::0;1479:45:::1;::::0;-1:-1:-1;;;;;1489:22:13::1;1513:10;1522:1:::0;1513:6;:10:::1;:::i;1479:45::-;1460:3:::0;::::1;::::0;::::1;:::i;:::-;;;;1430:105;;;-1:-1:-1::0;1561:14:13::1;::::0;:28:::1;::::0;1580:8;1561:18:::1;:28::i;:::-;1544:14;:45:::0;-1:-1:-1;;1131:465:13:o;2052:235:3:-;2124:7;2159:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2159:16:3;2193:19;2185:73;;;;-1:-1:-1;;;2185:73:3;;14207:2:14;2185:73:3;;;14189:21:14;14246:2;14226:18;;;14219:30;14285:34;14265:18;;;14258:62;-1:-1:-1;;;14336:18:14;;;14329:39;14385:19;;2185:73:3;14179:231:14;1606:591:13;1673:17;;-1:-1:-1;;;1673:17:13;;;;1665:70;;;;-1:-1:-1;;;1665:70:13;;20255:2:14;1665:70:13;;;20237:21:14;20294:2;20274:18;;;20267:30;20333:34;20313:18;;;20306:62;-1:-1:-1;;;20384:18:14;;;20377:38;20432:19;;1665:70:13;20227:230:14;1665:70:13;1745:14;1762:13;1621:10:4;:17;;1534:111;1762:13:13;1848:14;;1745:30;;-1:-1:-1;1819:44:13;;:24;270:5;454:3;1819:14;:24::i;:44::-;1793:22;:6;1804:3;1793:10;:22::i;:::-;:70;;1785:95;;;;-1:-1:-1;;;1785:95:13;;;;;;;:::i;:::-;1904:9;1899:292;1915:14;;;1899:292;;;1958:12;:20;1971:3;;1975:1;1971:6;;;;;-1:-1:-1;;;1971:6:13;;;;;;;;;;;;;;;;;;1958:20;;-1:-1:-1;1958:20:13;;;;;;;;-1:-1:-1;1958:20:13;;;;:29;1950:65;;;;-1:-1:-1;;;1950:65:13;;11921:2:14;1950:65:13;;;11903:21:14;11960:2;11940:18;;;11933:30;11999:25;11979:18;;;11972:53;12042:18;;1950:65:13;11893:173:14;1950:65:13;2037:4;;2061:10;;2037:4;;;-1:-1:-1;;;;;2037:4:13;:12;2050:3;;2054:1;2050:6;;;;;-1:-1:-1;;;2050:6:13;;;;;;;;;;;;;;;2037:20;;;;;;;;;;;;;20608:25:14;;20596:2;20581:18;;20563:76;2037:20:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2037:34:13;;2029:63;;;;-1:-1:-1;;;2029:63:13;;17280:2:14;2029:63:13;;;17262:21:14;17319:2;17299:18;;;17292:30;-1:-1:-1;;;17338:18:14;;;17331:46;17394:18;;2029:63:13;17252:166:14;2029:63:13;2106:33;2116:10;2128;2137:1;2128:6;:10;:::i;2106:33::-;2176:4;2153:12;:20;2166:3;;2170:1;2166:6;;;;;-1:-1:-1;;;2166:6:13;;;;;;;;;;;;;;;2153:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;1931:3;;;;;:::i;:::-;;;;1899:292;;;;1606:591;;;:::o;1790:205:3:-;1862:7;-1:-1:-1;;;;;1889:19:3;;1881:74;;;;-1:-1:-1;;;1881:74:3;;13796:2:14;1881:74:3;;;13778:21:14;13835:2;13815:18;;;13808:30;13874:34;13854:18;;;13847:62;-1:-1:-1;;;13925:18:14;;;13918:40;13975:19;;1881:74:3;13768:232:14;1881:74:3;-1:-1:-1;;;;;;1972:16:3;;;;;:9;:16;;;;;;;1790:205::o;1598:92:10:-;1038:6;;-1:-1:-1;;;;;1038:6:10;666:10:1;1178:23:10;1170:68;;;;-1:-1:-1;;;1170:68:10;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;5109:84:13:-;1038:6:10;;-1:-1:-1;;;;;1038:6:10;666:10:1;1178:23:10;1170:68;;;;-1:-1:-1;;;1170:68:10;;;;;;;:::i;:::-;5176:10:13::1;::::0;;-1:-1:-1;;5162:24:13;::::1;5176:10;::::0;;::::1;5175:11;5162:24;::::0;;5109:84::o;2395:1076::-;2464:22;;;;2456:61;;;;-1:-1:-1;;;2456:61:13;;18445:2:14;2456:61:13;;;18427:21:14;18484:2;18464:18;;;18457:30;18523:28;18503:18;;;18496:56;18569:18;;2456:61:13;18417:176:14;2456:61:13;2528:16;2546:11;2559:14;2577:25;2591:10;2577:13;:25::i;:::-;2527:75;;;;;;2620:11;:21;;;;2635:6;2620:21;2612:49;;;;-1:-1:-1;;;2612:49:13;;13452:2:14;2612:49:13;;;13434:21:14;13491:2;13471:18;;;13464:30;-1:-1:-1;;;13510:18:14;;;13503:45;13565:18;;2612:49:13;13424:165:14;2612:49:13;2671:11;2695;:21;;;;2710:6;2695:21;2692:302;;;-1:-1:-1;364:1:13;2768:10;;;;;:38;;;364:1;2782:6;:24;;2768:38;2765:96;;;2831:15;:3;2839:6;2831:7;:15::i;:::-;2825:21;;2765:96;2877:11;:21;;;;;2892:6;2877:21;2874:110;;;2923:46;2962:6;2923:34;364:1;;2923:18;:34::i;:::-;:38;;:46::i;:::-;2917:52;;2874:110;3031:3;3024;:10;;3003:91;;;;-1:-1:-1;;;3003:91:13;;9164:2:14;3003:91:13;;;9146:21:14;9203:2;9183:18;;;9176:30;9242:34;9222:18;;;9215:62;-1:-1:-1;;;9293:18:14;;;9286:32;9335:19;;3003:91:13;9136:224:14;3003:91:13;3104:14;3121:13;1621:10:4;:17;;1534:111;3121:13:13;3200:14;;3104:30;;-1:-1:-1;3171:44:13;;:24;270:5;454:3;3171:14;:24::i;:44::-;3152:15;:6;3163:3;3152:10;:15::i;:::-;:63;;3144:88;;;;-1:-1:-1;;;3144:88:13;;;;;;;:::i;:::-;3263:11;403:10;3263:3;:11;:::i;:::-;3250:9;:24;;3242:50;;;;-1:-1:-1;;;3242:50:13;;19913:2:14;3242:50:13;;;19895:21:14;19952:2;19932:18;;;19925:30;-1:-1:-1;;;19971:18:14;;;19964:43;20024:18;;3242:50:13;19885:163:14;3242:50:13;3308:9;3303:88;3323:3;3319:1;:7;3303:88;;;3347:33;3357:10;3369;3378:1;3369:6;:10;:::i;3347:33::-;3328:3;;;;:::i;:::-;;;;3303:88;;;-1:-1:-1;3444:10:13;3429:26;;;;:14;:26;;;;;;:35;;3460:3;3429:30;:35::i;:::-;3415:10;3400:26;;;;:14;:26;;;;;:64;-1:-1:-1;;;;;;2395:1076:13:o;2511:102:3:-;2567:13;2599:7;2592:14;;;;;:::i;4144:290::-;-1:-1:-1;;;;;4246:24:3;;666:10:1;4246:24:3;;4238:62;;;;-1:-1:-1;;;4238:62:3;;11567:2:14;4238:62:3;;;11549:21:14;11606:2;11586:18;;;11579:30;11645:27;11625:18;;;11618:55;11690:18;;4238:62:3;11539:175:14;4238:62:3;666:10:1;4311:32:3;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4311:42:3;;;;;;;;;;;;:53;;-1:-1:-1;;4311:53:3;;;;;;;;;;4379:48;;8342:41:14;;;4311:42:3;;666:10:1;4379:48:3;;8315:18:14;4379:48:3;;;;;;;4144:290;;:::o;5365:320::-;5534:41;666:10:1;5567:7:3;5534:18;:41::i;:::-;5526:103;;;;-1:-1:-1;;;5526:103:3;;;;;;;:::i;:::-;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;2679:329::-;7222:4;7245:16;;;:7;:16;;;;;;2752:13;;-1:-1:-1;;;;;7245:16:3;2777:76;;;;-1:-1:-1;;;2777:76:3;;16864:2:14;2777:76:3;;;16846:21:14;16903:2;16883:18;;;16876:30;16942:34;16922:18;;;16915:62;-1:-1:-1;;;16993:18:14;;;16986:45;17048:19;;2777:76:3;16836:237:14;2777:76:3;2864:21;2888:10;:8;:10::i;:::-;2864:34;;2939:1;2921:7;2915:21;:25;:86;;;;;;;;;;;;;;;;;2967:7;2976:18;:7;:16;:18::i;:::-;2950:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2915:86;2908:93;2679:329;-1:-1:-1;;;2679:329:3:o;4725:184:13:-;1038:6:10;;-1:-1:-1;;;;;1038:6:10;666:10:1;1178:23:10;1170:68;;;;-1:-1:-1;;;1170:68:10;;;;;;;:::i;:::-;4807:6:13::1;4803:100;4819:19:::0;;::::1;4803:100;;;4888:4;4858:14;:27;4873:8;;4882:1;4873:11;;;;;-1:-1:-1::0;;;4873:11:13::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4858:27:13::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;4858:27:13;:34;;-1:-1:-1;;4858:34:13::1;::::0;::::1;;::::0;;;::::1;::::0;;4840:3;::::1;::::0;::::1;:::i;:::-;;;;4803:100;;1839:189:10::0;1038:6;;-1:-1:-1;;;;;1038:6:10;666:10:1;1178:23:10;1170:68;;;;-1:-1:-1;;;1170:68:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:10;::::1;1919:73;;;::::0;-1:-1:-1;;;1919:73:10;;10398:2:14;1919:73:10::1;::::0;::::1;10380:21:14::0;10437:2;10417:18;;;10410:30;10476:34;10456:18;;;10449:62;-1:-1:-1;;;10527:18:14;;;10520:36;10573:19;;1919:73:10::1;10370:228:14::0;1919:73:10::1;2002:19;2012:8;2002:9;:19::i;2207:182:13:-:0;2291:4;;:20;;-1:-1:-1;;;2291:20:13;;2268:4;;;;2291;;;;-1:-1:-1;;;;;2291:4:13;;:12;;:20;;2304:6;;2291:20;;20608:25:14;;;20596:2;20581:18;;20563:76;2291:20:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2291:34:13;;;2283:62;;;;-1:-1:-1;;;2283:62:13;;19213:2:14;2283:62:13;;;19195:21:14;19252:2;19232:18;;;19225:30;-1:-1:-1;;;19271:18:14;;;19264:45;19326:18;;2283:62:13;19185:165:14;2283:62:13;-1:-1:-1;2362:20:13;;;;:12;:20;;;;;;;;;2207:182::o;1431:300:3:-;1533:4;-1:-1:-1;;;;;;1568:40:3;;-1:-1:-1;;;1568:40:3;;:104;;-1:-1:-1;;;;;;;1624:48:3;;-1:-1:-1;;;1624:48:3;1568:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:2;;;1688:36:3;763:155:2;11008:171:3;11082:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11082:29:3;-1:-1:-1;;;;;11082:29:3;;;;;;;;:24;;11135:23;11082:24;11135:14;:23::i;:::-;-1:-1:-1;;;;;11126:46:3;;;;;;;;;;;11008:171;;:::o;7440:344::-;7533:4;7245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7245:16:3;7549:73;;;;-1:-1:-1;;;7549:73:3;;12273:2:14;7549:73:3;;;12255:21:14;12312:2;12292:18;;;12285:30;12351:34;12331:18;;;12324:62;-1:-1:-1;;;12402:18:14;;;12395:42;12454:19;;7549:73:3;12245:234:14;7549:73:3;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;-1:-1:-1;;;;;7689:16:3;:7;-1:-1:-1;;;;;7689:16:3;;:51;;;;7733:7;-1:-1:-1;;;;;7709:31:3;:20;7721:7;7709:11;:20::i;:::-;-1:-1:-1;;;;;7709:31:3;;7689:51;:87;;;-1:-1:-1;;;;;;4620:25:3;;;4597:4;4620:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7744:32;7681:96;7440:344;-1:-1:-1;;;;7440:344:3:o;10337:560::-;10491:4;-1:-1:-1;;;;;10464:31:3;:23;10479:7;10464:14;:23::i;:::-;-1:-1:-1;;;;;10464:31:3;;10456:85;;;;-1:-1:-1;;;10456:85:3;;16454:2:14;10456:85:3;;;16436:21:14;16493:2;16473:18;;;16466:30;16532:34;16512:18;;;16505:62;-1:-1:-1;;;16583:18:14;;;16576:39;16632:19;;10456:85:3;16426:231:14;10456:85:3;-1:-1:-1;;;;;10559:16:3;;10551:65;;;;-1:-1:-1;;;10551:65:3;;11162:2:14;10551:65:3;;;11144:21:14;11201:2;11181:18;;;11174:30;11240:34;11220:18;;;11213:62;-1:-1:-1;;;11291:18:14;;;11284:34;11335:19;;10551:65:3;11134:226:14;10551:65:3;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;-1:-1:-1;;;;;10768:15:3;;;;;;:9;:15;;;;;:20;;10787:1;;10768:15;:20;;10787:1;;10768:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10798:13:3;;;;;;:9;:13;;;;;:18;;10815:1;;10798:13;:18;;10815:1;;10798:18;:::i;:::-;;;;-1:-1:-1;;10826:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10826:21:3;-1:-1:-1;;;;;10826:21:3;;;;;;;;;10863:27;;10826:16;;10863:27;;;;;;;10337:560;;;:::o;3039:96:11:-;3097:7;3123:5;3127:1;3123;:5;:::i;2672:96::-;2730:7;2756:5;2760:1;2756;:5;:::i;8114:108:3:-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;2034:169:10:-;2108:6;;;-1:-1:-1;;;;;2124:17:10;;;-1:-1:-1;;;;;;2124:17:10;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2034:169;;:::o;6547:307:3:-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;-1:-1:-1;;;6736:111:3;;;;;;;:::i;4159::13:-;4219:13;4251:12;4244:19;;;;;:::i;275:703:12:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:12;;;;;;;;;;;;-1:-1:-1;;;574:10:12;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:12;;-1:-1:-1;720:2:12;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;-1:-1:-1;;;764:17:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:12;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:12;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;-1:-1:-1;;;849:14:12;;;;;;;;;;;;:56;-1:-1:-1;;;;;849:56:12;;;;;;;;-1:-1:-1;919:11:12;928:2;919:11;;:::i;:::-;;;791:150;;2543:572:4;-1:-1:-1;;;;;2742:18:4;;2738:183;;2776:40;2808:7;3924:10;:17;;3897:24;;;;:15;:24;;;;;:44;;;3951:24;;;;;;;;;;;;3821:161;2776:40;2738:183;;;2845:2;-1:-1:-1;;;;;2837:10:4;:4;-1:-1:-1;;;;;2837:10:4;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;-1:-1:-1;;;;;2934:16:4;;2930:179;;2966:45;3003:7;2966:36;:45::i;2930:179::-;3038:4;-1:-1:-1;;;;;3032:10:4;:2;-1:-1:-1;;;;;3032:10:4;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;8443:311:3:-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;-1:-1:-1;;;8596:151:3;;;;;;;:::i;11732:778::-;11882:4;-1:-1:-1;;;;;11902:13:3;;1034:20:0;1080:8;11898:606:3;;11937:72;;-1:-1:-1;;;11937:72:3;;-1:-1:-1;;;;;11937:36:3;;;;;:72;;666:10:1;;11988:4:3;;11994:7;;12003:5;;11937:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11937:72:3;;;;;;;;-1:-1:-1;;11937:72:3;;;;;;;;;;;;:::i;:::-;;;11933:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12176:13:3;;12172:266;;12218:60;;-1:-1:-1;;;12218:60:3;;;;;;;:::i;12172:266::-;12390:6;12384:13;12375:6;12371:2;12367:15;12360:38;11933:519;-1:-1:-1;;;;;;12059:51:3;-1:-1:-1;;;12059:51:3;;-1:-1:-1;12052:58:3;;11898:606;-1:-1:-1;12489:4:3;11732:778;;;;;;:::o;4599:970:4:-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4922:18;4943:26;;;:17;:26;;;;;;4861:51;;-1:-1:-1;5073:28:4;;;5069:323;;-1:-1:-1;;;;;5139:18:4;;5117:19;5139:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5188:30;;;;;;:44;;;5304:30;;:17;:30;;;;;:43;;;5069:323;-1:-1:-1;5485:26:4;;;;:17;:26;;;;;;;;5478:33;;;-1:-1:-1;;;;;5528:18:4;;;;;:12;:18;;;;;:34;;;;;;;5521:41;4599:970::o;5857:1061::-;6131:10;:17;6106:22;;6131:21;;6151:1;;6131:21;:::i;:::-;6162:18;6183:24;;;:15;:24;;;;;;6551:10;:26;;6106:46;;-1:-1:-1;6183:24:4;;6106:46;;6551:26;;;;-1:-1:-1;;;6551:26:4;;;;;;;;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;-1:-1:-1;;;6588:22:4;;;;;;;;;;;;;;;;;;;;:36;;;;6692:28;;;:15;:28;;;;;;;:41;;;6861:24;;;;;6854:31;6895:10;:16;;;;;-1:-1:-1;;;6895:16:4;;;;;;;;;;;;;;;;;;;;;;;;;;5857:1061;;;;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;-1:-1:-1;;;;;3540:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3584:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3409:217:4:o;9076:372:3:-;-1:-1:-1;;;;;9155:16:3;;9147:61;;;;-1:-1:-1;;;9147:61:3;;15319:2:14;9147:61:3;;;15301:21:14;;;15338:18;;;15331:30;15397:34;15377:18;;;15370:62;15449:18;;9147:61:3;15291:182:14;9147:61:3;7222:4;7245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7245:16:3;:30;9218:58;;;;-1:-1:-1;;;9218:58:3;;10805:2:14;9218:58:3;;;10787:21:14;10844:2;10824:18;;;10817:30;10883;10863:18;;;10856:58;10931:18;;9218:58:3;10777:178:14;9218:58:3;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;-1:-1:-1;;;;;9343:13:3;;;;;;:9;:13;;;;;:18;;9360:1;;9343:13;:18;;9360:1;;9343:18;:::i;:::-;;;;-1:-1:-1;;9371:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9371:21:3;-1:-1:-1;;;;;9371:21:3;;;;;;;;9408:33;;9371:16;;;9408:33;;9371:16;;9408:33;9076:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:14;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:14;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:395::-;713:8;723:6;777:3;770:4;762:6;758:17;754:27;744:2;;802:8;792;785:26;744:2;-1:-1:-1;832:20:14;;875:18;864:30;;861:2;;;914:8;904;897:26;861:2;958:4;950:6;946:17;934:29;;1018:3;1011:4;1001:6;998:1;994:14;986:6;982:27;978:38;975:47;972:2;;;1035:1;1032;1025:12;972:2;734:311;;;;;:::o;1050:160::-;1115:20;;1171:13;;1164:21;1154:32;;1144:2;;1200:1;1197;1190:12;1144:2;1096:114;;;:::o;1215:257::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:2;;;1348:6;1340;1333:22;1295:2;1392:9;1379:23;1411:31;1436:5;1411:31;:::i;1477:261::-;1547:6;1600:2;1588:9;1579:7;1575:23;1571:32;1568:2;;;1621:6;1613;1606:22;1568:2;1658:9;1652:16;1677:31;1702:5;1677:31;:::i;1743:398::-;1811:6;1819;1872:2;1860:9;1851:7;1847:23;1843:32;1840:2;;;1893:6;1885;1878:22;1840:2;1937:9;1924:23;1956:31;1981:5;1956:31;:::i;:::-;2006:5;-1:-1:-1;2063:2:14;2048:18;;2035:32;2076:33;2035:32;2076:33;:::i;:::-;2128:7;2118:17;;;1830:311;;;;;:::o;2146:466::-;2223:6;2231;2239;2292:2;2280:9;2271:7;2267:23;2263:32;2260:2;;;2313:6;2305;2298:22;2260:2;2357:9;2344:23;2376:31;2401:5;2376:31;:::i;:::-;2426:5;-1:-1:-1;2483:2:14;2468:18;;2455:32;2496:33;2455:32;2496:33;:::i;:::-;2250:362;;2548:7;;-1:-1:-1;;;2602:2:14;2587:18;;;;2574:32;;2250:362::o;2617:824::-;2712:6;2720;2728;2736;2789:3;2777:9;2768:7;2764:23;2760:33;2757:2;;;2811:6;2803;2796:22;2757:2;2855:9;2842:23;2874:31;2899:5;2874:31;:::i;:::-;2924:5;-1:-1:-1;2981:2:14;2966:18;;2953:32;2994:33;2953:32;2994:33;:::i;:::-;3046:7;-1:-1:-1;3100:2:14;3085:18;;3072:32;;-1:-1:-1;3155:2:14;3140:18;;3127:32;3182:18;3171:30;;3168:2;;;3219:6;3211;3204:22;3168:2;3247:22;;3300:4;3292:13;;3288:27;-1:-1:-1;3278:2:14;;3334:6;3326;3319:22;3278:2;3362:73;3427:7;3422:2;3409:16;3404:2;3400;3396:11;3362:73;:::i;:::-;3352:83;;;2747:694;;;;;;;:::o;3446:325::-;3511:6;3519;3572:2;3560:9;3551:7;3547:23;3543:32;3540:2;;;3593:6;3585;3578:22;3540:2;3637:9;3624:23;3656:31;3681:5;3656:31;:::i;:::-;3706:5;-1:-1:-1;3730:35:14;3761:2;3746:18;;3730:35;:::i;:::-;3720:45;;3530:241;;;;;:::o;3776:325::-;3844:6;3852;3905:2;3893:9;3884:7;3880:23;3876:32;3873:2;;;3926:6;3918;3911:22;3873:2;3970:9;3957:23;3989:31;4014:5;3989:31;:::i;:::-;4039:5;4091:2;4076:18;;;;4063:32;;-1:-1:-1;;;3863:238:14:o;4106:457::-;4192:6;4200;4253:2;4241:9;4232:7;4228:23;4224:32;4221:2;;;4274:6;4266;4259:22;4221:2;4319:9;4306:23;4352:18;4344:6;4341:30;4338:2;;;4389:6;4381;4374:22;4338:2;4433:70;4495:7;4486:6;4475:9;4471:22;4433:70;:::i;:::-;4522:8;;4407:96;;-1:-1:-1;4211:352:14;-1:-1:-1;;;;4211:352:14:o;5030:326::-;5098:6;5106;5114;5167:2;5155:9;5146:7;5142:23;5138:32;5135:2;;;5188:6;5180;5173:22;5135:2;5216:26;5232:9;5216:26;:::i;:::-;5206:36;;5261:35;5292:2;5281:9;5277:18;5261:35;:::i;:::-;5251:45;;5315:35;5346:2;5335:9;5331:18;5315:35;:::i;:::-;5305:45;;5125:231;;;;;:::o;5361:255::-;5419:6;5472:2;5460:9;5451:7;5447:23;5443:32;5440:2;;;5493:6;5485;5478:22;5440:2;5537:9;5524:23;5556:30;5580:5;5556:30;:::i;5621:259::-;5690:6;5743:2;5731:9;5722:7;5718:23;5714:32;5711:2;;;5764:6;5756;5749:22;5711:2;5801:9;5795:16;5820:30;5844:5;5820:30;:::i;5885:480::-;5954:6;6007:2;5995:9;5986:7;5982:23;5978:32;5975:2;;;6028:6;6020;6013:22;5975:2;6073:9;6060:23;6106:18;6098:6;6095:30;6092:2;;;6143:6;6135;6128:22;6092:2;6171:22;;6224:4;6216:13;;6212:27;-1:-1:-1;6202:2:14;;6258:6;6250;6243:22;6202:2;6286:73;6351:7;6346:2;6333:16;6328:2;6324;6320:11;6286:73;:::i;6370:190::-;6429:6;6482:2;6470:9;6461:7;6457:23;6453:32;6450:2;;;6503:6;6495;6488:22;6450:2;-1:-1:-1;6531:23:14;;6440:120;-1:-1:-1;6440:120:14:o;6565:194::-;6635:6;6688:2;6676:9;6667:7;6663:23;6659:32;6656:2;;;6709:6;6701;6694:22;6656:2;-1:-1:-1;6737:16:14;;6646:113;-1:-1:-1;6646:113:14:o;6764:257::-;6805:3;6843:5;6837:12;6870:6;6865:3;6858:19;6886:63;6942:6;6935:4;6930:3;6926:14;6919:4;6912:5;6908:16;6886:63;:::i;:::-;7003:2;6982:15;-1:-1:-1;;6978:29:14;6969:39;;;;7010:4;6965:50;;6813:208;-1:-1:-1;;6813:208:14:o;7026:470::-;7205:3;7243:6;7237:13;7259:53;7305:6;7300:3;7293:4;7285:6;7281:17;7259:53;:::i;:::-;7375:13;;7334:16;;;;7397:57;7375:13;7334:16;7431:4;7419:17;;7397:57;:::i;:::-;7470:20;;7213:283;-1:-1:-1;;;;7213:283:14:o;7709:488::-;-1:-1:-1;;;;;7978:15:14;;;7960:34;;8030:15;;8025:2;8010:18;;8003:43;8077:2;8062:18;;8055:34;;;8125:3;8120:2;8105:18;;8098:31;;;7903:4;;8146:45;;8171:19;;8163:6;8146:45;:::i;:::-;8138:53;7912:285;-1:-1:-1;;;;;;7912:285:14:o;8738:219::-;8887:2;8876:9;8869:21;8850:4;8907:44;8947:2;8936:9;8932:18;8924:6;8907:44;:::i;9777:414::-;9979:2;9961:21;;;10018:2;9998:18;;;9991:30;10057:34;10052:2;10037:18;;10030:62;-1:-1:-1;;;10123:2:14;10108:18;;10101:48;10181:3;10166:19;;9951:240::o;12484:336::-;12686:2;12668:21;;;12725:2;12705:18;;;12698:30;-1:-1:-1;;;12759:2:14;12744:18;;12737:42;12811:2;12796:18;;12658:162::o;15891:356::-;16093:2;16075:21;;;16112:18;;;16105:30;16171:34;16166:2;16151:18;;16144:62;16238:2;16223:18;;16065:182::o;17825:413::-;18027:2;18009:21;;;18066:2;18046:18;;;18039:30;18105:34;18100:2;18085:18;;18078:62;-1:-1:-1;;;18171:2:14;18156:18;;18149:47;18228:3;18213:19;;17999:239::o;20644:128::-;20684:3;20715:1;20711:6;20708:1;20705:13;20702:2;;;20721:18;;:::i;:::-;-1:-1:-1;20757:9:14;;20692:80::o;20777:120::-;20817:1;20843;20833:2;;20848:18;;:::i;:::-;-1:-1:-1;20882:9:14;;20823:74::o;20902:168::-;20942:7;21008:1;21004;21000:6;20996:14;20993:1;20990:21;20985:1;20978:9;20971:17;20967:45;20964:2;;;21015:18;;:::i;:::-;-1:-1:-1;21055:9:14;;20954:116::o;21075:125::-;21115:4;21143:1;21140;21137:8;21134:2;;;21148:18;;:::i;:::-;-1:-1:-1;21185:9:14;;21124:76::o;21205:258::-;21277:1;21287:113;21301:6;21298:1;21295:13;21287:113;;;21377:11;;;21371:18;21358:11;;;21351:39;21323:2;21316:10;21287:113;;;21418:6;21415:1;21412:13;21409:2;;;-1:-1:-1;;21453:1:14;21435:16;;21428:27;21258:205::o;21468:380::-;21547:1;21543:12;;;;21590;;;21611:2;;21665:4;21657:6;21653:17;21643:27;;21611:2;21718;21710:6;21707:14;21687:18;21684:38;21681:2;;;21764:10;21759:3;21755:20;21752:1;21745:31;21799:4;21796:1;21789:15;21827:4;21824:1;21817:15;21681:2;;21523:325;;;:::o;21853:135::-;21892:3;-1:-1:-1;;21913:17:14;;21910:2;;;21933:18;;:::i;:::-;-1:-1:-1;21980:1:14;21969:13;;21900:88::o;21993:112::-;22025:1;22051;22041:2;;22056:18;;:::i;:::-;-1:-1:-1;22090:9:14;;22031:74::o;22110:127::-;22171:10;22166:3;22162:20;22159:1;22152:31;22202:4;22199:1;22192:15;22226:4;22223:1;22216:15;22242:127;22303:10;22298:3;22294:20;22291:1;22284:31;22334:4;22331:1;22324:15;22358:4;22355:1;22348:15;22374:127;22435:10;22430:3;22426:20;22423:1;22416:31;22466:4;22463:1;22456:15;22490:4;22487:1;22480:15;22506:131;-1:-1:-1;;;;;22581:31:14;;22571:42;;22561:2;;22627:1;22624;22617:12;22642:131;-1:-1:-1;;;;;;22716:32:14;;22706:43;;22696:2;;22763:1;22760;22753:12

Swarm Source

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