ETH Price: $3,258.25 (-0.52%)
Gas: 1 Gwei

Token

AlphaBetty Books (ABB)
 

Overview

Max Total Supply

72 ABB

Holders

43

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mrsnfty.eth
0x40e14e68a8950affd28c191cd97edc004f798dbd
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AlphaBettyBooks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 16 : AlphaBettyBooks.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./AlphaBettyDoodlesI.sol";

//          ,--.     ,--.           ,--.          ,--.   ,--.             
//     ,--,--|  |,---.|  ,---. ,--,--|  |-. ,---.,-'  '-,-'  '-,--. ,--.   
//    ' ,-.  |  | .-. |  .-.  ' ,-.  | .-. | .-. '-.  .-'-.  .-'\  '  /    
//    \ '-'  |  | '-' |  | |  \ '-'  | `-' \   --. |  |   |  |   \   '     
//     `--`--`--|  |-'`--' `--'`--`--'`---' `----' `--'   `--' .-'  /      
//              `--'                                           `---'       
//    ,--.              ,--.        ,--.                         ,--.      
//    |  |-. ,---. ,---.|  |,-.     |  |,--,--,--.,--,--,--, ,---|  ,---.  
//    | .-. | .-. | .-. |     /     |  ' ,-.  |  ||  |      | .--|  .-.  | 
//    | `-' ' '-' ' '-' |  \  \     |  \ '-'  '  ''  |  ||  \ `--|  | |  | 
//     `---' `---' `---'`--'`--'    `--'`--`--'`----'`--''--'`---`--' `--' 

contract AlphaBettyBooks is ERC1155Supply, Ownable, ReentrancyGuard {

    string collectionURI = "ipfs://QmUydpHhkpDGFxjgZrLYdJD7VivMxhhsd2ThZqVYuy6UKe/";
    string private name_;
    string private symbol_; 
    uint256 public tokenPrice;
    uint256 public tokenQty;
    uint256 public maxMintQty;
    uint256 public maxWalletQty;
    uint256 public maxTokenId;
    bool public paused;

    AlphaBettyDoodlesI public bettyCollection;


    constructor() ERC1155(collectionURI) {
        name_ = "AlphaBetty Books";
        symbol_ = "ABB";
        tokenPrice = 0.01 ether;
        tokenQty = 50;
        maxMintQty = 2;
        maxWalletQty = 2;
        maxTokenId = 3;
    }
    
    function name() public view returns (string memory) {
      return name_;
    }

    function symbol() public view returns (string memory) {
      return symbol_;
    }

    function mint(uint256 id, uint256 amount)
        public
        payable
        nonReentrant
    {
        require(paused == false, "Minting is paused");
        require(bettyCollection.balanceOf(_msgSender()) > 0, "You must own an AlphaBetty NFT to mint.");
        require(amount <= maxMintQty, "Mint quantity is too high");
        require(this.balanceOf(_msgSender(), id) + amount <= maxWalletQty, "You have hit the max tokens per wallet");
        require(totalSupply(id) < tokenQty, "All Minted");
        require(id <= maxTokenId, "That token has not been published yet."); 
        require(amount * tokenPrice == msg.value, "You have not sent the correct amount of ETH");
        require(tx.origin == _msgSender(), "The caller is another contract");

        _mint(_msgSender(), id, amount, "");
    }

    //=============================================================================
    // Admin Functions
    //=============================================================================

    function setBettyCollection(address _contract) external onlyOwner {
        bettyCollection = AlphaBettyDoodlesI(_contract);
    }

    function adminMintOverride(address account, uint256 id, uint256 amount) public onlyOwner {
        _mint(account, id, amount, "");
    }

    function setCollectionURI(string memory newCollectionURI) public onlyOwner {
        collectionURI = newCollectionURI;
    }

    function setTokenPrice(uint256 price) public onlyOwner {
        tokenPrice = price;
    }

    function setTokenQty(uint256 qty) public onlyOwner {
        tokenQty = qty;
    }

    function setMaxMintQty(uint256 qty) public onlyOwner {
        maxMintQty = qty;
    }

    function setMaxWalletQty(uint256 qty) public onlyOwner {
        maxWalletQty = qty;
    }

    function setMaxTokenId(uint256 id) public onlyOwner {
        maxTokenId = id;
    }

    function togglePaused() public onlyOwner {
        paused = !paused;
    }

    function withdrawETH() public onlyOwner {
        payable(_msgSender()).transfer(address(this).balance);
    }

    //=============================================================================
    // Override Functions
    //=============================================================================
    
    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal override(ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    function uri(uint256 _tokenId) public override view returns (string memory) {
        return string(abi.encodePacked(collectionURI, Strings.toString(_tokenId), ".json"));
    }    
}

File 2 of 16 : ERC1155Supply.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

import "../ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

File 3 of 16 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

File 4 of 16 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 5 of 16 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 6 of 16 : AlphaBettyDoodlesI.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";


abstract contract AlphaBettyDoodlesI is Ownable, IERC721, IERC721Enumerable {

}

File 7 of 16 : ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 8 of 16 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 9 of 16 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 10 of 16 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 12 of 16 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

File 15 of 16 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

File 16 of 16 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminMintOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bettyCollection","outputs":[{"internalType":"contract AlphaBettyDoodlesI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"address","name":"_contract","type":"address"}],"name":"setBettyCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newCollectionURI","type":"string"}],"name":"setCollectionURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"setMaxMintQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setMaxTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"setMaxWalletQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"setTokenQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052603660808181529062002a4c60a03980516200002991600691602090910190620001e4565b503480156200003757600080fd5b506006805462000047906200028a565b80601f016020809104026020016040519081016040528092919081815260200182805462000075906200028a565b8015620000c65780601f106200009a57610100808354040283529160200191620000c6565b820191906000526020600020905b815481529060010190602001808311620000a857829003601f168201915b5050505050620000dc816200017960201b60201c565b50620000e83362000192565b60016005556040805180820190915260108082526f416c706861426574747920426f6f6b7360801b60209092019182526200012691600791620001e4565b506040805180820190915260038082526220a12160e91b60209092019182526200015391600891620001e4565b50662386f26fc100006009556032600a556002600b819055600c556003600d55620002c7565b80516200018e906002906020840190620001e4565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f2906200028a565b90600052602060002090601f01602090048101928262000216576000855562000261565b82601f106200023157805160ff191683800117855562000261565b8280016001018555821562000261579182015b828111156200026157825182559160200191906001019062000244565b506200026f92915062000273565b5090565b5b808211156200026f576000815560010162000274565b600181811c908216806200029f57607f821691505b60208210811415620002c157634e487b7160e01b600052602260045260246000fd5b50919050565b61277580620002d76000396000f3fe6080604052600436106101ed5760003560e01c80635c975abb1161010d578063a22cb465116100a0578063e086e5ec1161006f578063e086e5ec14610577578063e985e9c51461058c578063ec94d075146105d5578063f242432a146105f5578063f2fde38b1461061557600080fd5b8063a22cb465146104f4578063acb695b014610514578063b5b207791461052a578063bd85b0391461054a57600080fd5b80637ff9b596116100dc5780637ff9b596146104955780638da5cb5b146104ab57806391ba317a146104c957806395d89b41146104df57600080fd5b80635c975abb146104265780636a61e5fc14610440578063715018a614610460578063724b5dd71461047557600080fd5b8063202fcbbd1161018557806336566f061161015457806336566f061461039f5780633688236d146103b45780634e1273f4146103ca5780634f558e79146103f757600080fd5b8063202fcbbd1461031f578063236effd91461033f5780632639f4601461035f5780632eb2c2d61461037f57600080fd5b80630e89341c116101c15780630e89341c146102b4578063112f36a4146102d45780631b2ef1ca146102f65780631eac06911461030957600080fd5b8062fdd58e146101f257806301ffc9a7146102255780630313c3a21461025557806306fdde0314610292575b600080fd5b3480156101fe57600080fd5b5061021261020d366004611fa1565b610635565b6040519081526020015b60405180910390f35b34801561023157600080fd5b506102456102403660046120cf565b6106cc565b604051901515815260200161021c565b34801561026157600080fd5b50600e5461027a9061010090046001600160a01b031681565b6040516001600160a01b03909116815260200161021c565b34801561029e57600080fd5b506102a761071e565b60405161021c91906123bf565b3480156102c057600080fd5b506102a76102cf366004612152565b6107b0565b3480156102e057600080fd5b506102f46102ef366004611fcb565b6107e4565b005b6102f4610304366004612184565b61082e565b34801561031557600080fd5b50610212600a5481565b34801561032b57600080fd5b506102f461033a366004612152565b610c8c565b34801561034b57600080fd5b506102f461035a366004612152565b610cbb565b34801561036b57600080fd5b506102f461037a366004612109565b610cea565b34801561038b57600080fd5b506102f461039a366004611e56565b610d2b565b3480156103ab57600080fd5b506102f4610dc2565b3480156103c057600080fd5b50610212600b5481565b3480156103d657600080fd5b506103ea6103e5366004611ffe565b610e00565b60405161021c9190612387565b34801561040357600080fd5b50610245610412366004612152565b600090815260036020526040902054151590565b34801561043257600080fd5b50600e546102459060ff1681565b34801561044c57600080fd5b506102f461045b366004612152565b610f2a565b34801561046c57600080fd5b506102f4610f59565b34801561048157600080fd5b506102f4610490366004612152565b610f8f565b3480156104a157600080fd5b5061021260095481565b3480156104b757600080fd5b506004546001600160a01b031661027a565b3480156104d557600080fd5b50610212600d5481565b3480156104eb57600080fd5b506102a7610fbe565b34801561050057600080fd5b506102f461050f366004611f65565b610fcd565b34801561052057600080fd5b50610212600c5481565b34801561053657600080fd5b506102f4610545366004612152565b610fd8565b34801561055657600080fd5b50610212610565366004612152565b60009081526003602052604090205490565b34801561058357600080fd5b506102f4611007565b34801561059857600080fd5b506102456105a7366004611e23565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156105e157600080fd5b506102f46105f0366004611e08565b611060565b34801561060157600080fd5b506102f4610610366004611f00565b6110b2565b34801561062157600080fd5b506102f4610630366004611e08565b611139565b60006001600160a01b0383166106a65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806106fd57506001600160e01b031982166303a24d0760e21b145b8061071857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606007805461072d90612594565b80601f016020809104026020016040519081016040528092919081815260200182805461075990612594565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b606060066107bd836111d1565b6040516020016107ce929190612229565b6040516020818303038152906040529050919050565b6004546001600160a01b0316331461080e5760405162461bcd60e51b815260040161069d906124a9565b610829838383604051806020016040528060008152506112d7565b505050565b600260055414156108815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161069d565b6002600555600e5460ff16156108cd5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015260640161069d565b600e5460009061010090046001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561092657600080fd5b505afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095e919061216b565b116109bb5760405162461bcd60e51b815260206004820152602760248201527f596f75206d757374206f776e20616e20416c7068614265747479204e46542074604482015266379036b4b73a1760c91b606482015260840161069d565b600b54811115610a0d5760405162461bcd60e51b815260206004820152601960248201527f4d696e74207175616e7469747920697320746f6f206869676800000000000000604482015260640161069d565b600c54813062fdd58e336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024810187905260440160206040518083038186803b158015610a5d57600080fd5b505afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a95919061216b565b610a9f9190612502565b1115610afc5760405162461bcd60e51b815260206004820152602660248201527f596f7520686176652068697420746865206d617820746f6b656e7320706572206044820152651dd85b1b195d60d21b606482015260840161069d565b600a5460008381526003602052604090205410610b485760405162461bcd60e51b815260206004820152600a602482015269105b1b08135a5b9d195960b21b604482015260640161069d565b600d54821115610ba95760405162461bcd60e51b815260206004820152602660248201527f5468617420746f6b656e20686173206e6f74206265656e207075626c6973686560448201526532103cb2ba1760d11b606482015260840161069d565b3460095482610bb8919061252e565b14610c195760405162461bcd60e51b815260206004820152602b60248201527f596f752068617665206e6f742073656e742074686520636f727265637420616d60448201526a0deeadce840decc408aa8960ab1b606482015260840161069d565b323314610c685760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161069d565b610c83338383604051806020016040528060008152506112d7565b50506001600555565b6004546001600160a01b03163314610cb65760405162461bcd60e51b815260040161069d906124a9565b600d55565b6004546001600160a01b03163314610ce55760405162461bcd60e51b815260040161069d906124a9565b600a55565b6004546001600160a01b03163314610d145760405162461bcd60e51b815260040161069d906124a9565b8051610d27906006906020840190611c57565b5050565b6001600160a01b038516331480610d475750610d4785336105a7565b610dae5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161069d565b610dbb85858585856113fa565b5050505050565b6004546001600160a01b03163314610dec5760405162461bcd60e51b815260040161069d906124a9565b600e805460ff19811660ff90911615179055565b60608151835114610e655760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161069d565b6000835167ffffffffffffffff811115610e8157610e8161266d565b604051908082528060200260200182016040528015610eaa578160200160208202803683370190505b50905060005b8451811015610f2257610ef5858281518110610ece57610ece612657565b6020026020010151858381518110610ee857610ee8612657565b6020026020010151610635565b828281518110610f0757610f07612657565b6020908102919091010152610f1b816125fc565b9050610eb0565b509392505050565b6004546001600160a01b03163314610f545760405162461bcd60e51b815260040161069d906124a9565b600955565b6004546001600160a01b03163314610f835760405162461bcd60e51b815260040161069d906124a9565b610f8d60006115e5565b565b6004546001600160a01b03163314610fb95760405162461bcd60e51b815260040161069d906124a9565b600b55565b60606008805461072d90612594565b610d27338383611637565b6004546001600160a01b031633146110025760405162461bcd60e51b815260040161069d906124a9565b600c55565b6004546001600160a01b031633146110315760405162461bcd60e51b815260040161069d906124a9565b60405133904780156108fc02916000818181858888f1935050505015801561105d573d6000803e3d6000fd5b50565b6004546001600160a01b0316331461108a5760405162461bcd60e51b815260040161069d906124a9565b600e80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0385163314806110ce57506110ce85336105a7565b61112c5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161069d565b610dbb8585858585611718565b6004546001600160a01b031633146111635760405162461bcd60e51b815260040161069d906124a9565b6001600160a01b0381166111c85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161069d565b61105d816115e5565b6060816111f55750506040805180820190915260018152600360fc1b602082015290565b8160005b811561121f5780611209816125fc565b91506112189050600a8361251a565b91506111f9565b60008167ffffffffffffffff81111561123a5761123a61266d565b6040519080825280601f01601f191660200182016040528015611264576020820181803683370190505b5090505b84156112cf5761127960018361254d565b9150611286600a86612617565b611291906030612502565b60f81b8183815181106112a6576112a6612657565b60200101906001600160f81b031916908160001a9053506112c8600a8661251a565b9450611268565b949350505050565b6001600160a01b0384166113375760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161069d565b33600061134385611850565b9050600061135085611850565b90506113618360008985858961189b565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611391908490612502565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46113f1836000898989896118a9565b50505050505050565b815183511461145c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161069d565b6001600160a01b0384166114825760405162461bcd60e51b815260040161069d9061241a565b3361149181878787878761189b565b60005b84518110156115775760008582815181106114b1576114b1612657565b6020026020010151905060008583815181106114cf576114cf612657565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561151f5760405162461bcd60e51b815260040161069d9061245f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061155c908490612502565b9250508190555050505080611570906125fc565b9050611494565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516115c792919061239a565b60405180910390a46115dd818787878787611a14565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156116ab5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161069d565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661173e5760405162461bcd60e51b815260040161069d9061241a565b33600061174a85611850565b9050600061175785611850565b905061176783898985858961189b565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156117a85760405162461bcd60e51b815260040161069d9061245f565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906117e5908490612502565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611845848a8a8a8a8a6118a9565b505050505050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061188a5761188a612657565b602090810291909101015292915050565b6115dd868686868686611ade565b6001600160a01b0384163b156115dd5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906118ed9089908990889088908890600401612342565b602060405180830381600087803b15801561190757600080fd5b505af1925050508015611937575060408051601f3d908101601f19168201909252611934918101906120ec565b60015b6119e457611943612683565b806308c379a0141561197d575061195861269f565b80611963575061197f565b8060405162461bcd60e51b815260040161069d91906123bf565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161069d565b6001600160e01b0319811663f23a6e6160e01b146113f15760405162461bcd60e51b815260040161069d906123d2565b6001600160a01b0384163b156115dd5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611a5890899089908890889088906004016122e4565b602060405180830381600087803b158015611a7257600080fd5b505af1925050508015611aa2575060408051601f3d908101601f19168201909252611a9f918101906120ec565b60015b611aae57611943612683565b6001600160e01b0319811663bc197c8160e01b146113f15760405162461bcd60e51b815260040161069d906123d2565b6001600160a01b038516611b655760005b8351811015611b6357828181518110611b0a57611b0a612657565b602002602001015160036000868481518110611b2857611b28612657565b602002602001015181526020019081526020016000206000828254611b4d9190612502565b90915550611b5c9050816125fc565b9050611aef565b505b6001600160a01b0384166115dd5760005b83518110156113f1576000848281518110611b9357611b93612657565b602002602001015190506000848381518110611bb157611bb1612657565b6020026020010151905060006003600084815260200190815260200160002054905081811015611c345760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b606482015260840161069d565b60009283526003602052604090922091039055611c50816125fc565b9050611b76565b828054611c6390612594565b90600052602060002090601f016020900481019282611c855760008555611ccb565b82601f10611c9e57805160ff1916838001178555611ccb565b82800160010185558215611ccb579182015b82811115611ccb578251825591602001919060010190611cb0565b50611cd7929150611cdb565b5090565b5b80821115611cd75760008155600101611cdc565b600067ffffffffffffffff831115611d0a57611d0a61266d565b604051611d21601f8501601f1916602001826125cf565b809150838152848484011115611d3657600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b0381168114611d6557600080fd5b919050565b600082601f830112611d7b57600080fd5b81356020611d88826124de565b604051611d9582826125cf565b8381528281019150858301600585901b87018401881015611db557600080fd5b60005b85811015611dd457813584529284019290840190600101611db8565b5090979650505050505050565b600082601f830112611df257600080fd5b611e0183833560208501611cf0565b9392505050565b600060208284031215611e1a57600080fd5b611e0182611d4e565b60008060408385031215611e3657600080fd5b611e3f83611d4e565b9150611e4d60208401611d4e565b90509250929050565b600080600080600060a08688031215611e6e57600080fd5b611e7786611d4e565b9450611e8560208701611d4e565b9350604086013567ffffffffffffffff80821115611ea257600080fd5b611eae89838a01611d6a565b94506060880135915080821115611ec457600080fd5b611ed089838a01611d6a565b93506080880135915080821115611ee657600080fd5b50611ef388828901611de1565b9150509295509295909350565b600080600080600060a08688031215611f1857600080fd5b611f2186611d4e565b9450611f2f60208701611d4e565b93506040860135925060608601359150608086013567ffffffffffffffff811115611f5957600080fd5b611ef388828901611de1565b60008060408385031215611f7857600080fd5b611f8183611d4e565b915060208301358015158114611f9657600080fd5b809150509250929050565b60008060408385031215611fb457600080fd5b611fbd83611d4e565b946020939093013593505050565b600080600060608486031215611fe057600080fd5b611fe984611d4e565b95602085013595506040909401359392505050565b6000806040838503121561201157600080fd5b823567ffffffffffffffff8082111561202957600080fd5b818501915085601f83011261203d57600080fd5b8135602061204a826124de565b60405161205782826125cf565b8381528281019150858301600585901b870184018b101561207757600080fd5b600096505b848710156120a15761208d81611d4e565b83526001969096019591830191830161207c565b50965050860135925050808211156120b857600080fd5b506120c585828601611d6a565b9150509250929050565b6000602082840312156120e157600080fd5b8135611e0181612729565b6000602082840312156120fe57600080fd5b8151611e0181612729565b60006020828403121561211b57600080fd5b813567ffffffffffffffff81111561213257600080fd5b8201601f8101841361214357600080fd5b6112cf84823560208401611cf0565b60006020828403121561216457600080fd5b5035919050565b60006020828403121561217d57600080fd5b5051919050565b6000806040838503121561219757600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156121d6578151875295820195908201906001016121ba565b509495945050505050565b600081518084526121f9816020860160208601612564565b601f01601f19169290920160200192915050565b6000815161221f818560208601612564565b9290920192915050565b600080845481600182811c91508083168061224557607f831692505b602080841082141561226557634e487b7160e01b86526022600452602486fd5b818015612279576001811461228a576122b7565b60ff198616895284890196506122b7565b60008b81526020902060005b868110156122af5781548b820152908501908301612296565b505084890196505b5050505050506122db6122ca828661220d565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612310908301866121a6565b828103606084015261232281866121a6565b9050828103608084015261233681856121e1565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061237c908301846121e1565b979650505050505050565b602081526000611e0160208301846121a6565b6040815260006123ad60408301856121a6565b82810360208401526122db81856121a6565b602081526000611e0160208301846121e1565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff8211156124f8576124f861266d565b5060051b60200190565b600082198211156125155761251561262b565b500190565b60008261252957612529612641565b500490565b60008160001904831182151516156125485761254861262b565b500290565b60008282101561255f5761255f61262b565b500390565b60005b8381101561257f578181015183820152602001612567565b8381111561258e576000848401525b50505050565b600181811c908216806125a857607f821691505b602082108114156125c957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff811182821017156125f5576125f561266d565b6040525050565b60006000198214156126105761261061262b565b5060010190565b60008261262657612626612641565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561269c5760046000803e5060005160e01c5b90565b600060443d10156126ad5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156126dd57505050505090565b82850191508151818111156126f55750505050505090565b843d870101602082850101111561270f5750505050505090565b61271e602082860101876125cf565b509095945050505050565b6001600160e01b03198116811461105d57600080fdfea2646970667358221220d05169f625b130cd3b221ee9396e819222ceb429658851ae9fdbfa63955663af64736f6c63430008070033697066733a2f2f516d5579647048686b70444746786a675a724c59644a44375669764d78686873643254685a715659757936554b652f

Deployed Bytecode

0x6080604052600436106101ed5760003560e01c80635c975abb1161010d578063a22cb465116100a0578063e086e5ec1161006f578063e086e5ec14610577578063e985e9c51461058c578063ec94d075146105d5578063f242432a146105f5578063f2fde38b1461061557600080fd5b8063a22cb465146104f4578063acb695b014610514578063b5b207791461052a578063bd85b0391461054a57600080fd5b80637ff9b596116100dc5780637ff9b596146104955780638da5cb5b146104ab57806391ba317a146104c957806395d89b41146104df57600080fd5b80635c975abb146104265780636a61e5fc14610440578063715018a614610460578063724b5dd71461047557600080fd5b8063202fcbbd1161018557806336566f061161015457806336566f061461039f5780633688236d146103b45780634e1273f4146103ca5780634f558e79146103f757600080fd5b8063202fcbbd1461031f578063236effd91461033f5780632639f4601461035f5780632eb2c2d61461037f57600080fd5b80630e89341c116101c15780630e89341c146102b4578063112f36a4146102d45780631b2ef1ca146102f65780631eac06911461030957600080fd5b8062fdd58e146101f257806301ffc9a7146102255780630313c3a21461025557806306fdde0314610292575b600080fd5b3480156101fe57600080fd5b5061021261020d366004611fa1565b610635565b6040519081526020015b60405180910390f35b34801561023157600080fd5b506102456102403660046120cf565b6106cc565b604051901515815260200161021c565b34801561026157600080fd5b50600e5461027a9061010090046001600160a01b031681565b6040516001600160a01b03909116815260200161021c565b34801561029e57600080fd5b506102a761071e565b60405161021c91906123bf565b3480156102c057600080fd5b506102a76102cf366004612152565b6107b0565b3480156102e057600080fd5b506102f46102ef366004611fcb565b6107e4565b005b6102f4610304366004612184565b61082e565b34801561031557600080fd5b50610212600a5481565b34801561032b57600080fd5b506102f461033a366004612152565b610c8c565b34801561034b57600080fd5b506102f461035a366004612152565b610cbb565b34801561036b57600080fd5b506102f461037a366004612109565b610cea565b34801561038b57600080fd5b506102f461039a366004611e56565b610d2b565b3480156103ab57600080fd5b506102f4610dc2565b3480156103c057600080fd5b50610212600b5481565b3480156103d657600080fd5b506103ea6103e5366004611ffe565b610e00565b60405161021c9190612387565b34801561040357600080fd5b50610245610412366004612152565b600090815260036020526040902054151590565b34801561043257600080fd5b50600e546102459060ff1681565b34801561044c57600080fd5b506102f461045b366004612152565b610f2a565b34801561046c57600080fd5b506102f4610f59565b34801561048157600080fd5b506102f4610490366004612152565b610f8f565b3480156104a157600080fd5b5061021260095481565b3480156104b757600080fd5b506004546001600160a01b031661027a565b3480156104d557600080fd5b50610212600d5481565b3480156104eb57600080fd5b506102a7610fbe565b34801561050057600080fd5b506102f461050f366004611f65565b610fcd565b34801561052057600080fd5b50610212600c5481565b34801561053657600080fd5b506102f4610545366004612152565b610fd8565b34801561055657600080fd5b50610212610565366004612152565b60009081526003602052604090205490565b34801561058357600080fd5b506102f4611007565b34801561059857600080fd5b506102456105a7366004611e23565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156105e157600080fd5b506102f46105f0366004611e08565b611060565b34801561060157600080fd5b506102f4610610366004611f00565b6110b2565b34801561062157600080fd5b506102f4610630366004611e08565b611139565b60006001600160a01b0383166106a65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806106fd57506001600160e01b031982166303a24d0760e21b145b8061071857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606007805461072d90612594565b80601f016020809104026020016040519081016040528092919081815260200182805461075990612594565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b606060066107bd836111d1565b6040516020016107ce929190612229565b6040516020818303038152906040529050919050565b6004546001600160a01b0316331461080e5760405162461bcd60e51b815260040161069d906124a9565b610829838383604051806020016040528060008152506112d7565b505050565b600260055414156108815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161069d565b6002600555600e5460ff16156108cd5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b604482015260640161069d565b600e5460009061010090046001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561092657600080fd5b505afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095e919061216b565b116109bb5760405162461bcd60e51b815260206004820152602760248201527f596f75206d757374206f776e20616e20416c7068614265747479204e46542074604482015266379036b4b73a1760c91b606482015260840161069d565b600b54811115610a0d5760405162461bcd60e51b815260206004820152601960248201527f4d696e74207175616e7469747920697320746f6f206869676800000000000000604482015260640161069d565b600c54813062fdd58e336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024810187905260440160206040518083038186803b158015610a5d57600080fd5b505afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a95919061216b565b610a9f9190612502565b1115610afc5760405162461bcd60e51b815260206004820152602660248201527f596f7520686176652068697420746865206d617820746f6b656e7320706572206044820152651dd85b1b195d60d21b606482015260840161069d565b600a5460008381526003602052604090205410610b485760405162461bcd60e51b815260206004820152600a602482015269105b1b08135a5b9d195960b21b604482015260640161069d565b600d54821115610ba95760405162461bcd60e51b815260206004820152602660248201527f5468617420746f6b656e20686173206e6f74206265656e207075626c6973686560448201526532103cb2ba1760d11b606482015260840161069d565b3460095482610bb8919061252e565b14610c195760405162461bcd60e51b815260206004820152602b60248201527f596f752068617665206e6f742073656e742074686520636f727265637420616d60448201526a0deeadce840decc408aa8960ab1b606482015260840161069d565b323314610c685760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161069d565b610c83338383604051806020016040528060008152506112d7565b50506001600555565b6004546001600160a01b03163314610cb65760405162461bcd60e51b815260040161069d906124a9565b600d55565b6004546001600160a01b03163314610ce55760405162461bcd60e51b815260040161069d906124a9565b600a55565b6004546001600160a01b03163314610d145760405162461bcd60e51b815260040161069d906124a9565b8051610d27906006906020840190611c57565b5050565b6001600160a01b038516331480610d475750610d4785336105a7565b610dae5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161069d565b610dbb85858585856113fa565b5050505050565b6004546001600160a01b03163314610dec5760405162461bcd60e51b815260040161069d906124a9565b600e805460ff19811660ff90911615179055565b60608151835114610e655760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161069d565b6000835167ffffffffffffffff811115610e8157610e8161266d565b604051908082528060200260200182016040528015610eaa578160200160208202803683370190505b50905060005b8451811015610f2257610ef5858281518110610ece57610ece612657565b6020026020010151858381518110610ee857610ee8612657565b6020026020010151610635565b828281518110610f0757610f07612657565b6020908102919091010152610f1b816125fc565b9050610eb0565b509392505050565b6004546001600160a01b03163314610f545760405162461bcd60e51b815260040161069d906124a9565b600955565b6004546001600160a01b03163314610f835760405162461bcd60e51b815260040161069d906124a9565b610f8d60006115e5565b565b6004546001600160a01b03163314610fb95760405162461bcd60e51b815260040161069d906124a9565b600b55565b60606008805461072d90612594565b610d27338383611637565b6004546001600160a01b031633146110025760405162461bcd60e51b815260040161069d906124a9565b600c55565b6004546001600160a01b031633146110315760405162461bcd60e51b815260040161069d906124a9565b60405133904780156108fc02916000818181858888f1935050505015801561105d573d6000803e3d6000fd5b50565b6004546001600160a01b0316331461108a5760405162461bcd60e51b815260040161069d906124a9565b600e80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0385163314806110ce57506110ce85336105a7565b61112c5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161069d565b610dbb8585858585611718565b6004546001600160a01b031633146111635760405162461bcd60e51b815260040161069d906124a9565b6001600160a01b0381166111c85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161069d565b61105d816115e5565b6060816111f55750506040805180820190915260018152600360fc1b602082015290565b8160005b811561121f5780611209816125fc565b91506112189050600a8361251a565b91506111f9565b60008167ffffffffffffffff81111561123a5761123a61266d565b6040519080825280601f01601f191660200182016040528015611264576020820181803683370190505b5090505b84156112cf5761127960018361254d565b9150611286600a86612617565b611291906030612502565b60f81b8183815181106112a6576112a6612657565b60200101906001600160f81b031916908160001a9053506112c8600a8661251a565b9450611268565b949350505050565b6001600160a01b0384166113375760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161069d565b33600061134385611850565b9050600061135085611850565b90506113618360008985858961189b565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611391908490612502565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46113f1836000898989896118a9565b50505050505050565b815183511461145c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161069d565b6001600160a01b0384166114825760405162461bcd60e51b815260040161069d9061241a565b3361149181878787878761189b565b60005b84518110156115775760008582815181106114b1576114b1612657565b6020026020010151905060008583815181106114cf576114cf612657565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561151f5760405162461bcd60e51b815260040161069d9061245f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061155c908490612502565b9250508190555050505080611570906125fc565b9050611494565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516115c792919061239a565b60405180910390a46115dd818787878787611a14565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156116ab5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161069d565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661173e5760405162461bcd60e51b815260040161069d9061241a565b33600061174a85611850565b9050600061175785611850565b905061176783898985858961189b565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156117a85760405162461bcd60e51b815260040161069d9061245f565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906117e5908490612502565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611845848a8a8a8a8a6118a9565b505050505050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061188a5761188a612657565b602090810291909101015292915050565b6115dd868686868686611ade565b6001600160a01b0384163b156115dd5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906118ed9089908990889088908890600401612342565b602060405180830381600087803b15801561190757600080fd5b505af1925050508015611937575060408051601f3d908101601f19168201909252611934918101906120ec565b60015b6119e457611943612683565b806308c379a0141561197d575061195861269f565b80611963575061197f565b8060405162461bcd60e51b815260040161069d91906123bf565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161069d565b6001600160e01b0319811663f23a6e6160e01b146113f15760405162461bcd60e51b815260040161069d906123d2565b6001600160a01b0384163b156115dd5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611a5890899089908890889088906004016122e4565b602060405180830381600087803b158015611a7257600080fd5b505af1925050508015611aa2575060408051601f3d908101601f19168201909252611a9f918101906120ec565b60015b611aae57611943612683565b6001600160e01b0319811663bc197c8160e01b146113f15760405162461bcd60e51b815260040161069d906123d2565b6001600160a01b038516611b655760005b8351811015611b6357828181518110611b0a57611b0a612657565b602002602001015160036000868481518110611b2857611b28612657565b602002602001015181526020019081526020016000206000828254611b4d9190612502565b90915550611b5c9050816125fc565b9050611aef565b505b6001600160a01b0384166115dd5760005b83518110156113f1576000848281518110611b9357611b93612657565b602002602001015190506000848381518110611bb157611bb1612657565b6020026020010151905060006003600084815260200190815260200160002054905081811015611c345760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b606482015260840161069d565b60009283526003602052604090922091039055611c50816125fc565b9050611b76565b828054611c6390612594565b90600052602060002090601f016020900481019282611c855760008555611ccb565b82601f10611c9e57805160ff1916838001178555611ccb565b82800160010185558215611ccb579182015b82811115611ccb578251825591602001919060010190611cb0565b50611cd7929150611cdb565b5090565b5b80821115611cd75760008155600101611cdc565b600067ffffffffffffffff831115611d0a57611d0a61266d565b604051611d21601f8501601f1916602001826125cf565b809150838152848484011115611d3657600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b0381168114611d6557600080fd5b919050565b600082601f830112611d7b57600080fd5b81356020611d88826124de565b604051611d9582826125cf565b8381528281019150858301600585901b87018401881015611db557600080fd5b60005b85811015611dd457813584529284019290840190600101611db8565b5090979650505050505050565b600082601f830112611df257600080fd5b611e0183833560208501611cf0565b9392505050565b600060208284031215611e1a57600080fd5b611e0182611d4e565b60008060408385031215611e3657600080fd5b611e3f83611d4e565b9150611e4d60208401611d4e565b90509250929050565b600080600080600060a08688031215611e6e57600080fd5b611e7786611d4e565b9450611e8560208701611d4e565b9350604086013567ffffffffffffffff80821115611ea257600080fd5b611eae89838a01611d6a565b94506060880135915080821115611ec457600080fd5b611ed089838a01611d6a565b93506080880135915080821115611ee657600080fd5b50611ef388828901611de1565b9150509295509295909350565b600080600080600060a08688031215611f1857600080fd5b611f2186611d4e565b9450611f2f60208701611d4e565b93506040860135925060608601359150608086013567ffffffffffffffff811115611f5957600080fd5b611ef388828901611de1565b60008060408385031215611f7857600080fd5b611f8183611d4e565b915060208301358015158114611f9657600080fd5b809150509250929050565b60008060408385031215611fb457600080fd5b611fbd83611d4e565b946020939093013593505050565b600080600060608486031215611fe057600080fd5b611fe984611d4e565b95602085013595506040909401359392505050565b6000806040838503121561201157600080fd5b823567ffffffffffffffff8082111561202957600080fd5b818501915085601f83011261203d57600080fd5b8135602061204a826124de565b60405161205782826125cf565b8381528281019150858301600585901b870184018b101561207757600080fd5b600096505b848710156120a15761208d81611d4e565b83526001969096019591830191830161207c565b50965050860135925050808211156120b857600080fd5b506120c585828601611d6a565b9150509250929050565b6000602082840312156120e157600080fd5b8135611e0181612729565b6000602082840312156120fe57600080fd5b8151611e0181612729565b60006020828403121561211b57600080fd5b813567ffffffffffffffff81111561213257600080fd5b8201601f8101841361214357600080fd5b6112cf84823560208401611cf0565b60006020828403121561216457600080fd5b5035919050565b60006020828403121561217d57600080fd5b5051919050565b6000806040838503121561219757600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156121d6578151875295820195908201906001016121ba565b509495945050505050565b600081518084526121f9816020860160208601612564565b601f01601f19169290920160200192915050565b6000815161221f818560208601612564565b9290920192915050565b600080845481600182811c91508083168061224557607f831692505b602080841082141561226557634e487b7160e01b86526022600452602486fd5b818015612279576001811461228a576122b7565b60ff198616895284890196506122b7565b60008b81526020902060005b868110156122af5781548b820152908501908301612296565b505084890196505b5050505050506122db6122ca828661220d565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612310908301866121a6565b828103606084015261232281866121a6565b9050828103608084015261233681856121e1565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061237c908301846121e1565b979650505050505050565b602081526000611e0160208301846121a6565b6040815260006123ad60408301856121a6565b82810360208401526122db81856121a6565b602081526000611e0160208301846121e1565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff8211156124f8576124f861266d565b5060051b60200190565b600082198211156125155761251561262b565b500190565b60008261252957612529612641565b500490565b60008160001904831182151516156125485761254861262b565b500290565b60008282101561255f5761255f61262b565b500390565b60005b8381101561257f578181015183820152602001612567565b8381111561258e576000848401525b50505050565b600181811c908216806125a857607f821691505b602082108114156125c957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff811182821017156125f5576125f561266d565b6040525050565b60006000198214156126105761261061262b565b5060010190565b60008261262657612626612641565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561269c5760046000803e5060005160e01c5b90565b600060443d10156126ad5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156126dd57505050505090565b82850191508151818111156126f55750505050505090565b843d870101602082850101111561270f5750505050505090565b61271e602082860101876125cf565b509095945050505050565b6001600160e01b03198116811461105d57600080fdfea2646970667358221220d05169f625b130cd3b221ee9396e819222ceb429658851ae9fdbfa63955663af64736f6c63430008070033

Deployed Bytecode Sourcemap

1174:3581:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2185:228:2;;;;;;;;;;-1:-1:-1;2185:228:2;;;;;:::i;:::-;;:::i;:::-;;;22213:25:16;;;22201:2;22186:18;2185:228:2;;;;;;;;1236:305;;;;;;;;;;-1:-1:-1;1236:305:2;;;;;:::i;:::-;;:::i;:::-;;;12493:14:16;;12486:22;12468:41;;12456:2;12441:18;1236:305:2;12328:187:16;1569:41:14;;;;;;;;;;-1:-1:-1;1569:41:14;;;;;;;-1:-1:-1;;;;;1569:41:14;;;;;;-1:-1:-1;;;;;9873:32:16;;;9855:51;;9843:2;9828:18;1569:41:14;9709:203:16;1863:79:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4573:176::-;;;;;;;;;;-1:-1:-1;4573:176:14;;;;;:::i;:::-;;:::i;3181:136::-;;;;;;;;;;-1:-1:-1;3181:136:14;;;;;:::i;:::-;;:::i;:::-;;2037:810;;;;;;:::i;:::-;;:::i;1420:23::-;;;;;;;;;;;;;;;;3825:84;;;;;;;;;;-1:-1:-1;3825:84:14;;;;;:::i;:::-;;:::i;3549:82::-;;;;;;;;;;-1:-1:-1;3549:82:14;;;;;:::i;:::-;;:::i;3323:124::-;;;;;;;;;;-1:-1:-1;3323:124:14;;;;;:::i;:::-;;:::i;4060:430:2:-;;;;;;;;;;-1:-1:-1;4060:430:2;;;;;:::i;:::-;;:::i;3915:74:14:-;;;;;;;;;;;;;:::i;1449:25::-;;;;;;;;;;;;;;;;2570:508:2;;;;;;;;;;-1:-1:-1;2570:508:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;901:120:5:-;;;;;;;;;;-1:-1:-1;901:120:5;;;;;:::i;:::-;958:4;785:16;;;:12;:16;;;;;;-1:-1:-1;;;901:120:5;1544:18:14;;;;;;;;;;-1:-1:-1;1544:18:14;;;;;;;;3453:90;;;;;;;;;;-1:-1:-1;3453:90:14;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;3637:86:14:-;;;;;;;;;;-1:-1:-1;3637:86:14;;;;;:::i;:::-;;:::i;1389:25::-;;;;;;;;;;;;;;;;1036:85:0;;;;;;;;;;-1:-1:-1;1108:6:0;;-1:-1:-1;;;;;1108:6:0;1036:85;;1513:25:14;;;;;;;;;;;;;;;;1948:83;;;;;;;;;;;;;:::i;3146:153:2:-;;;;;;;;;;-1:-1:-1;3146:153:2;;;;;:::i;:::-;;:::i;1480:27:14:-;;;;;;;;;;;;;;;;3729:90;;;;;;;;;;-1:-1:-1;3729:90:14;;;;;:::i;:::-;;:::i;697:111:5:-;;;;;;;;;;-1:-1:-1;697:111:5;;;;;:::i;:::-;759:7;785:16;;;:12;:16;;;;;;;697:111;3995:110:14;;;;;;;;;;;;;:::i;3366:166:2:-;;;;;;;;;;-1:-1:-1;3366:166:2;;;;;:::i;:::-;-1:-1:-1;;;;;3488:27:2;;;3465:4;3488:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3366:166;3045:130:14;;;;;;;;;;-1:-1:-1;3045:130:14;;;;;:::i;:::-;;:::i;3599:389:2:-;;;;;;;;;;-1:-1:-1;3599:389:2;;;;;:::i;:::-;;:::i;1918:198:0:-;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;2185:228:2:-;2271:7;-1:-1:-1;;;;;2298:21:2;;2290:77;;;;-1:-1:-1;;;2290:77:2;;14011:2:16;2290:77:2;;;13993:21:16;14050:2;14030:18;;;14023:30;14089:34;14069:18;;;14062:62;-1:-1:-1;;;14140:18:16;;;14133:41;14191:19;;2290:77:2;;;;;;;;;-1:-1:-1;2384:9:2;:13;;;;;;;;;;;-1:-1:-1;;;;;2384:22:2;;;;;;;;;;;;2185:228::o;1236:305::-;1338:4;-1:-1:-1;;;;;;1373:41:2;;-1:-1:-1;;;1373:41:2;;:109;;-1:-1:-1;;;;;;;1430:52:2;;-1:-1:-1;;;1430:52:2;1373:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:12;;;1498:36:2;1354:180;1236:305;-1:-1:-1;;1236:305:2:o;1863:79:14:-;1900:13;1930:5;1923:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1863:79;:::o;4573:176::-;4634:13;4690;4705:26;4722:8;4705:16;:26::i;:::-;4673:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4659:83;;4573:176;;;:::o;3181:136::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3280:30:14::1;3286:7;3295:2;3299:6;3280:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;3181:136:::0;;;:::o;2037:810::-;1744:1:1;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:1;;21909:2:16;2317:63:1;;;21891:21:16;21948:2;21928:18;;;21921:30;21987:33;21967:18;;;21960:61;22038:18;;2317:63:1;21707:355:16;2317:63:1;1744:1;2455:7;:18;2153:6:14::1;::::0;::::1;;:15;2145:45;;;::::0;-1:-1:-1;;;2145:45:14;;19578:2:16;2145:45:14::1;::::0;::::1;19560:21:16::0;19617:2;19597:18;;;19590:30;-1:-1:-1;;;19636:18:16;;;19629:47;19693:18;;2145:45:14::1;19376:341:16::0;2145:45:14::1;2208:15;::::0;2250:1:::1;::::0;2208:15:::1;::::0;::::1;-1:-1:-1::0;;;;;2208:15:14::1;:25;719:10:10::0;2208:39:14::1;::::0;-1:-1:-1;;;;;;2208:39:14::1;::::0;;;;;;-1:-1:-1;;;;;9873:32:16;;;2208:39:14::1;::::0;::::1;9855:51:16::0;9828:18;;2208:39:14::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;2200:95;;;::::0;-1:-1:-1;;;2200:95:14;;15240:2:16;2200:95:14::1;::::0;::::1;15222:21:16::0;15279:2;15259:18;;;15252:30;15318:34;15298:18;;;15291:62;-1:-1:-1;;;15369:18:16;;;15362:37;15416:19;;2200:95:14::1;15038:403:16::0;2200:95:14::1;2323:10;;2313:6;:20;;2305:58;;;::::0;-1:-1:-1;;;2305:58:14;;20744:2:16;2305:58:14::1;::::0;::::1;20726:21:16::0;20783:2;20763:18;;;20756:30;20822:27;20802:18;;;20795:55;20867:18;;2305:58:14::1;20542:349:16::0;2305:58:14::1;2426:12;::::0;2416:6;2381:4:::1;:14;719:10:10::0;2381:32:14::1;::::0;-1:-1:-1;;;;;;2381:32:14::1;::::0;;;;;;-1:-1:-1;;;;;11505:32:16;;;2381::14::1;::::0;::::1;11487:51:16::0;11554:18;;;11547:34;;;11460:18;;2381:32:14::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;:::i;:::-;:57;;2373:108;;;::::0;-1:-1:-1;;;2373:108:14;;18762:2:16;2373:108:14::1;::::0;::::1;18744:21:16::0;18801:2;18781:18;;;18774:30;18840:34;18820:18;;;18813:62;-1:-1:-1;;;18891:18:16;;;18884:36;18937:19;;2373:108:14::1;18560:402:16::0;2373:108:14::1;2517:8;::::0;759:7:5;785:16;;;:12;:16;;;;;;2499:26:14::1;2491:49;;;::::0;-1:-1:-1;;;2491:49:14;;18062:2:16;2491:49:14::1;::::0;::::1;18044:21:16::0;18101:2;18081:18;;;18074:30;-1:-1:-1;;;18120:18:16;;;18113:40;18170:18;;2491:49:14::1;17860:334:16::0;2491:49:14::1;2564:10;;2558:2;:16;;2550:67;;;::::0;-1:-1:-1;;;2550:67:14;;16007:2:16;2550:67:14::1;::::0;::::1;15989:21:16::0;16046:2;16026:18;;;16019:30;16085:34;16065:18;;;16058:62;-1:-1:-1;;;16136:18:16;;;16129:36;16182:19;;2550:67:14::1;15805:402:16::0;2550:67:14::1;2659:9;2645:10;;2636:6;:19;;;;:::i;:::-;:32;2628:88;;;::::0;-1:-1:-1;;;2628:88:14;;17239:2:16;2628:88:14::1;::::0;::::1;17221:21:16::0;17278:2;17258:18;;;17251:30;17317:34;17297:18;;;17290:62;-1:-1:-1;;;17368:18:16;;;17361:41;17419:19;;2628:88:14::1;17037:407:16::0;2628:88:14::1;2734:9;719:10:10::0;2734:25:14::1;2726:68;;;::::0;-1:-1:-1;;;2726:68:14;;15648:2:16;2726:68:14::1;::::0;::::1;15630:21:16::0;15687:2;15667:18;;;15660:30;15726:32;15706:18;;;15699:60;15776:18;;2726:68:14::1;15446:354:16::0;2726:68:14::1;2805:35;719:10:10::0;2825:2:14::1;2829:6;2805:35;;;;;;;;;;;::::0;:5:::1;:35::i;:::-;-1:-1:-1::0;;1701:1:1;2628:7;:22;2037:810:14:o;3825:84::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3887:10:14::1;:15:::0;3825:84::o;3549:82::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3610:8:14::1;:14:::0;3549:82::o;3323:124::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3408:32:14;;::::1;::::0;:13:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;3323:124:::0;:::o;4060:430:2:-;-1:-1:-1;;;;;4285:20:2;;719:10:10;4285:20:2;;:60;;-1:-1:-1;4309:36:2;4326:4;719:10:10;3366:166:2;:::i;4309:36::-;4264:157;;;;-1:-1:-1;;;4264:157:2;;16820:2:16;4264:157:2;;;16802:21:16;16859:2;16839:18;;;16832:30;16898:34;16878:18;;;16871:62;-1:-1:-1;;;16949:18:16;;;16942:48;17007:19;;4264:157:2;16618:414:16;4264:157:2;4431:52;4454:4;4460:2;4464:3;4469:7;4478:4;4431:22;:52::i;:::-;4060:430;;;;;:::o;3915:74:14:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3976:6:14::1;::::0;;-1:-1:-1;;3966:16:14;::::1;3976:6;::::0;;::::1;3975:7;3966:16;::::0;;3915:74::o;2570:508:2:-;2721:16;2780:3;:10;2761:8;:15;:29;2753:83;;;;-1:-1:-1;;;2753:83:2;;20334:2:16;2753:83:2;;;20316:21:16;20373:2;20353:18;;;20346:30;20412:34;20392:18;;;20385:62;-1:-1:-1;;;20463:18:16;;;20456:39;20512:19;;2753:83:2;20132:405:16;2753:83:2;2847:30;2894:8;:15;2880:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2880:30:2;;2847:63;;2926:9;2921:120;2945:8;:15;2941:1;:19;2921:120;;;3000:30;3010:8;3019:1;3010:11;;;;;;;;:::i;:::-;;;;;;;3023:3;3027:1;3023:6;;;;;;;;:::i;:::-;;;;;;;3000:9;:30::i;:::-;2981:13;2995:1;2981:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2962:3;;;:::i;:::-;;;2921:120;;;-1:-1:-1;3058:13:2;2570:508;-1:-1:-1;;;2570:508:2:o;3453:90:14:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3518:10:14::1;:18:::0;3453:90::o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;3637:86:14:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3700:10:14::1;:16:::0;3637:86::o;1948:83::-;1987:13;2017:7;2010:14;;;;;:::i;3146:153:2:-;3240:52;719:10:10;3273:8:2;3283;3240:18;:52::i;3729:90:14:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3794:12:14::1;:18:::0;3729:90::o;3995:110::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4045:53:14::1;::::0;719:10:10;;4076:21:14::1;4045:53:::0;::::1;;;::::0;::::1;::::0;;;4076:21;719:10:10;4045:53:14;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;3995:110::o:0;3045:130::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3121:15:14::1;:47:::0;;-1:-1:-1;;;;;3121:47:14;;::::1;;;-1:-1:-1::0;;;;;;3121:47:14;;::::1;::::0;;;::::1;::::0;;3045:130::o;3599:389:2:-;-1:-1:-1;;;;;3799:20:2;;719:10:10;3799:20:2;;:60;;-1:-1:-1;3823:36:2;3840:4;719:10:10;3366:166:2;:::i;3823:36::-;3778:148;;;;-1:-1:-1;;;3778:148:2;;14830:2:16;3778:148:2;;;14812:21:16;14869:2;14849:18;;;14842:30;14908:34;14888:18;;;14881:62;-1:-1:-1;;;14959:18:16;;;14952:39;15008:19;;3778:148:2;14628:405:16;3778:148:2;3936:45;3954:4;3960:2;3964;3968:6;3976:4;3936:17;:45::i;1918:198:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:10;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;14423:2:16;1998:73:0::1;::::0;::::1;14405:21:16::0;14462:2;14442:18;;;14435:30;14501:34;14481:18;;;14474:62;-1:-1:-1;;;14552:18:16;;;14545:36;14598:19;;1998:73:0::1;14221:402:16::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;328:703:11:-:0;384:13;601:10;597:51;;-1:-1:-1;;627:10:11;;;;;;;;;;;;-1:-1:-1;;;627:10:11;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:11;;-1:-1:-1;773:2:11;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:11;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:11;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:11;;;;;;;;-1:-1:-1;972:11:11;981:2;972:11;;:::i;:::-;;;844:150;;;1017:6;328:703;-1:-1:-1;;;;328:703:11:o;8630:709:2:-;-1:-1:-1;;;;;8777:16:2;;8769:62;;;;-1:-1:-1;;;8769:62:2;;21507:2:16;8769:62:2;;;21489:21:16;21546:2;21526:18;;;21519:30;21585:34;21565:18;;;21558:62;-1:-1:-1;;;21636:18:16;;;21629:31;21677:19;;8769:62:2;21305:397:16;8769:62:2;719:10:10;8842:16:2;8906:21;8924:2;8906:17;:21::i;:::-;8883:44;;8937:24;8964:25;8982:6;8964:17;:25::i;:::-;8937:52;;9000:66;9021:8;9039:1;9043:2;9047:3;9052:7;9061:4;9000:20;:66::i;:::-;9077:9;:13;;;;;;;;;;;-1:-1:-1;;;;;9077:17:2;;;;;;;;;:27;;9098:6;;9077:9;:27;;9098:6;;9077:27;:::i;:::-;;;;-1:-1:-1;;9119:52:2;;;22423:25:16;;;22479:2;22464:18;;22457:34;;;-1:-1:-1;;;;;9119:52:2;;;;9152:1;;9119:52;;;;;;22396:18:16;9119:52:2;;;;;;;9258:74;9289:8;9307:1;9311:2;9315;9319:6;9327:4;9258:30;:74::i;:::-;8759:580;;;8630:709;;;;:::o;6233:1115::-;6453:7;:14;6439:3;:10;:28;6431:81;;;;-1:-1:-1;;;6431:81:2;;21098:2:16;6431:81:2;;;21080:21:16;21137:2;21117:18;;;21110:30;21176:34;21156:18;;;21149:62;-1:-1:-1;;;21227:18:16;;;21220:38;21275:19;;6431:81:2;20896:404:16;6431:81:2;-1:-1:-1;;;;;6530:16:2;;6522:66;;;;-1:-1:-1;;;6522:66:2;;;;;;;:::i;:::-;719:10:10;6641:60:2;719:10:10;6672:4:2;6678:2;6682:3;6687:7;6696:4;6641:20;:60::i;:::-;6717:9;6712:411;6736:3;:10;6732:1;:14;6712:411;;;6767:10;6780:3;6784:1;6780:6;;;;;;;;:::i;:::-;;;;;;;6767:19;;6800:14;6817:7;6825:1;6817:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6842:19;6864:13;;;;;;;;;;-1:-1:-1;;;;;6864:19:2;;;;;;;;;;;;6817:10;;-1:-1:-1;6905:21:2;;;;6897:76;;;;-1:-1:-1;;;6897:76:2;;;;;;;:::i;:::-;7015:9;:13;;;;;;;;;;;-1:-1:-1;;;;;7015:19:2;;;;;;;;;;7037:20;;;7015:42;;7085:17;;;;;;;:27;;7037:20;;7015:9;7085:27;;7037:20;;7085:27;:::i;:::-;;;;;;;;6753:370;;;6748:3;;;;:::i;:::-;;;6712:411;;;;7168:2;-1:-1:-1;;;;;7138:47:2;7162:4;-1:-1:-1;;;;;7138:47:2;7152:8;-1:-1:-1;;;;;7138:47:2;;7172:3;7177:7;7138:47;;;;;;;:::i;:::-;;;;;;;;7266:75;7302:8;7312:4;7318:2;7322:3;7327:7;7336:4;7266:35;:75::i;:::-;6421:927;6233:1115;;;;;:::o;2270:187:0:-;2362:6;;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;12773:323:2:-;12923:8;-1:-1:-1;;;;;12914:17:2;:5;-1:-1:-1;;;;;12914:17:2;;;12906:71;;;;-1:-1:-1;;;12906:71:2;;19924:2:16;12906:71:2;;;19906:21:16;19963:2;19943:18;;;19936:30;20002:34;19982:18;;;19975:62;-1:-1:-1;;;20053:18:16;;;20046:39;20102:19;;12906:71:2;19722:405:16;12906:71:2;-1:-1:-1;;;;;12987:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12987:46:2;;;;;;;;;;13048:41;;12468::16;;;13048::2;;12441:18:16;13048:41:2;;;;;;;12773:323;;;:::o;4940:947::-;-1:-1:-1;;;;;5121:16:2;;5113:66;;;;-1:-1:-1;;;5113:66:2;;;;;;;:::i;:::-;719:10:10;5190:16:2;5254:21;5272:2;5254:17;:21::i;:::-;5231:44;;5285:24;5312:25;5330:6;5312:17;:25::i;:::-;5285:52;;5348:60;5369:8;5379:4;5385:2;5389:3;5394:7;5403:4;5348:20;:60::i;:::-;5419:19;5441:13;;;;;;;;;;;-1:-1:-1;;;;;5441:19:2;;;;;;;;;;5478:21;;;;5470:76;;;;-1:-1:-1;;;5470:76:2;;;;;;;:::i;:::-;5580:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5580:19:2;;;;;;;;;;5602:20;;;5580:42;;5642:17;;;;;;;:27;;5602:20;;5580:9;5642:27;;5602:20;;5642:27;:::i;:::-;;;;-1:-1:-1;;5685:46:2;;;22423:25:16;;;22479:2;22464:18;;22457:34;;;-1:-1:-1;;;;;5685:46:2;;;;;;;;;;;;;;22396:18:16;5685:46:2;;;;;;;5812:68;5843:8;5853:4;5859:2;5863;5867:6;5875:4;5812:30;:68::i;:::-;5103:784;;;;4940:947;;;;;:::o;16925:193::-;17044:16;;;17058:1;17044:16;;;;;;;;;16991;;17019:22;;17044:16;;;;;;;;;;;;-1:-1:-1;17044:16:2;17019:41;;17081:7;17070:5;17076:1;17070:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;17106:5;16925:193;-1:-1:-1;;16925:193:2:o;4310:257:14:-;4494:66;4521:8;4531:4;4537:2;4541:3;4546:7;4555:4;4494:26;:66::i;15396:725:2:-;-1:-1:-1;;;;;15603:13:2;;1465:19:9;:23;15599:516:2;;15638:72;;-1:-1:-1;;;15638:72:2;;-1:-1:-1;;;;;15638:38:2;;;;;:72;;15677:8;;15687:4;;15693:2;;15697:6;;15705:4;;15638:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15638:72:2;;;;;;;;-1:-1:-1;;15638:72:2;;;;;;;;;;;;:::i;:::-;;;15634:471;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;15981:6;15974:14;;-1:-1:-1;;;15974:14:2;;;;;;;;:::i;15634:471::-;;;16028:62;;-1:-1:-1;;;16028:62:2;;13181:2:16;16028:62:2;;;13163:21:16;13220:2;13200:18;;;13193:30;13259:34;13239:18;;;13232:62;-1:-1:-1;;;13310:18:16;;;13303:50;13370:19;;16028:62:2;12979:416:16;15634:471:2;-1:-1:-1;;;;;;15759:55:2;;-1:-1:-1;;;15759:55:2;15755:152;;15838:50;;-1:-1:-1;;;15838:50:2;;;;;;;:::i;16127:792::-;-1:-1:-1;;;;;16359:13:2;;1465:19:9;:23;16355:558:2;;16394:79;;-1:-1:-1;;;16394:79:2;;-1:-1:-1;;;;;16394:43:2;;;;;:79;;16438:8;;16448:4;;16454:3;;16459:7;;16468:4;;16394:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16394:79:2;;;;;;;;-1:-1:-1;;16394:79:2;;;;;;;;;;;;:::i;:::-;;;16390:513;;;;:::i;:::-;-1:-1:-1;;;;;;16552:60:2;;-1:-1:-1;;;16552:60:2;16548:157;;16636:50;;-1:-1:-1;;;16636:50:2;;;;;;;:::i;1091:904:5:-;-1:-1:-1;;;;;1403:18:5;;1399:156;;1442:9;1437:108;1461:3;:10;1457:1;:14;1437:108;;;1520:7;1528:1;1520:10;;;;;;;;:::i;:::-;;;;;;;1496:12;:20;1509:3;1513:1;1509:6;;;;;;;;:::i;:::-;;;;;;;1496:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;1473:3:5;;-1:-1:-1;1473:3:5;;:::i;:::-;;;1437:108;;;;1399:156;-1:-1:-1;;;;;1569:16:5;;1565:424;;1606:9;1601:378;1625:3;:10;1621:1;:14;1601:378;;;1660:10;1673:3;1677:1;1673:6;;;;;;;;:::i;:::-;;;;;;;1660:19;;1697:14;1714:7;1722:1;1714:10;;;;;;;;:::i;:::-;;;;;;;1697:27;;1742:14;1759:12;:16;1772:2;1759:16;;;;;;;;;;;;1742:33;;1811:6;1801;:16;;1793:69;;;;-1:-1:-1;;;1793:69:5;;19169:2:16;1793:69:5;;;19151:21:16;19208:2;19188:18;;;19181:30;19247:34;19227:18;;;19220:62;-1:-1:-1;;;19298:18:16;;;19291:38;19346:19;;1793:69:5;18967:404:16;1793:69:5;1912:16;;;;:12;:16;;;;;;1931:15;;1912:34;;1637:3;;;:::i;:::-;;;1601:378;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:16;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:16;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:16;;594:42;;584:70;;650:1;647;640:12;584:70;487:173;;;:::o;665:735::-;719:5;772:3;765:4;757:6;753:17;749:27;739:55;;790:1;787;780:12;739:55;826:6;813:20;852:4;875:43;915:2;875:43;:::i;:::-;947:2;941:9;959:31;987:2;979:6;959:31;:::i;:::-;1025:18;;;1059:15;;;;-1:-1:-1;1094:15:16;;;1144:1;1140:10;;;1128:23;;1124:32;;1121:41;-1:-1:-1;1118:61:16;;;1175:1;1172;1165:12;1118:61;1197:1;1207:163;1221:2;1218:1;1215:9;1207:163;;;1278:17;;1266:30;;1316:12;;;;1348;;;;1239:1;1232:9;1207:163;;;-1:-1:-1;1388:6:16;;665:735;-1:-1:-1;;;;;;;665:735:16:o;1405:220::-;1447:5;1500:3;1493:4;1485:6;1481:17;1477:27;1467:55;;1518:1;1515;1508:12;1467:55;1540:79;1615:3;1606:6;1593:20;1586:4;1578:6;1574:17;1540:79;:::i;:::-;1531:88;1405:220;-1:-1:-1;;;1405:220:16:o;1630:186::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:52;;;1758:1;1755;1748:12;1710:52;1781:29;1800:9;1781:29;:::i;1821:260::-;1889:6;1897;1950:2;1938:9;1929:7;1925:23;1921:32;1918:52;;;1966:1;1963;1956:12;1918:52;1989:29;2008:9;1989:29;:::i;:::-;1979:39;;2037:38;2071:2;2060:9;2056:18;2037:38;:::i;:::-;2027:48;;1821:260;;;;;:::o;2086:943::-;2240:6;2248;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:53;;;2342:1;2339;2332:12;2293:53;2365:29;2384:9;2365:29;:::i;:::-;2355:39;;2413:38;2447:2;2436:9;2432:18;2413:38;:::i;:::-;2403:48;;2502:2;2491:9;2487:18;2474:32;2525:18;2566:2;2558:6;2555:14;2552:34;;;2582:1;2579;2572:12;2552:34;2605:61;2658:7;2649:6;2638:9;2634:22;2605:61;:::i;:::-;2595:71;;2719:2;2708:9;2704:18;2691:32;2675:48;;2748:2;2738:8;2735:16;2732:36;;;2764:1;2761;2754:12;2732:36;2787:63;2842:7;2831:8;2820:9;2816:24;2787:63;:::i;:::-;2777:73;;2903:3;2892:9;2888:19;2875:33;2859:49;;2933:2;2923:8;2920:16;2917:36;;;2949:1;2946;2939:12;2917:36;;2972:51;3015:7;3004:8;2993:9;2989:24;2972:51;:::i;:::-;2962:61;;;2086:943;;;;;;;;:::o;3034:606::-;3138:6;3146;3154;3162;3170;3223:3;3211:9;3202:7;3198:23;3194:33;3191:53;;;3240:1;3237;3230:12;3191:53;3263:29;3282:9;3263:29;:::i;:::-;3253:39;;3311:38;3345:2;3334:9;3330:18;3311:38;:::i;:::-;3301:48;;3396:2;3385:9;3381:18;3368:32;3358:42;;3447:2;3436:9;3432:18;3419:32;3409:42;;3502:3;3491:9;3487:19;3474:33;3530:18;3522:6;3519:30;3516:50;;;3562:1;3559;3552:12;3516:50;3585:49;3626:7;3617:6;3606:9;3602:22;3585:49;:::i;3645:347::-;3710:6;3718;3771:2;3759:9;3750:7;3746:23;3742:32;3739:52;;;3787:1;3784;3777:12;3739:52;3810:29;3829:9;3810:29;:::i;:::-;3800:39;;3889:2;3878:9;3874:18;3861:32;3936:5;3929:13;3922:21;3915:5;3912:32;3902:60;;3958:1;3955;3948:12;3902:60;3981:5;3971:15;;;3645:347;;;;;:::o;3997:254::-;4065:6;4073;4126:2;4114:9;4105:7;4101:23;4097:32;4094:52;;;4142:1;4139;4132:12;4094:52;4165:29;4184:9;4165:29;:::i;:::-;4155:39;4241:2;4226:18;;;;4213:32;;-1:-1:-1;;;3997:254:16:o;4256:322::-;4333:6;4341;4349;4402:2;4390:9;4381:7;4377:23;4373:32;4370:52;;;4418:1;4415;4408:12;4370:52;4441:29;4460:9;4441:29;:::i;:::-;4431:39;4517:2;4502:18;;4489:32;;-1:-1:-1;4568:2:16;4553:18;;;4540:32;;4256:322;-1:-1:-1;;;4256:322:16:o;4583:1219::-;4701:6;4709;4762:2;4750:9;4741:7;4737:23;4733:32;4730:52;;;4778:1;4775;4768:12;4730:52;4818:9;4805:23;4847:18;4888:2;4880:6;4877:14;4874:34;;;4904:1;4901;4894:12;4874:34;4942:6;4931:9;4927:22;4917:32;;4987:7;4980:4;4976:2;4972:13;4968:27;4958:55;;5009:1;5006;4999:12;4958:55;5045:2;5032:16;5067:4;5090:43;5130:2;5090:43;:::i;:::-;5162:2;5156:9;5174:31;5202:2;5194:6;5174:31;:::i;:::-;5240:18;;;5274:15;;;;-1:-1:-1;5309:11:16;;;5351:1;5347:10;;;5339:19;;5335:28;;5332:41;-1:-1:-1;5329:61:16;;;5386:1;5383;5376:12;5329:61;5408:1;5399:10;;5418:169;5432:2;5429:1;5426:9;5418:169;;;5489:23;5508:3;5489:23;:::i;:::-;5477:36;;5450:1;5443:9;;;;;5533:12;;;;5565;;5418:169;;;-1:-1:-1;5606:6:16;-1:-1:-1;;5650:18:16;;5637:32;;-1:-1:-1;;5681:16:16;;;5678:36;;;5710:1;5707;5700:12;5678:36;;5733:63;5788:7;5777:8;5766:9;5762:24;5733:63;:::i;:::-;5723:73;;;4583:1219;;;;;:::o;5807:245::-;5865:6;5918:2;5906:9;5897:7;5893:23;5889:32;5886:52;;;5934:1;5931;5924:12;5886:52;5973:9;5960:23;5992:30;6016:5;5992:30;:::i;6057:249::-;6126:6;6179:2;6167:9;6158:7;6154:23;6150:32;6147:52;;;6195:1;6192;6185:12;6147:52;6227:9;6221:16;6246:30;6270:5;6246:30;:::i;6311:450::-;6380:6;6433:2;6421:9;6412:7;6408:23;6404:32;6401:52;;;6449:1;6446;6439:12;6401:52;6489:9;6476:23;6522:18;6514:6;6511:30;6508:50;;;6554:1;6551;6544:12;6508:50;6577:22;;6630:4;6622:13;;6618:27;-1:-1:-1;6608:55:16;;6659:1;6656;6649:12;6608:55;6682:73;6747:7;6742:2;6729:16;6724:2;6720;6716:11;6682:73;:::i;6766:180::-;6825:6;6878:2;6866:9;6857:7;6853:23;6849:32;6846:52;;;6894:1;6891;6884:12;6846:52;-1:-1:-1;6917:23:16;;6766:180;-1:-1:-1;6766:180:16:o;6951:184::-;7021:6;7074:2;7062:9;7053:7;7049:23;7045:32;7042:52;;;7090:1;7087;7080:12;7042:52;-1:-1:-1;7113:16:16;;6951:184;-1:-1:-1;6951:184:16:o;7140:248::-;7208:6;7216;7269:2;7257:9;7248:7;7244:23;7240:32;7237:52;;;7285:1;7282;7275:12;7237:52;-1:-1:-1;;7308:23:16;;;7378:2;7363:18;;;7350:32;;-1:-1:-1;7140:248:16:o;7393:435::-;7446:3;7484:5;7478:12;7511:6;7506:3;7499:19;7537:4;7566:2;7561:3;7557:12;7550:19;;7603:2;7596:5;7592:14;7624:1;7634:169;7648:6;7645:1;7642:13;7634:169;;;7709:13;;7697:26;;7743:12;;;;7778:15;;;;7670:1;7663:9;7634:169;;;-1:-1:-1;7819:3:16;;7393:435;-1:-1:-1;;;;;7393:435:16:o;7833:257::-;7874:3;7912:5;7906:12;7939:6;7934:3;7927:19;7955:63;8011:6;8004:4;7999:3;7995:14;7988:4;7981:5;7977:16;7955:63;:::i;:::-;8072:2;8051:15;-1:-1:-1;;8047:29:16;8038:39;;;;8079:4;8034:50;;7833:257;-1:-1:-1;;7833:257:16:o;8095:185::-;8137:3;8175:5;8169:12;8190:52;8235:6;8230:3;8223:4;8216:5;8212:16;8190:52;:::i;:::-;8258:16;;;;;8095:185;-1:-1:-1;;8095:185:16:o;8403:1301::-;8680:3;8709:1;8742:6;8736:13;8772:3;8794:1;8822:9;8818:2;8814:18;8804:28;;8882:2;8871:9;8867:18;8904;8894:61;;8948:4;8940:6;8936:17;8926:27;;8894:61;8974:2;9022;9014:6;9011:14;8991:18;8988:38;8985:165;;;-1:-1:-1;;;9049:33:16;;9105:4;9102:1;9095:15;9135:4;9056:3;9123:17;8985:165;9166:18;9193:104;;;;9311:1;9306:320;;;;9159:467;;9193:104;-1:-1:-1;;9226:24:16;;9214:37;;9271:16;;;;-1:-1:-1;9193:104:16;;9306:320;22763:1;22756:14;;;22800:4;22787:18;;9401:1;9415:165;9429:6;9426:1;9423:13;9415:165;;;9507:14;;9494:11;;;9487:35;9550:16;;;;9444:10;;9415:165;;;9419:3;;9609:6;9604:3;9600:16;9593:23;;9159:467;;;;;;;9642:56;9667:30;9693:3;9685:6;9667:30;:::i;:::-;-1:-1:-1;;;8345:20:16;;8390:1;8381:11;;8285:113;9642:56;9635:63;8403:1301;-1:-1:-1;;;;;8403:1301:16:o;9917:826::-;-1:-1:-1;;;;;10314:15:16;;;10296:34;;10366:15;;10361:2;10346:18;;10339:43;10276:3;10413:2;10398:18;;10391:31;;;10239:4;;10445:57;;10482:19;;10474:6;10445:57;:::i;:::-;10550:9;10542:6;10538:22;10533:2;10522:9;10518:18;10511:50;10584:44;10621:6;10613;10584:44;:::i;:::-;10570:58;;10677:9;10669:6;10665:22;10659:3;10648:9;10644:19;10637:51;10705:32;10730:6;10722;10705:32;:::i;:::-;10697:40;9917:826;-1:-1:-1;;;;;;;;9917:826:16:o;10748:560::-;-1:-1:-1;;;;;11045:15:16;;;11027:34;;11097:15;;11092:2;11077:18;;11070:43;11144:2;11129:18;;11122:34;;;11187:2;11172:18;;11165:34;;;11007:3;11230;11215:19;;11208:32;;;10970:4;;11257:45;;11282:19;;11274:6;11257:45;:::i;:::-;11249:53;10748:560;-1:-1:-1;;;;;;;10748:560:16:o;11592:261::-;11771:2;11760:9;11753:21;11734:4;11791:56;11843:2;11832:9;11828:18;11820:6;11791:56;:::i;11858:465::-;12115:2;12104:9;12097:21;12078:4;12141:56;12193:2;12182:9;12178:18;12170:6;12141:56;:::i;:::-;12245:9;12237:6;12233:22;12228:2;12217:9;12213:18;12206:50;12273:44;12310:6;12302;12273:44;:::i;12755:219::-;12904:2;12893:9;12886:21;12867:4;12924:44;12964:2;12953:9;12949:18;12941:6;12924:44;:::i;13400:404::-;13602:2;13584:21;;;13641:2;13621:18;;;13614:30;13680:34;13675:2;13660:18;;13653:62;-1:-1:-1;;;13746:2:16;13731:18;;13724:38;13794:3;13779:19;;13400:404::o;16212:401::-;16414:2;16396:21;;;16453:2;16433:18;;;16426:30;16492:34;16487:2;16472:18;;16465:62;-1:-1:-1;;;16558:2:16;16543:18;;16536:35;16603:3;16588:19;;16212:401::o;17449:406::-;17651:2;17633:21;;;17690:2;17670:18;;;17663:30;17729:34;17724:2;17709:18;;17702:62;-1:-1:-1;;;17795:2:16;17780:18;;17773:40;17845:3;17830:19;;17449:406::o;18199:356::-;18401:2;18383:21;;;18420:18;;;18413:30;18479:34;18474:2;18459:18;;18452:62;18546:2;18531:18;;18199:356::o;22502:183::-;22562:4;22595:18;22587:6;22584:30;22581:56;;;22617:18;;:::i;:::-;-1:-1:-1;22662:1:16;22658:14;22674:4;22654:25;;22502:183::o;22816:128::-;22856:3;22887:1;22883:6;22880:1;22877:13;22874:39;;;22893:18;;:::i;:::-;-1:-1:-1;22929:9:16;;22816:128::o;22949:120::-;22989:1;23015;23005:35;;23020:18;;:::i;:::-;-1:-1:-1;23054:9:16;;22949:120::o;23074:168::-;23114:7;23180:1;23176;23172:6;23168:14;23165:1;23162:21;23157:1;23150:9;23143:17;23139:45;23136:71;;;23187:18;;:::i;:::-;-1:-1:-1;23227:9:16;;23074:168::o;23247:125::-;23287:4;23315:1;23312;23309:8;23306:34;;;23320:18;;:::i;:::-;-1:-1:-1;23357:9:16;;23247:125::o;23377:258::-;23449:1;23459:113;23473:6;23470:1;23467:13;23459:113;;;23549:11;;;23543:18;23530:11;;;23523:39;23495:2;23488:10;23459:113;;;23590:6;23587:1;23584:13;23581:48;;;23625:1;23616:6;23611:3;23607:16;23600:27;23581:48;;23377:258;;;:::o;23640:380::-;23719:1;23715:12;;;;23762;;;23783:61;;23837:4;23829:6;23825:17;23815:27;;23783:61;23890:2;23882:6;23879:14;23859:18;23856:38;23853:161;;;23936:10;23931:3;23927:20;23924:1;23917:31;23971:4;23968:1;23961:15;23999:4;23996:1;23989:15;23853:161;;23640:380;;;:::o;24025:249::-;24135:2;24116:13;;-1:-1:-1;;24112:27:16;24100:40;;24170:18;24155:34;;24191:22;;;24152:62;24149:88;;;24217:18;;:::i;:::-;24253:2;24246:22;-1:-1:-1;;24025:249:16:o;24279:135::-;24318:3;-1:-1:-1;;24339:17:16;;24336:43;;;24359:18;;:::i;:::-;-1:-1:-1;24406:1:16;24395:13;;24279:135::o;24419:112::-;24451:1;24477;24467:35;;24482:18;;:::i;:::-;-1:-1:-1;24516:9:16;;24419:112::o;24536:127::-;24597:10;24592:3;24588:20;24585:1;24578:31;24628:4;24625:1;24618:15;24652:4;24649:1;24642:15;24668:127;24729:10;24724:3;24720:20;24717:1;24710:31;24760:4;24757:1;24750:15;24784:4;24781:1;24774:15;24800:127;24861:10;24856:3;24852:20;24849:1;24842:31;24892:4;24889:1;24882:15;24916:4;24913:1;24906:15;24932:127;24993:10;24988:3;24984:20;24981:1;24974:31;25024:4;25021:1;25014:15;25048:4;25045:1;25038:15;25064:179;25099:3;25141:1;25123:16;25120:23;25117:120;;;25187:1;25184;25181;25166:23;-1:-1:-1;25224:1:16;25218:8;25213:3;25209:18;25117:120;25064:179;:::o;25248:671::-;25287:3;25329:4;25311:16;25308:26;25305:39;;;25248:671;:::o;25305:39::-;25371:2;25365:9;-1:-1:-1;;25436:16:16;25432:25;;25429:1;25365:9;25408:50;25487:4;25481:11;25511:16;25546:18;25617:2;25610:4;25602:6;25598:17;25595:25;25590:2;25582:6;25579:14;25576:45;25573:58;;;25624:5;;;;;25248:671;:::o;25573:58::-;25661:6;25655:4;25651:17;25640:28;;25697:3;25691:10;25724:2;25716:6;25713:14;25710:27;;;25730:5;;;;;;25248:671;:::o;25710:27::-;25814:2;25795:16;25789:4;25785:27;25781:36;25774:4;25765:6;25760:3;25756:16;25752:27;25749:69;25746:82;;;25821:5;;;;;;25248:671;:::o;25746:82::-;25837:57;25888:4;25879:6;25871;25867:19;25863:30;25857:4;25837:57;:::i;:::-;-1:-1:-1;25910:3:16;;25248:671;-1:-1:-1;;;;;25248:671:16:o;25924:131::-;-1:-1:-1;;;;;;25998:32:16;;25988:43;;25978:71;;26045:1;26042;26035:12

Swarm Source

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