ETH Price: $3,281.68 (+0.06%)
Gas: 3 Gwei

Token

Malibu Beach Hut (MBH)
 

Overview

Max Total Supply

751 MBH

Holders

186

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
changerscards.eth
0xcec60e481C957D3eC2c73AFDF1f4F4A80F460B86
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:
MalibuBeachHut

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

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

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
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 "./MalibuCoinI.sol";

//     __    __  ______  __      __  ______  __  __                         
//    /\ "-./  \/\  __ \/\ \    /\ \/\  == \/\ \/\ \                        
//    \ \ \-./\ \ \  __ \ \ \___\ \ \ \  __<\ \ \_\ \                       
//     \ \_\ \ \_\ \_\ \_\ \_____\ \_\ \_____\ \_____\                      
//      \/_/  \/_/\/_/\/_/\/_____/\/_/\/_____/\/_____/                      
//     ______  ______  ______  ______  __  __       __  __  __  __  ______  
//    /\  == \/\  ___\/\  __ \/\  ___\/\ \_\ \     /\ \_\ \/\ \/\ \/\__  _\ 
//    \ \  __<\ \  __\\ \  __ \ \ \___\ \  __ \    \ \  __ \ \ \_\ \/_/\ \/ 
//     \ \_____\ \_____\ \_\ \_\ \_____\ \_\ \_\    \ \_\ \_\ \_____\ \ \_\ 
//      \/_____/\/_____/\/_/\/_/\/_____/\/_/\/_/     \/_/\/_/\/_____/  \/_/ 

contract MalibuBeachHut is ERC1155Supply, Ownable, ReentrancyGuard {

    string collectionURI = "";
    string private name_;
    string private symbol_; 
    uint256 public tokenQty;
    uint256 public commissionQty;
    uint256 public tokenPrice;
    uint256 public currentTokenId;
    uint256 public backfillTokenId;
    uint256 public maxMintQty;
    uint256 public maxWalletQty;
    uint[] public unlockableNFTs;
    uint256 public unlockableQty;
    uint256 public unlockablePrice;
    uint256 public currentUnlockableId;
    bool public paused;
    address public CoinContract;

    MalibuCoinI public coin;

    constructor() ERC1155(collectionURI) {
        name_ = "Malibu Beach Hut";
        symbol_ = "MBH";
        tokenQty = 5;
        commissionQty = 3;
        tokenPrice = 300 * 10 ** 18;
        currentTokenId = 137;
        backfillTokenId = 137;
        maxMintQty = 1;
        maxWalletQty = 1;
        unlockableQty = 2;
        unlockablePrice = 150 * 10 ** 18;
        paused = true;
    }
    
    function name() public view returns (string memory) {
      return name_;
    }

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

    function mint(uint256 id)
        public
        nonReentrant
    {
        checkMintRequirements(id, tokenPrice);

        coin.transferFrom(_msgSender(), address(this), tokenPrice);
        _mint(_msgSender(), id, maxMintQty, "");
    }

    function mintUnlockable() 
        public 
        nonReentrant 
    {
        uint256 counter = 0;

        for(uint i = 0; i < unlockableNFTs.length; i++){
           if(balanceOf(_msgSender(), unlockableNFTs[i]) > 0) {
                counter++;
           }
        }

        require(counter >= unlockableQty, "You do not own enough base NFTs for this unlockable");

        checkMintRequirements(currentUnlockableId, unlockablePrice);

        coin.transferFrom(_msgSender(), address(this), unlockablePrice);
        _mint(_msgSender(), currentUnlockableId, maxMintQty, "");
    }

    function checkMintRequirements(uint256 id, uint256 price) private view {
        require(paused == false, "Minting is paused");
        require(totalSupply(id) < tokenQty, "All Minted");
        require(id <= currentTokenId, "This token ID has not been published yet" );
        require(id > backfillTokenId, "This token ID is reserved" );
        require(this.balanceOf(_msgSender(), id) + maxMintQty <= maxWalletQty, "You have hit the max tokens per wallet");
        require(tx.origin == _msgSender(), "The caller is another contract");
        require(coin.balanceOf(_msgSender()) >= price, "You do not own enough Malibu Coins to make this transaction");
    }

    //=============================================================================
    // Private Functions
    //=============================================================================

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

    function mintCommission(address account) public onlyOwner {
        currentTokenId++;
        _mint(account, currentTokenId, commissionQty, "");
    }

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

    function getCollectionURI() public view returns(string memory) {
        return collectionURI;
    }

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

    function setCommissionQty(uint256 qty) public onlyOwner {
        commissionQty = qty;
    }

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

    function setBackfillTokenId(uint256 id) public onlyOwner {
        backfillTokenId = id;
    }

    function setCurrentTokenId(uint256 id) public onlyOwner {
        currentTokenId = id;
    }

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

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

    function setUnlockableNFTs(uint[] memory nfts) public onlyOwner {
        unlockableNFTs = nfts;
    }

    function setUnlockableQty(uint256 qty) public onlyOwner {
        unlockableQty = qty;
    }

    function setUnlockablePrice(uint256 price) public onlyOwner {
        unlockablePrice = price;
    }

    function setcurrentUnlockableId(uint256 id) public onlyOwner {
        currentUnlockableId = id;
    }

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

    function setMalibuCoin(address _contract) external onlyOwner {
        require(_contract != address(0), "Can not be address 0");
        coin = MalibuCoinI(_contract);
        CoinContract = _contract;
    }

    function coinWithdraw() public onlyOwner {
        coin.transferFrom(address(this), owner(), coin.balanceOf(address(this)));
    }

    //=============================================================================
    // 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 17 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 3 of 17 : 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 4 of 17 : 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 5 of 17 : 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 6 of 17 : 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 7 of 17 : MalibuCoinI.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

abstract contract MalibuCoinI is IERC20, Ownable {
         uint256 public maxSupply;

        function getUnclaimedMalibuCoins(address account) external view virtual returns (uint256 amount);
        
        function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool);

        function balanceOf(address account) public view virtual override returns (uint256);
}

File 8 of 17 : 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 9 of 17 : 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 10 of 17 : 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 11 of 17 : 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 12 of 17 : 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 13 of 17 : 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 14 of 17 : 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 15 of 17 : 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 16 of 17 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 17 of 17 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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":[],"name":"CoinContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":[],"name":"backfillTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"coin","outputs":[{"internalType":"contract MalibuCoinI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coinWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commissionQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentUnlockableId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollectionURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxWalletQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"mintCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintUnlockable","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"id","type":"uint256"}],"name":"setBackfillTokenId","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":"setCommissionQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setCurrentTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setMalibuCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"setMaxMintQty","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":"uint256[]","name":"nfts","type":"uint256[]"}],"name":"setUnlockableNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setUnlockablePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"setUnlockableQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setcurrentUnlockableId","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":"","type":"uint256"}],"name":"unlockableNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockablePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockableQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60a06040819052600060808190526200001b9160069162000203565b503480156200002957600080fd5b50600680546200003990620002a9565b80601f01602080910402602001604051908101604052809291908181526020018280546200006790620002a9565b8015620000b85780601f106200008c57610100808354040283529160200191620000b8565b820191906000526020600020905b8154815290600101906020018083116200009a57829003601f168201915b5050505050620000ce816200019860201b60201c565b50620000da33620001b1565b60016005556040805180820190915260108082526f13585b1a589d4810995858da08121d5d60821b6020909201918252620001189160079162000203565b506040805180820190915260038082526209a84960eb1b6020909201918252620001459160089162000203565b5060056009556003600a55681043561a8829300000600b556089600c819055600d556001600e819055600f8190556002601155680821ab0d44149800006012556014805460ff19169091179055620002e6565b8051620001ad90600290602084019062000203565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200021190620002a9565b90600052602060002090601f01602090048101928262000235576000855562000280565b82601f106200025057805160ff191683800117855562000280565b8280016001018555821562000280579182015b828111156200028057825182559160200191906001019062000263565b506200028e92915062000292565b5090565b5b808211156200028e576000815560010162000293565b600181811c90821680620002be57607f821691505b60208210811415620002e057634e487b7160e01b600052602260045260246000fd5b50919050565b612d2680620002f66000396000f3fe608060405234801561001057600080fd5b50600436106102b95760003560e01c80637ff9b59611610182578063acb695b0116100e9578063e985e9c5116100a2578063f242432a1161007c578063f242432a14610607578063f2fde38b1461061a578063f3a16caa1461062d578063f88297a41461063657600080fd5b8063e985e9c5146105ba578063eb0981f1146105f6578063edfd36cd146105ff57600080fd5b8063acb695b01461055b578063b5b2077914610564578063bd85b03914610577578063c19cec8f14610597578063cfb5bb1f146105aa578063e4892d46146105b257600080fd5b80639d58b29b1161013b5780639d58b29b146104fd5780639f68890714610506578063a0712d6814610519578063a22cb4651461052c578063a96c11941461053f578063aaa455e01461055257600080fd5b80637ff9b596146104a25780638329de2f146104ab57806387b18fe8146104be5780638da5cb5b146104d157806395d89b41146104e2578063974dbb2f146104ea57600080fd5b80632639f460116102265780634f558e79116101df5780634f558e791461042d5780635c975abb1461044f578063658d4e4f1461045c5780636a61e5fc14610474578063715018a614610487578063724b5dd71461048f57600080fd5b80632639f460146103c35780632eb2c2d6146103d657806336566f06146103e95780633688236d146103f157806346a607c2146103fa5780634e1273f41461040d57600080fd5b806311df99951161027857806311df99951461034d57806314170c721461037857806315aacce21461038b5780631eac069114610394578063236effd91461039d57806324bce765146103b057600080fd5b80629a9b7b146102be578062fdd58e146102da57806301ffc9a7146102ed57806306fdde03146103105780630e89341c14610325578063112f36a414610338575b600080fd5b6102c7600c5481565b6040519081526020015b60405180910390f35b6102c76102e8366004612533565b610649565b6103006102fb3660046126b3565b6106e0565b60405190151581526020016102d1565b610318610732565b6040516102d19190612981565b610318610333366004612736565b6107c4565b61034b61034636600461255d565b6107f8565b005b601554610360906001600160a01b031681565b6040516001600160a01b0390911681526020016102d1565b61034b610386366004612736565b610842565b6102c760135481565b6102c760095481565b61034b6103ab366004612736565b610871565b61034b6103be366004612736565b6108a0565b61034b6103d13660046126ed565b6108cf565b61034b6103e43660046123ed565b610910565b61034b6109a7565b6102c7600e5481565b61034b61040836600461239f565b6109e5565b61042061041b366004612590565b610a98565b6040516102d19190612949565b61030061043b366004612736565b600090815260036020526040902054151590565b6014546103009060ff1681565b6014546103609061010090046001600160a01b031681565b61034b610482366004612736565b610bc2565b61034b610bf1565b61034b61049d366004612736565b610c27565b6102c7600b5481565b61034b6104b9366004612736565b610c56565b6102c76104cc366004612736565b610c85565b6004546001600160a01b0316610360565b610318610ca6565b61034b6104f836600461239f565b610cb5565b6102c760115481565b61034b610514366004612661565b610d16565b61034b610527366004612736565b610d53565b61034b61053a3660046124fc565b610e78565b61034b61054d366004612736565b610e83565b6102c7600d5481565b6102c7600f5481565b61034b610572366004612736565b610eb2565b6102c7610585366004612736565b60009081526003602052604090205490565b61034b6105a5366004612736565b610ee1565b610318610f10565b61034b610f1f565b6103006105c83660046123ba565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102c7600a5481565b61034b61110a565b61034b610615366004612497565b61125a565b61034b61062836600461239f565b6112e1565b6102c760125481565b61034b610644366004612736565b611379565b60006001600160a01b0383166106ba5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061071157506001600160e01b031982166303a24d0760e21b145b8061072c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606007805461074190612b37565b80601f016020809104026020016040519081016040528092919081815260200182805461076d90612b37565b80156107ba5780601f1061078f576101008083540402835291602001916107ba565b820191906000526020600020905b81548152906001019060200180831161079d57829003601f168201915b5050505050905090565b606060066107d1836113a8565b6040516020016107e29291906127eb565b6040516020818303038152906040529050919050565b6004546001600160a01b031633146108225760405162461bcd60e51b81526004016106b190612a6b565b61083d838383604051806020016040528060008152506114ae565b505050565b6004546001600160a01b0316331461086c5760405162461bcd60e51b81526004016106b190612a6b565b601255565b6004546001600160a01b0316331461089b5760405162461bcd60e51b81526004016106b190612a6b565b600955565b6004546001600160a01b031633146108ca5760405162461bcd60e51b81526004016106b190612a6b565b601355565b6004546001600160a01b031633146108f95760405162461bcd60e51b81526004016106b190612a6b565b805161090c9060069060208401906121b4565b5050565b6001600160a01b03851633148061092c575061092c85336105c8565b6109935760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016106b1565b6109a085858585856115d1565b5050505050565b6004546001600160a01b031633146109d15760405162461bcd60e51b81526004016106b190612a6b565b6014805460ff19811660ff90911615179055565b6004546001600160a01b03163314610a0f5760405162461bcd60e51b81526004016106b190612a6b565b6001600160a01b038116610a5c5760405162461bcd60e51b8152602060048201526014602482015273043616e206e6f74206265206164647265737320360641b60448201526064016106b1565b601580546001600160a01b0319166001600160a01b0392909216918217905560148054610100600160a81b031916610100909202919091179055565b60608151835114610afd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106b1565b6000835167ffffffffffffffff811115610b1957610b19612c10565b604051908082528060200260200182016040528015610b42578160200160208202803683370190505b50905060005b8451811015610bba57610b8d858281518110610b6657610b66612bfa565b6020026020010151858381518110610b8057610b80612bfa565b6020026020010151610649565b828281518110610b9f57610b9f612bfa565b6020908102919091010152610bb381612b9f565b9050610b48565b509392505050565b6004546001600160a01b03163314610bec5760405162461bcd60e51b81526004016106b190612a6b565b600b55565b6004546001600160a01b03163314610c1b5760405162461bcd60e51b81526004016106b190612a6b565b610c2560006117bc565b565b6004546001600160a01b03163314610c515760405162461bcd60e51b81526004016106b190612a6b565b600e55565b6004546001600160a01b03163314610c805760405162461bcd60e51b81526004016106b190612a6b565b600c55565b60108181548110610c9557600080fd5b600091825260209091200154905081565b60606008805461074190612b37565b6004546001600160a01b03163314610cdf5760405162461bcd60e51b81526004016106b190612a6b565b600c8054906000610cef83612b9f565b9190505550610d1381600c54600a54604051806020016040528060008152506114ae565b50565b6004546001600160a01b03163314610d405760405162461bcd60e51b81526004016106b190612a6b565b805161090c906010906020840190612238565b60026005541415610da65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106b1565b6002600555600b54610db990829061180e565b6015546001600160a01b03166323b872dd33600b546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301526044820152606401602060405180830381600087803b158015610e1a57600080fd5b505af1158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e529190612696565b50610e703382600e54604051806020016040528060008152506114ae565b506001600555565b61090c338383611b94565b6004546001600160a01b03163314610ead5760405162461bcd60e51b81526004016106b190612a6b565b601155565b6004546001600160a01b03163314610edc5760405162461bcd60e51b81526004016106b190612a6b565b600f55565b6004546001600160a01b03163314610f0b5760405162461bcd60e51b81526004016106b190612a6b565b600d55565b60606006805461074190612b37565b60026005541415610f725760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106b1565b60026005556000805b601054811015610fd4576000610fae3360108481548110610f9e57610f9e612bfa565b9060005260206000200154610649565b1115610fc25781610fbe81612b9f565b9250505b80610fcc81612b9f565b915050610f7b565b506011548110156110435760405162461bcd60e51b815260206004820152603360248201527f596f7520646f206e6f74206f776e20656e6f7567682062617365204e46547320604482015272666f72207468697320756e6c6f636b61626c6560681b60648201526084016106b1565b61105160135460125461180e565b6015546001600160a01b03166323b872dd336012546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301526044820152606401602060405180830381600087803b1580156110b257600080fd5b505af11580156110c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ea9190612696565b50610e7033601354600e54604051806020016040528060008152506114ae565b6004546001600160a01b031633146111345760405162461bcd60e51b81526004016106b190612a6b565b6015546001600160a01b03166323b872dd306111586004546001600160a01b031690565b6015546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561119b57600080fd5b505afa1580156111af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d3919061274f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561122257600080fd5b505af1158015611236573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d139190612696565b6001600160a01b038516331480611276575061127685336105c8565b6112d45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016106b1565b6109a08585858585611c75565b6004546001600160a01b0316331461130b5760405162461bcd60e51b81526004016106b190612a6b565b6001600160a01b0381166113705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b1565b610d13816117bc565b6004546001600160a01b031633146113a35760405162461bcd60e51b81526004016106b190612a6b565b600a55565b6060816113cc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113f657806113e081612b9f565b91506113ef9050600a83612adc565b91506113d0565b60008167ffffffffffffffff81111561141157611411612c10565b6040519080825280601f01601f19166020018201604052801561143b576020820181803683370190505b5090505b84156114a657611450600183612af0565b915061145d600a86612bba565b611468906030612ac4565b60f81b81838151811061147d5761147d612bfa565b60200101906001600160f81b031916908160001a90535061149f600a86612adc565b945061143f565b949350505050565b6001600160a01b03841661150e5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016106b1565b33600061151a85611dad565b9050600061152785611dad565b905061153883600089858589611df8565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611568908490612ac4565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115c883600089898989611e06565b50505050505050565b81518351146116335760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016106b1565b6001600160a01b0384166116595760405162461bcd60e51b81526004016106b1906129dc565b33611668818787878787611df8565b60005b845181101561174e57600085828151811061168857611688612bfa565b6020026020010151905060008583815181106116a6576116a6612bfa565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156116f65760405162461bcd60e51b81526004016106b190612a21565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611733908490612ac4565b925050819055505050508061174790612b9f565b905061166b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161179e92919061295c565b60405180910390a46117b4818787878787611f71565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60145460ff16156118555760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b60448201526064016106b1565b600954600083815260036020526040902054106118a15760405162461bcd60e51b815260206004820152600a602482015269105b1b08135a5b9d195960b21b60448201526064016106b1565b600c548211156119045760405162461bcd60e51b815260206004820152602860248201527f5468697320746f6b656e20494420686173206e6f74206265656e207075626c696044820152671cda1959081e595d60c21b60648201526084016106b1565b600d5482116119555760405162461bcd60e51b815260206004820152601960248201527f5468697320746f6b656e2049442069732072657365727665640000000000000060448201526064016106b1565b600f54600e543062fdd58e336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024810187905260440160206040518083038186803b1580156119a757600080fd5b505afa1580156119bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119df919061274f565b6119e99190612ac4565b1115611a465760405162461bcd60e51b815260206004820152602660248201527f596f7520686176652068697420746865206d617820746f6b656e7320706572206044820152651dd85b1b195d60d21b60648201526084016106b1565b323314611a955760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064016106b1565b60155481906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611ae857600080fd5b505afa158015611afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b20919061274f565b101561090c5760405162461bcd60e51b815260206004820152603b60248201527f596f7520646f206e6f74206f776e20656e6f756768204d616c69627520436f6960448201527f6e7320746f206d616b652074686973207472616e73616374696f6e000000000060648201526084016106b1565b816001600160a01b0316836001600160a01b03161415611c085760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016106b1565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611c9b5760405162461bcd60e51b81526004016106b1906129dc565b336000611ca785611dad565b90506000611cb485611dad565b9050611cc4838989858589611df8565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015611d055760405162461bcd60e51b81526004016106b190612a21565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611d42908490612ac4565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611da2848a8a8a8a8a611e06565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611de757611de7612bfa565b602090810291909101015292915050565b6117b486868686868661203b565b6001600160a01b0384163b156117b45760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e4a9089908990889088908890600401612904565b602060405180830381600087803b158015611e6457600080fd5b505af1925050508015611e94575060408051601f3d908101601f19168201909252611e91918101906126d0565b60015b611f4157611ea0612c26565b806308c379a01415611eda5750611eb5612c42565b80611ec05750611edc565b8060405162461bcd60e51b81526004016106b19190612981565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016106b1565b6001600160e01b0319811663f23a6e6160e01b146115c85760405162461bcd60e51b81526004016106b190612994565b6001600160a01b0384163b156117b45760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611fb590899089908890889088906004016128a6565b602060405180830381600087803b158015611fcf57600080fd5b505af1925050508015611fff575060408051601f3d908101601f19168201909252611ffc918101906126d0565b60015b61200b57611ea0612c26565b6001600160e01b0319811663bc197c8160e01b146115c85760405162461bcd60e51b81526004016106b190612994565b6001600160a01b0385166120c25760005b83518110156120c05782818151811061206757612067612bfa565b60200260200101516003600086848151811061208557612085612bfa565b6020026020010151815260200190815260200160002060008282546120aa9190612ac4565b909155506120b9905081612b9f565b905061204c565b505b6001600160a01b0384166117b45760005b83518110156115c85760008482815181106120f0576120f0612bfa565b60200260200101519050600084838151811061210e5761210e612bfa565b60200260200101519050600060036000848152602001908152602001600020549050818110156121915760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016106b1565b600092835260036020526040909220910390556121ad81612b9f565b90506120d3565b8280546121c090612b37565b90600052602060002090601f0160209004810192826121e25760008555612228565b82601f106121fb57805160ff1916838001178555612228565b82800160010185558215612228579182015b8281111561222857825182559160200191906001019061220d565b50612234929150612272565b5090565b828054828255906000526020600020908101928215612228579160200282018281111561222857825182559160200191906001019061220d565b5b808211156122345760008155600101612273565b600067ffffffffffffffff8311156122a1576122a1612c10565b6040516122b8601f8501601f191660200182612b72565b8091508381528484840111156122cd57600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146122fc57600080fd5b919050565b600082601f83011261231257600080fd5b8135602061231f82612aa0565b60405161232c8282612b72565b8381528281019150858301600585901b8701840188101561234c57600080fd5b60005b8581101561236b5781358452928401929084019060010161234f565b5090979650505050505050565b600082601f83011261238957600080fd5b61239883833560208501612287565b9392505050565b6000602082840312156123b157600080fd5b612398826122e5565b600080604083850312156123cd57600080fd5b6123d6836122e5565b91506123e4602084016122e5565b90509250929050565b600080600080600060a0868803121561240557600080fd5b61240e866122e5565b945061241c602087016122e5565b9350604086013567ffffffffffffffff8082111561243957600080fd5b61244589838a01612301565b9450606088013591508082111561245b57600080fd5b61246789838a01612301565b9350608088013591508082111561247d57600080fd5b5061248a88828901612378565b9150509295509295909350565b600080600080600060a086880312156124af57600080fd5b6124b8866122e5565b94506124c6602087016122e5565b93506040860135925060608601359150608086013567ffffffffffffffff8111156124f057600080fd5b61248a88828901612378565b6000806040838503121561250f57600080fd5b612518836122e5565b9150602083013561252881612ccc565b809150509250929050565b6000806040838503121561254657600080fd5b61254f836122e5565b946020939093013593505050565b60008060006060848603121561257257600080fd5b61257b846122e5565b95602085013595506040909401359392505050565b600080604083850312156125a357600080fd5b823567ffffffffffffffff808211156125bb57600080fd5b818501915085601f8301126125cf57600080fd5b813560206125dc82612aa0565b6040516125e98282612b72565b8381528281019150858301600585901b870184018b101561260957600080fd5b600096505b848710156126335761261f816122e5565b83526001969096019591830191830161260e565b509650508601359250508082111561264a57600080fd5b5061265785828601612301565b9150509250929050565b60006020828403121561267357600080fd5b813567ffffffffffffffff81111561268a57600080fd5b6114a684828501612301565b6000602082840312156126a857600080fd5b815161239881612ccc565b6000602082840312156126c557600080fd5b813561239881612cda565b6000602082840312156126e257600080fd5b815161239881612cda565b6000602082840312156126ff57600080fd5b813567ffffffffffffffff81111561271657600080fd5b8201601f8101841361272757600080fd5b6114a684823560208401612287565b60006020828403121561274857600080fd5b5035919050565b60006020828403121561276157600080fd5b5051919050565b600081518084526020808501945080840160005b838110156127985781518752958201959082019060010161277c565b509495945050505050565b600081518084526127bb816020860160208601612b07565b601f01601f19169290920160200192915050565b600081516127e1818560208601612b07565b9290920192915050565b600080845481600182811c91508083168061280757607f831692505b602080841082141561282757634e487b7160e01b86526022600452602486fd5b81801561283b576001811461284c57612879565b60ff19861689528489019650612879565b60008b81526020902060005b868110156128715781548b820152908501908301612858565b505084890196505b50505050505061289d61288c82866127cf565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906128d290830186612768565b82810360608401526128e48186612768565b905082810360808401526128f881856127a3565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061293e908301846127a3565b979650505050505050565b6020815260006123986020830184612768565b60408152600061296f6040830185612768565b828103602084015261289d8185612768565b60208152600061239860208301846127a3565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115612aba57612aba612c10565b5060051b60200190565b60008219821115612ad757612ad7612bce565b500190565b600082612aeb57612aeb612be4565b500490565b600082821015612b0257612b02612bce565b500390565b60005b83811015612b22578181015183820152602001612b0a565b83811115612b31576000848401525b50505050565b600181811c90821680612b4b57607f821691505b60208210811415612b6c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612b9857612b98612c10565b6040525050565b6000600019821415612bb357612bb3612bce565b5060010190565b600082612bc957612bc9612be4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612c3f5760046000803e5060005160e01c5b90565b600060443d1015612c505790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612c8057505050505090565b8285019150815181811115612c985750505050505090565b843d8701016020828501011115612cb25750505050505090565b612cc160208286010187612b72565b509095945050505050565b8015158114610d1357600080fd5b6001600160e01b031981168114610d1357600080fdfea264697066735822122028c2d04f7f7a5d590aa5c8cb70bb19f4de4e4ad4dad8ea509f548ddd9be0d08d64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102b95760003560e01c80637ff9b59611610182578063acb695b0116100e9578063e985e9c5116100a2578063f242432a1161007c578063f242432a14610607578063f2fde38b1461061a578063f3a16caa1461062d578063f88297a41461063657600080fd5b8063e985e9c5146105ba578063eb0981f1146105f6578063edfd36cd146105ff57600080fd5b8063acb695b01461055b578063b5b2077914610564578063bd85b03914610577578063c19cec8f14610597578063cfb5bb1f146105aa578063e4892d46146105b257600080fd5b80639d58b29b1161013b5780639d58b29b146104fd5780639f68890714610506578063a0712d6814610519578063a22cb4651461052c578063a96c11941461053f578063aaa455e01461055257600080fd5b80637ff9b596146104a25780638329de2f146104ab57806387b18fe8146104be5780638da5cb5b146104d157806395d89b41146104e2578063974dbb2f146104ea57600080fd5b80632639f460116102265780634f558e79116101df5780634f558e791461042d5780635c975abb1461044f578063658d4e4f1461045c5780636a61e5fc14610474578063715018a614610487578063724b5dd71461048f57600080fd5b80632639f460146103c35780632eb2c2d6146103d657806336566f06146103e95780633688236d146103f157806346a607c2146103fa5780634e1273f41461040d57600080fd5b806311df99951161027857806311df99951461034d57806314170c721461037857806315aacce21461038b5780631eac069114610394578063236effd91461039d57806324bce765146103b057600080fd5b80629a9b7b146102be578062fdd58e146102da57806301ffc9a7146102ed57806306fdde03146103105780630e89341c14610325578063112f36a414610338575b600080fd5b6102c7600c5481565b6040519081526020015b60405180910390f35b6102c76102e8366004612533565b610649565b6103006102fb3660046126b3565b6106e0565b60405190151581526020016102d1565b610318610732565b6040516102d19190612981565b610318610333366004612736565b6107c4565b61034b61034636600461255d565b6107f8565b005b601554610360906001600160a01b031681565b6040516001600160a01b0390911681526020016102d1565b61034b610386366004612736565b610842565b6102c760135481565b6102c760095481565b61034b6103ab366004612736565b610871565b61034b6103be366004612736565b6108a0565b61034b6103d13660046126ed565b6108cf565b61034b6103e43660046123ed565b610910565b61034b6109a7565b6102c7600e5481565b61034b61040836600461239f565b6109e5565b61042061041b366004612590565b610a98565b6040516102d19190612949565b61030061043b366004612736565b600090815260036020526040902054151590565b6014546103009060ff1681565b6014546103609061010090046001600160a01b031681565b61034b610482366004612736565b610bc2565b61034b610bf1565b61034b61049d366004612736565b610c27565b6102c7600b5481565b61034b6104b9366004612736565b610c56565b6102c76104cc366004612736565b610c85565b6004546001600160a01b0316610360565b610318610ca6565b61034b6104f836600461239f565b610cb5565b6102c760115481565b61034b610514366004612661565b610d16565b61034b610527366004612736565b610d53565b61034b61053a3660046124fc565b610e78565b61034b61054d366004612736565b610e83565b6102c7600d5481565b6102c7600f5481565b61034b610572366004612736565b610eb2565b6102c7610585366004612736565b60009081526003602052604090205490565b61034b6105a5366004612736565b610ee1565b610318610f10565b61034b610f1f565b6103006105c83660046123ba565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102c7600a5481565b61034b61110a565b61034b610615366004612497565b61125a565b61034b61062836600461239f565b6112e1565b6102c760125481565b61034b610644366004612736565b611379565b60006001600160a01b0383166106ba5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061071157506001600160e01b031982166303a24d0760e21b145b8061072c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606007805461074190612b37565b80601f016020809104026020016040519081016040528092919081815260200182805461076d90612b37565b80156107ba5780601f1061078f576101008083540402835291602001916107ba565b820191906000526020600020905b81548152906001019060200180831161079d57829003601f168201915b5050505050905090565b606060066107d1836113a8565b6040516020016107e29291906127eb565b6040516020818303038152906040529050919050565b6004546001600160a01b031633146108225760405162461bcd60e51b81526004016106b190612a6b565b61083d838383604051806020016040528060008152506114ae565b505050565b6004546001600160a01b0316331461086c5760405162461bcd60e51b81526004016106b190612a6b565b601255565b6004546001600160a01b0316331461089b5760405162461bcd60e51b81526004016106b190612a6b565b600955565b6004546001600160a01b031633146108ca5760405162461bcd60e51b81526004016106b190612a6b565b601355565b6004546001600160a01b031633146108f95760405162461bcd60e51b81526004016106b190612a6b565b805161090c9060069060208401906121b4565b5050565b6001600160a01b03851633148061092c575061092c85336105c8565b6109935760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016106b1565b6109a085858585856115d1565b5050505050565b6004546001600160a01b031633146109d15760405162461bcd60e51b81526004016106b190612a6b565b6014805460ff19811660ff90911615179055565b6004546001600160a01b03163314610a0f5760405162461bcd60e51b81526004016106b190612a6b565b6001600160a01b038116610a5c5760405162461bcd60e51b8152602060048201526014602482015273043616e206e6f74206265206164647265737320360641b60448201526064016106b1565b601580546001600160a01b0319166001600160a01b0392909216918217905560148054610100600160a81b031916610100909202919091179055565b60608151835114610afd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106b1565b6000835167ffffffffffffffff811115610b1957610b19612c10565b604051908082528060200260200182016040528015610b42578160200160208202803683370190505b50905060005b8451811015610bba57610b8d858281518110610b6657610b66612bfa565b6020026020010151858381518110610b8057610b80612bfa565b6020026020010151610649565b828281518110610b9f57610b9f612bfa565b6020908102919091010152610bb381612b9f565b9050610b48565b509392505050565b6004546001600160a01b03163314610bec5760405162461bcd60e51b81526004016106b190612a6b565b600b55565b6004546001600160a01b03163314610c1b5760405162461bcd60e51b81526004016106b190612a6b565b610c2560006117bc565b565b6004546001600160a01b03163314610c515760405162461bcd60e51b81526004016106b190612a6b565b600e55565b6004546001600160a01b03163314610c805760405162461bcd60e51b81526004016106b190612a6b565b600c55565b60108181548110610c9557600080fd5b600091825260209091200154905081565b60606008805461074190612b37565b6004546001600160a01b03163314610cdf5760405162461bcd60e51b81526004016106b190612a6b565b600c8054906000610cef83612b9f565b9190505550610d1381600c54600a54604051806020016040528060008152506114ae565b50565b6004546001600160a01b03163314610d405760405162461bcd60e51b81526004016106b190612a6b565b805161090c906010906020840190612238565b60026005541415610da65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106b1565b6002600555600b54610db990829061180e565b6015546001600160a01b03166323b872dd33600b546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301526044820152606401602060405180830381600087803b158015610e1a57600080fd5b505af1158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e529190612696565b50610e703382600e54604051806020016040528060008152506114ae565b506001600555565b61090c338383611b94565b6004546001600160a01b03163314610ead5760405162461bcd60e51b81526004016106b190612a6b565b601155565b6004546001600160a01b03163314610edc5760405162461bcd60e51b81526004016106b190612a6b565b600f55565b6004546001600160a01b03163314610f0b5760405162461bcd60e51b81526004016106b190612a6b565b600d55565b60606006805461074190612b37565b60026005541415610f725760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106b1565b60026005556000805b601054811015610fd4576000610fae3360108481548110610f9e57610f9e612bfa565b9060005260206000200154610649565b1115610fc25781610fbe81612b9f565b9250505b80610fcc81612b9f565b915050610f7b565b506011548110156110435760405162461bcd60e51b815260206004820152603360248201527f596f7520646f206e6f74206f776e20656e6f7567682062617365204e46547320604482015272666f72207468697320756e6c6f636b61626c6560681b60648201526084016106b1565b61105160135460125461180e565b6015546001600160a01b03166323b872dd336012546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301526044820152606401602060405180830381600087803b1580156110b257600080fd5b505af11580156110c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ea9190612696565b50610e7033601354600e54604051806020016040528060008152506114ae565b6004546001600160a01b031633146111345760405162461bcd60e51b81526004016106b190612a6b565b6015546001600160a01b03166323b872dd306111586004546001600160a01b031690565b6015546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561119b57600080fd5b505afa1580156111af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d3919061274f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561122257600080fd5b505af1158015611236573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d139190612696565b6001600160a01b038516331480611276575061127685336105c8565b6112d45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016106b1565b6109a08585858585611c75565b6004546001600160a01b0316331461130b5760405162461bcd60e51b81526004016106b190612a6b565b6001600160a01b0381166113705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b1565b610d13816117bc565b6004546001600160a01b031633146113a35760405162461bcd60e51b81526004016106b190612a6b565b600a55565b6060816113cc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113f657806113e081612b9f565b91506113ef9050600a83612adc565b91506113d0565b60008167ffffffffffffffff81111561141157611411612c10565b6040519080825280601f01601f19166020018201604052801561143b576020820181803683370190505b5090505b84156114a657611450600183612af0565b915061145d600a86612bba565b611468906030612ac4565b60f81b81838151811061147d5761147d612bfa565b60200101906001600160f81b031916908160001a90535061149f600a86612adc565b945061143f565b949350505050565b6001600160a01b03841661150e5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016106b1565b33600061151a85611dad565b9050600061152785611dad565b905061153883600089858589611df8565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611568908490612ac4565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115c883600089898989611e06565b50505050505050565b81518351146116335760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016106b1565b6001600160a01b0384166116595760405162461bcd60e51b81526004016106b1906129dc565b33611668818787878787611df8565b60005b845181101561174e57600085828151811061168857611688612bfa565b6020026020010151905060008583815181106116a6576116a6612bfa565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156116f65760405162461bcd60e51b81526004016106b190612a21565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611733908490612ac4565b925050819055505050508061174790612b9f565b905061166b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161179e92919061295c565b60405180910390a46117b4818787878787611f71565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60145460ff16156118555760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b60448201526064016106b1565b600954600083815260036020526040902054106118a15760405162461bcd60e51b815260206004820152600a602482015269105b1b08135a5b9d195960b21b60448201526064016106b1565b600c548211156119045760405162461bcd60e51b815260206004820152602860248201527f5468697320746f6b656e20494420686173206e6f74206265656e207075626c696044820152671cda1959081e595d60c21b60648201526084016106b1565b600d5482116119555760405162461bcd60e51b815260206004820152601960248201527f5468697320746f6b656e2049442069732072657365727665640000000000000060448201526064016106b1565b600f54600e543062fdd58e336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024810187905260440160206040518083038186803b1580156119a757600080fd5b505afa1580156119bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119df919061274f565b6119e99190612ac4565b1115611a465760405162461bcd60e51b815260206004820152602660248201527f596f7520686176652068697420746865206d617820746f6b656e7320706572206044820152651dd85b1b195d60d21b60648201526084016106b1565b323314611a955760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064016106b1565b60155481906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611ae857600080fd5b505afa158015611afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b20919061274f565b101561090c5760405162461bcd60e51b815260206004820152603b60248201527f596f7520646f206e6f74206f776e20656e6f756768204d616c69627520436f6960448201527f6e7320746f206d616b652074686973207472616e73616374696f6e000000000060648201526084016106b1565b816001600160a01b0316836001600160a01b03161415611c085760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016106b1565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611c9b5760405162461bcd60e51b81526004016106b1906129dc565b336000611ca785611dad565b90506000611cb485611dad565b9050611cc4838989858589611df8565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015611d055760405162461bcd60e51b81526004016106b190612a21565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611d42908490612ac4565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611da2848a8a8a8a8a611e06565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611de757611de7612bfa565b602090810291909101015292915050565b6117b486868686868661203b565b6001600160a01b0384163b156117b45760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e4a9089908990889088908890600401612904565b602060405180830381600087803b158015611e6457600080fd5b505af1925050508015611e94575060408051601f3d908101601f19168201909252611e91918101906126d0565b60015b611f4157611ea0612c26565b806308c379a01415611eda5750611eb5612c42565b80611ec05750611edc565b8060405162461bcd60e51b81526004016106b19190612981565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016106b1565b6001600160e01b0319811663f23a6e6160e01b146115c85760405162461bcd60e51b81526004016106b190612994565b6001600160a01b0384163b156117b45760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611fb590899089908890889088906004016128a6565b602060405180830381600087803b158015611fcf57600080fd5b505af1925050508015611fff575060408051601f3d908101601f19168201909252611ffc918101906126d0565b60015b61200b57611ea0612c26565b6001600160e01b0319811663bc197c8160e01b146115c85760405162461bcd60e51b81526004016106b190612994565b6001600160a01b0385166120c25760005b83518110156120c05782818151811061206757612067612bfa565b60200260200101516003600086848151811061208557612085612bfa565b6020026020010151815260200190815260200160002060008282546120aa9190612ac4565b909155506120b9905081612b9f565b905061204c565b505b6001600160a01b0384166117b45760005b83518110156115c85760008482815181106120f0576120f0612bfa565b60200260200101519050600084838151811061210e5761210e612bfa565b60200260200101519050600060036000848152602001908152602001600020549050818110156121915760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016106b1565b600092835260036020526040909220910390556121ad81612b9f565b90506120d3565b8280546121c090612b37565b90600052602060002090601f0160209004810192826121e25760008555612228565b82601f106121fb57805160ff1916838001178555612228565b82800160010185558215612228579182015b8281111561222857825182559160200191906001019061220d565b50612234929150612272565b5090565b828054828255906000526020600020908101928215612228579160200282018281111561222857825182559160200191906001019061220d565b5b808211156122345760008155600101612273565b600067ffffffffffffffff8311156122a1576122a1612c10565b6040516122b8601f8501601f191660200182612b72565b8091508381528484840111156122cd57600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146122fc57600080fd5b919050565b600082601f83011261231257600080fd5b8135602061231f82612aa0565b60405161232c8282612b72565b8381528281019150858301600585901b8701840188101561234c57600080fd5b60005b8581101561236b5781358452928401929084019060010161234f565b5090979650505050505050565b600082601f83011261238957600080fd5b61239883833560208501612287565b9392505050565b6000602082840312156123b157600080fd5b612398826122e5565b600080604083850312156123cd57600080fd5b6123d6836122e5565b91506123e4602084016122e5565b90509250929050565b600080600080600060a0868803121561240557600080fd5b61240e866122e5565b945061241c602087016122e5565b9350604086013567ffffffffffffffff8082111561243957600080fd5b61244589838a01612301565b9450606088013591508082111561245b57600080fd5b61246789838a01612301565b9350608088013591508082111561247d57600080fd5b5061248a88828901612378565b9150509295509295909350565b600080600080600060a086880312156124af57600080fd5b6124b8866122e5565b94506124c6602087016122e5565b93506040860135925060608601359150608086013567ffffffffffffffff8111156124f057600080fd5b61248a88828901612378565b6000806040838503121561250f57600080fd5b612518836122e5565b9150602083013561252881612ccc565b809150509250929050565b6000806040838503121561254657600080fd5b61254f836122e5565b946020939093013593505050565b60008060006060848603121561257257600080fd5b61257b846122e5565b95602085013595506040909401359392505050565b600080604083850312156125a357600080fd5b823567ffffffffffffffff808211156125bb57600080fd5b818501915085601f8301126125cf57600080fd5b813560206125dc82612aa0565b6040516125e98282612b72565b8381528281019150858301600585901b870184018b101561260957600080fd5b600096505b848710156126335761261f816122e5565b83526001969096019591830191830161260e565b509650508601359250508082111561264a57600080fd5b5061265785828601612301565b9150509250929050565b60006020828403121561267357600080fd5b813567ffffffffffffffff81111561268a57600080fd5b6114a684828501612301565b6000602082840312156126a857600080fd5b815161239881612ccc565b6000602082840312156126c557600080fd5b813561239881612cda565b6000602082840312156126e257600080fd5b815161239881612cda565b6000602082840312156126ff57600080fd5b813567ffffffffffffffff81111561271657600080fd5b8201601f8101841361272757600080fd5b6114a684823560208401612287565b60006020828403121561274857600080fd5b5035919050565b60006020828403121561276157600080fd5b5051919050565b600081518084526020808501945080840160005b838110156127985781518752958201959082019060010161277c565b509495945050505050565b600081518084526127bb816020860160208601612b07565b601f01601f19169290920160200192915050565b600081516127e1818560208601612b07565b9290920192915050565b600080845481600182811c91508083168061280757607f831692505b602080841082141561282757634e487b7160e01b86526022600452602486fd5b81801561283b576001811461284c57612879565b60ff19861689528489019650612879565b60008b81526020902060005b868110156128715781548b820152908501908301612858565b505084890196505b50505050505061289d61288c82866127cf565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906128d290830186612768565b82810360608401526128e48186612768565b905082810360808401526128f881856127a3565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061293e908301846127a3565b979650505050505050565b6020815260006123986020830184612768565b60408152600061296f6040830185612768565b828103602084015261289d8185612768565b60208152600061239860208301846127a3565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115612aba57612aba612c10565b5060051b60200190565b60008219821115612ad757612ad7612bce565b500190565b600082612aeb57612aeb612be4565b500490565b600082821015612b0257612b02612bce565b500390565b60005b83811015612b22578181015183820152602001612b0a565b83811115612b31576000848401525b50505050565b600181811c90821680612b4b57607f821691505b60208210811415612b6c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612b9857612b98612c10565b6040525050565b6000600019821415612bb357612bb3612bce565b5060010190565b600082612bc957612bc9612be4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612c3f5760046000803e5060005160e01c5b90565b600060443d1015612c505790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612c8057505050505090565b8285019150815181811115612c985750505050505090565b843d8701016020828501011115612cb25750505050505090565b612cc160208286010187612b72565b509095945050505050565b8015158114610d1357600080fd5b6001600160e01b031981168114610d1357600080fdfea264697066735822122028c2d04f7f7a5d590aa5c8cb70bb19f4de4e4ad4dad8ea509f548ddd9be0d08d64736f6c63430008070033

Deployed Bytecode Sourcemap

1159:5594:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1413:29;;;;;;;;;23283:25:17;;;23271:2;23256:18;1413:29:15;;;;;;;;2185:228:2;;;;;;:::i;:::-;;:::i;1236:305::-;;;;;;:::i;:::-;;:::i;:::-;;;13191:14:17;;13184:22;13166:41;;13154:2;13139:18;1236:305:2;13026:187:17;2184:79:15;;;:::i;:::-;;;;;;;:::i;6571:176::-;;;;;;:::i;:::-;;:::i;4058:136::-;;;;;;:::i;:::-;;:::i;:::-;;1750:23;;;;;-1:-1:-1;;;;;1750:23:15;;;;;;-1:-1:-1;;;;;10191:32:17;;;10173:51;;10161:2;10146:18;1750:23:15;10027:203:17;5466:100:15;;;;;;:::i;:::-;;:::i;1652:34::-;;;;;;1319:23;;;;;;4592:82;;;;;;:::i;:::-;;:::i;5572:102::-;;;;;;:::i;:::-;;:::i;4356:124::-;;;;;;:::i;:::-;;:::i;4060:430:2:-;;;;;;:::i;:::-;;:::i;5680:74:15:-;;;:::i;1484:25::-;;;;;;5760:207;;;;;;:::i;:::-;;:::i;2570:508:2:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;901:120:5:-;;;;;;:::i;:::-;958:4;785:16;;;:12;:16;;;;;;-1:-1:-1;;;901:120:5;1692:18:15;;;;;;;;;1716:27;;;;;;;;-1:-1:-1;;;;;1716:27:15;;;4778:90;;;;;;:::i;:::-;;:::i;1668:101:0:-;;;:::i;5072:86:15:-;;;;;;:::i;:::-;;:::i;1382:25::-;;;;;;4974:92;;;;;;:::i;:::-;;:::i;1548:28::-;;;;;;:::i;:::-;;:::i;1036:85:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;1036:85;;2269:83:15;;;:::i;4200:150::-;;;;;;:::i;:::-;;:::i;1582:28::-;;;;;;5260:102;;;;;;:::i;:::-;;:::i;2358:238::-;;;;;;:::i;:::-;;:::i;3146:153:2:-;;;;;;:::i;:::-;;:::i;5368:92:15:-;;;;;;:::i;:::-;;:::i;1448:30::-;;;;;;1515:27;;;;;;5164:90;;;;;;:::i;:::-;;:::i;697:111:5:-;;;;;;:::i;:::-;759:7;785:16;;;:12;:16;;;;;;;697:111;4874:94:15;;;;;;:::i;:::-;;:::i;4486:100::-;;;:::i;2602:586::-;;;:::i;3366:166:2:-;;;;;;:::i;:::-;-1:-1:-1;;;;;3488:27:2;;;3465:4;3488:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3366:166;1348:28:15;;;;;;5973:130;;;:::i;3599:389:2:-;;;;;;:::i;:::-;;:::i;1918:198:0:-;;;;;;:::i;:::-;;:::i;1616:30:15:-;;;;;;4680:92;;;;;;:::i;:::-;;:::i;2185:228:2:-;2271:7;-1:-1:-1;;;;;2298:21:2;;2290:77;;;;-1:-1:-1;;;2290:77:2;;15539:2:17;2290:77:2;;;15521:21:17;15578:2;15558:18;;;15551:30;15617:34;15597:18;;;15590:62;-1:-1:-1;;;15668:18:17;;;15661:41;15719: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:13;;;1498:36:2;1354:180;1236:305;-1:-1:-1;;1236:305:2:o;2184:79:15:-;2221:13;2251:5;2244:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2184:79;:::o;6571:176::-;6632:13;6688;6703:26;6720:8;6703:16;:26::i;:::-;6671:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6657:83;;6571:176;;;:::o;4058:136::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4157:30:15::1;4163:7;4172:2;4176:6;4157:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;4058:136:::0;;;:::o;5466:100::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5536:15:15::1;:23:::0;5466:100::o;4592:82::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4653:8:15::1;:14:::0;4592:82::o;5572:102::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5643:19:15::1;:24:::0;5572:102::o;4356:124::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4441:32:15;;::::1;::::0;:13:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;4356:124:::0;:::o;4060:430:2:-;-1:-1:-1;;;;;4285:20:2;;719:10:11;4285:20:2;;:60;;-1:-1:-1;4309:36:2;4326:4;719:10:11;3366:166:2;:::i;4309:36::-;4264:157;;;;-1:-1:-1;;;4264:157:2;;18236:2:17;4264:157:2;;;18218:21:17;18275:2;18255:18;;;18248:30;18314:34;18294:18;;;18287:62;-1:-1:-1;;;18365:18:17;;;18358:48;18423:19;;4264:157:2;18034:414:17;4264:157:2;4431:52;4454:4;4460:2;4464:3;4469:7;4478:4;4431:22;:52::i;:::-;4060:430;;;;;:::o;5680:74:15:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5741:6:15::1;::::0;;-1:-1:-1;;5731:16:15;::::1;5741:6;::::0;;::::1;5740:7;5731:16;::::0;;5680:74::o;5760:207::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5839:23:15;::::1;5831:56;;;::::0;-1:-1:-1;;;5831:56:15;;16712:2:17;5831:56:15::1;::::0;::::1;16694:21:17::0;16751:2;16731:18;;;16724:30;-1:-1:-1;;;16770:18:17;;;16763:50;16830:18;;5831:56:15::1;16510:344:17::0;5831:56:15::1;5897:4;:29:::0;;-1:-1:-1;;;;;;5897:29:15::1;-1:-1:-1::0;;;;;5897:29:15;;;::::1;::::0;;::::1;::::0;;5936:12:::1;:24:::0;;-1:-1:-1;;;;;;5936:24:15::1;5897:29;5936:24:::0;;::::1;::::0;;;::::1;::::0;;5760:207::o;2570:508:2:-;2721:16;2780:3;:10;2761:8;:15;:29;2753:83;;;;-1:-1:-1;;;2753:83:2;;21338:2:17;2753:83:2;;;21320:21:17;21377:2;21357:18;;;21350:30;21416:34;21396:18;;;21389:62;-1:-1:-1;;;21467:18:17;;;21460:39;21516:19;;2753:83:2;21136:405:17;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;4778:90:15:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4843:10:15::1;:18:::0;4778:90::o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:11;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;5072:86:15:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5135:10:15::1;:16:::0;5072:86::o;4974:92::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5040:14:15::1;:19:::0;4974:92::o;1548:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1548:28:15;:::o;2269:83::-;2308:13;2338:7;2331:14;;;;;:::i;4200:150::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4268:14:15::1;:16:::0;;;:14:::1;:16;::::0;::::1;:::i;:::-;;;;;;4294:49;4300:7;4309:14;;4325:13;;4294:49;;;;;;;;;;;::::0;:5:::1;:49::i;:::-;4200:150:::0;:::o;5260:102::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5334:21:15;;::::1;::::0;:14:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;2358:238::-:0;1744:1:1;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:1;;22979:2:17;2317:63:1;;;22961:21:17;23018:2;22998:18;;;22991:30;23057:33;23037:18;;;23030:61;23108:18;;2317:63:1;22777:355:17;2317:63:1;1744:1;2455:7;:18;2460:10:15::1;::::0;2434:37:::1;::::0;2456:2;;2434:21:::1;:37::i;:::-;2482:4;::::0;-1:-1:-1;;;;;2482:4:15::1;:17;719:10:11::0;2529::15::1;::::0;2482:58:::1;::::0;-1:-1:-1;;;;;;2482:58:15::1;::::0;;;;;;-1:-1:-1;;;;;11324:15:17;;;2482:58:15::1;::::0;::::1;11306:34:17::0;2522:4:15::1;11356:18:17::0;;;11349:43;11408:18;;;11401:34;11241:18;;2482:58:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;2550:39:15::1;719:10:11::0;2570:2:15::1;2574:10;;2550:39;;;;;;;;;;;::::0;:5:::1;:39::i;:::-;-1:-1:-1::0;1701:1:1;2628:7;:22;2358:238:15:o;3146:153:2:-;3240:52;719:10:11;3273:8:2;3283;3240:18;:52::i;5368:92:15:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5434:13:15::1;:19:::0;5368:92::o;5164:90::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;5229:12:15::1;:18:::0;5164:90::o;4874:94::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4941:15:15::1;:20:::0;4874:94::o;4486:100::-;4534:13;4566;4559:20;;;;;:::i;2602:586::-;1744:1:1;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:1;;22979:2:17;2317:63:1;;;22961:21:17;23018:2;22998:18;;;22991:30;23057:33;23037:18;;;23030:61;23108:18;;2317:63:1;22777:355:17;2317:63:1;1744:1;2455:7;:18;2681:15:15::1;::::0;2711:162:::1;2731:14;:21:::0;2727:25;::::1;2711:162;;;2819:1;2774:42;719:10:11::0;2798:14:15::1;2813:1;2798:17;;;;;;;;:::i;:::-;;;;;;;;;2774:9;:42::i;:::-;:46;2771:92;;;2840:9:::0;::::1;::::0;::::1;:::i;:::-;;;;2771:92;2754:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2711:162;;;;2902:13;;2891:7;:24;;2883:88;;;::::0;-1:-1:-1;;;2883:88:15;;21748:2:17;2883:88:15::1;::::0;::::1;21730:21:17::0;21787:2;21767:18;;;21760:30;21826:34;21806:18;;;21799:62;-1:-1:-1;;;21877:18:17;;;21870:49;21936:19;;2883:88:15::1;21546:415:17::0;2883:88:15::1;2982:59;3004:19;;3025:15;;2982:21;:59::i;:::-;3052:4;::::0;-1:-1:-1;;;;;3052:4:15::1;:17;719:10:11::0;3099:15:15::1;::::0;3052:63:::1;::::0;-1:-1:-1;;;;;;3052:63:15::1;::::0;;;;;;-1:-1:-1;;;;;11324:15:17;;;3052:63:15::1;::::0;::::1;11306:34:17::0;3092:4:15::1;11356:18:17::0;;;11349:43;11408:18;;;11401:34;11241:18;;3052:63:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;3125:56:15::1;719:10:11::0;3145:19:15::1;;3166:10;;3125:56;;;;;;;;;;;::::0;:5:::1;:56::i;5973:130::-:0;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;6024:4:15::1;::::0;-1:-1:-1;;;;;6024:4:15::1;:17;6050:4;6057:7;1108:6:0::0;;-1:-1:-1;;;;;1108:6:0;;1036:85;6057:7:15::1;6066:4;::::0;:29:::1;::::0;-1:-1:-1;;;6066:29:15;;6089:4:::1;6066:29;::::0;::::1;10173:51:17::0;-1:-1:-1;;;;;6066:4:15;;::::1;::::0;:14:::1;::::0;10146:18:17;;6066:29:15::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6024:72;::::0;-1:-1:-1;;;;;;6024:72:15::1;::::0;;;;;;-1:-1:-1;;;;;11324:15:17;;;6024:72:15::1;::::0;::::1;11306:34:17::0;11376:15;;;;11356:18;;;11349:43;11408:18;;;11401:34;11241:18;;6024:72:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3599:389:2:-:0;-1:-1:-1;;;;;3799:20:2;;719:10:11;3799:20:2;;:60;;-1:-1:-1;3823:36:2;3840:4;719:10:11;3366:166:2;:::i;3823:36::-;3778:148;;;;-1:-1:-1;;;3778:148:2;;17061:2:17;3778:148:2;;;17043:21:17;17100:2;17080:18;;;17073:30;17139:34;17119:18;;;17112:62;-1:-1:-1;;;17190:18:17;;;17183:39;17239:19;;3778:148:2;16859:405:17;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:11;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;;16305:2:17;1998:73:0::1;::::0;::::1;16287:21:17::0;16344:2;16324:18;;;16317:30;16383:34;16363:18;;;16356:62;-1:-1:-1;;;16434:18:17;;;16427:36;16480:19;;1998:73:0::1;16103:402:17::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;4680:92:15:-:0;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:11;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4746:13:15::1;:19:::0;4680:92::o;328:703:12:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:12;;;;;;;;;;;;-1:-1:-1;;;627:10:12;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:12;;-1:-1:-1;773:2:12;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:12;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:12;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:12;;;;;;;;-1:-1:-1;972:11:12;981:2;972:11;;:::i;:::-;;;844:150;;;1017:6;328:703;-1:-1:-1;;;;328:703:12:o;8630:709:2:-;-1:-1:-1;;;;;8777:16:2;;8769:62;;;;-1:-1:-1;;;8769:62:2;;22577:2:17;8769:62:2;;;22559:21:17;22616:2;22596:18;;;22589:30;22655:34;22635:18;;;22628:62;-1:-1:-1;;;22706:18:17;;;22699:31;22747:19;;8769:62:2;22375:397:17;8769:62:2;719:10:11;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;;;23493:25:17;;;23549:2;23534:18;;23527:34;;;-1:-1:-1;;;;;9119:52:2;;;;9152:1;;9119:52;;;;;;23466:18:17;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;;22168:2:17;6431:81:2;;;22150:21:17;22207:2;22187:18;;;22180:30;22246:34;22226:18;;;22219:62;-1:-1:-1;;;22297:18:17;;;22290:38;22345:19;;6431:81:2;21966:404:17;6431:81:2;-1:-1:-1;;;;;6530:16:2;;6522:66;;;;-1:-1:-1;;;6522:66:2;;;;;;;:::i;:::-;719:10:11;6641:60:2;719:10:11;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;3194:664:15:-;3283:6;;;;:15;3275:45;;;;-1:-1:-1;;;3275:45:15;;20582:2:17;3275:45:15;;;20564:21:17;20621:2;20601:18;;;20594:30;-1:-1:-1;;;20640:18:17;;;20633:47;20697:18;;3275:45:15;20380:341:17;3275:45:15;3356:8;;759:7:5;785:16;;;:12;:16;;;;;;3338:26:15;3330:49;;;;-1:-1:-1;;;3330:49:15;;19066:2:17;3330:49:15;;;19048:21:17;19105:2;19085:18;;;19078:30;-1:-1:-1;;;19124:18:17;;;19117:40;19174:18;;3330:49:15;18864:334:17;3330:49:15;3403:14;;3397:2;:20;;3389:74;;;;-1:-1:-1;;;3389:74:15;;15130:2:17;3389:74:15;;;15112:21:17;15169:2;15149:18;;;15142:30;15208:34;15188:18;;;15181:62;-1:-1:-1;;;15259:18:17;;;15252:38;15307:19;;3389:74:15;14928:404:17;3389:74:15;3486:15;;3481:2;:20;3473:59;;;;-1:-1:-1;;;3473:59:15;;15951:2:17;3473:59:15;;;15933:21:17;15990:2;15970:18;;;15963:30;16029:27;16009:18;;;16002:55;16074:18;;3473:59:15;15749:349:17;3473:59:15;3599:12;;3585:10;;3550:4;:14;719:10:11;3550:32:15;;-1:-1:-1;;;;;;3550:32:15;;;;;;;-1:-1:-1;;;;;12203:32:17;;;3550::15;;;12185:51:17;12252:18;;;12245:34;;;12158:18;;3550:32:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;;:::i;:::-;:61;;3542:112;;;;-1:-1:-1;;;3542:112:15;;19766:2:17;3542:112:15;;;19748:21:17;19805:2;19785:18;;;19778:30;19844:34;19824:18;;;19817:62;-1:-1:-1;;;19895:18:17;;;19888:36;19941:19;;3542:112:15;19564:402:17;3542:112:15;3672:9;719:10:11;3672:25:15;3664:68;;;;-1:-1:-1;;;3664:68:15;;17471:2:17;3664:68:15;;;17453:21:17;17510:2;17490:18;;;17483:30;17549:32;17529:18;;;17522:60;17599:18;;3664:68:15;17269:354:17;3664:68:15;3750:4;;3782:5;;-1:-1:-1;;;;;3750:4:15;:14;719:10:11;3750:28:15;;-1:-1:-1;;;;;;3750:28:15;;;;;;;-1:-1:-1;;;;;10191:32:17;;;3750:28:15;;;10173:51:17;10146:18;;3750:28:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;3742:109;;;;-1:-1:-1;;;3742:109:15;;14702:2:17;3742:109:15;;;14684:21:17;14741:2;14721:18;;;14714:30;14780:34;14760:18;;;14753:62;14851:29;14831:18;;;14824:57;14898:19;;3742:109:15;14500:423:17;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;;20928:2:17;12906:71:2;;;20910:21:17;20967:2;20947:18;;;20940:30;21006:34;20986:18;;;20979:62;-1:-1:-1;;;21057:18:17;;;21050:39;21106:19;;12906:71:2;20726:405:17;12906:71:2;-1:-1:-1;;;;;12987:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12987:46:2;;;;;;;;;;13048:41;;13166::17;;;13048::2;;13139:18:17;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:11;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;;;23493:25:17;;;23549:2;23534:18;;23527:34;;;-1:-1:-1;;;;;5685:46:2;;;;;;;;;;;;;;23466:18:17;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;6308:257:15:-;6492:66;6519:8;6529:4;6535:2;6539:3;6544:7;6553:4;6492:26;:66::i;15396:725:2:-;-1:-1:-1;;;;;15603:13:2;;1465:19:10;: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;;13872:2:17;16028:62:2;;;13854:21:17;13911:2;13891:18;;;13884:30;13950:34;13930:18;;;13923:62;-1:-1:-1;;;14001:18:17;;;13994:50;14061:19;;16028:62:2;13670:416:17;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:10;: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;;20173:2:17;1793:69:5;;;20155:21:17;20212:2;20192:18;;;20185:30;20251:34;20231:18;;;20224:62;-1:-1:-1;;;20302:18:17;;;20295:38;20350:19;;1793:69:5;19971:404:17;1793:69:5;1912:16;;;;:12;:16;;;;;;1931:15;;1912:34;;1637:3;;;:::i;:::-;;;1601:378;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:468:17;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:17;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:17;;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:17;;;1144:1;1140:10;;;1128:23;;1124:32;;1121:41;-1:-1:-1;1118:61:17;;;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:17;;665:735;-1:-1:-1;;;;;;;665:735:17: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:17: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:315::-;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;3902:28;3924:5;3902:28;:::i;:::-;3949:5;3939:15;;;3645:315;;;;;:::o;3965:254::-;4033:6;4041;4094:2;4082:9;4073:7;4069:23;4065:32;4062:52;;;4110:1;4107;4100:12;4062:52;4133:29;4152:9;4133:29;:::i;:::-;4123:39;4209:2;4194:18;;;;4181:32;;-1:-1:-1;;;3965:254:17:o;4224:322::-;4301:6;4309;4317;4370:2;4358:9;4349:7;4345:23;4341:32;4338:52;;;4386:1;4383;4376:12;4338:52;4409:29;4428:9;4409:29;:::i;:::-;4399:39;4485:2;4470:18;;4457:32;;-1:-1:-1;4536:2:17;4521:18;;;4508:32;;4224:322;-1:-1:-1;;;4224:322:17:o;4551:1219::-;4669:6;4677;4730:2;4718:9;4709:7;4705:23;4701:32;4698:52;;;4746:1;4743;4736:12;4698:52;4786:9;4773:23;4815:18;4856:2;4848:6;4845:14;4842:34;;;4872:1;4869;4862:12;4842:34;4910:6;4899:9;4895:22;4885:32;;4955:7;4948:4;4944:2;4940:13;4936:27;4926:55;;4977:1;4974;4967:12;4926:55;5013:2;5000:16;5035:4;5058:43;5098:2;5058:43;:::i;:::-;5130:2;5124:9;5142:31;5170:2;5162:6;5142:31;:::i;:::-;5208:18;;;5242:15;;;;-1:-1:-1;5277:11:17;;;5319:1;5315:10;;;5307:19;;5303:28;;5300:41;-1:-1:-1;5297:61:17;;;5354:1;5351;5344:12;5297:61;5376:1;5367:10;;5386:169;5400:2;5397:1;5394:9;5386:169;;;5457:23;5476:3;5457:23;:::i;:::-;5445:36;;5418:1;5411:9;;;;;5501:12;;;;5533;;5386:169;;;-1:-1:-1;5574:6:17;-1:-1:-1;;5618:18:17;;5605:32;;-1:-1:-1;;5649:16:17;;;5646:36;;;5678:1;5675;5668:12;5646:36;;5701:63;5756:7;5745:8;5734:9;5730:24;5701:63;:::i;:::-;5691:73;;;4551:1219;;;;;:::o;5775:348::-;5859:6;5912:2;5900:9;5891:7;5887:23;5883:32;5880:52;;;5928:1;5925;5918:12;5880:52;5968:9;5955:23;6001:18;5993:6;5990:30;5987:50;;;6033:1;6030;6023:12;5987:50;6056:61;6109:7;6100:6;6089:9;6085:22;6056:61;:::i;6128:245::-;6195:6;6248:2;6236:9;6227:7;6223:23;6219:32;6216:52;;;6264:1;6261;6254:12;6216:52;6296:9;6290:16;6315:28;6337:5;6315:28;:::i;6378:245::-;6436:6;6489:2;6477:9;6468:7;6464:23;6460:32;6457:52;;;6505:1;6502;6495:12;6457:52;6544:9;6531:23;6563:30;6587:5;6563:30;:::i;6628:249::-;6697:6;6750:2;6738:9;6729:7;6725:23;6721:32;6718:52;;;6766:1;6763;6756:12;6718:52;6798:9;6792:16;6817:30;6841:5;6817:30;:::i;6882:450::-;6951:6;7004:2;6992:9;6983:7;6979:23;6975:32;6972:52;;;7020:1;7017;7010:12;6972:52;7060:9;7047:23;7093:18;7085:6;7082:30;7079:50;;;7125:1;7122;7115:12;7079:50;7148:22;;7201:4;7193:13;;7189:27;-1:-1:-1;7179:55:17;;7230:1;7227;7220:12;7179:55;7253:73;7318:7;7313:2;7300:16;7295:2;7291;7287:11;7253:73;:::i;7337:180::-;7396:6;7449:2;7437:9;7428:7;7424:23;7420:32;7417:52;;;7465:1;7462;7455:12;7417:52;-1:-1:-1;7488:23:17;;7337:180;-1:-1:-1;7337:180:17:o;7522:184::-;7592:6;7645:2;7633:9;7624:7;7620:23;7616:32;7613:52;;;7661:1;7658;7651:12;7613:52;-1:-1:-1;7684:16:17;;7522:184;-1:-1:-1;7522:184:17:o;7711:435::-;7764:3;7802:5;7796:12;7829:6;7824:3;7817:19;7855:4;7884:2;7879:3;7875:12;7868:19;;7921:2;7914:5;7910:14;7942:1;7952:169;7966:6;7963:1;7960:13;7952:169;;;8027:13;;8015:26;;8061:12;;;;8096:15;;;;7988:1;7981:9;7952:169;;;-1:-1:-1;8137:3:17;;7711:435;-1:-1:-1;;;;;7711:435:17:o;8151:257::-;8192:3;8230:5;8224:12;8257:6;8252:3;8245:19;8273:63;8329:6;8322:4;8317:3;8313:14;8306:4;8299:5;8295:16;8273:63;:::i;:::-;8390:2;8369:15;-1:-1:-1;;8365:29:17;8356:39;;;;8397:4;8352:50;;8151:257;-1:-1:-1;;8151:257:17:o;8413:185::-;8455:3;8493:5;8487:12;8508:52;8553:6;8548:3;8541:4;8534:5;8530:16;8508:52;:::i;:::-;8576:16;;;;;8413:185;-1:-1:-1;;8413:185:17:o;8721:1301::-;8998:3;9027:1;9060:6;9054:13;9090:3;9112:1;9140:9;9136:2;9132:18;9122:28;;9200:2;9189:9;9185:18;9222;9212:61;;9266:4;9258:6;9254:17;9244:27;;9212:61;9292:2;9340;9332:6;9329:14;9309:18;9306:38;9303:165;;;-1:-1:-1;;;9367:33:17;;9423:4;9420:1;9413:15;9453:4;9374:3;9441:17;9303:165;9484:18;9511:104;;;;9629:1;9624:320;;;;9477:467;;9511:104;-1:-1:-1;;9544:24:17;;9532:37;;9589:16;;;;-1:-1:-1;9511:104:17;;9624:320;23833:1;23826:14;;;23870:4;23857:18;;9719:1;9733:165;9747:6;9744:1;9741:13;9733:165;;;9825:14;;9812:11;;;9805:35;9868:16;;;;9762:10;;9733:165;;;9737:3;;9927:6;9922:3;9918:16;9911:23;;9477:467;;;;;;;9960:56;9985:30;10011:3;10003:6;9985:30;:::i;:::-;-1:-1:-1;;;8663:20:17;;8708:1;8699:11;;8603:113;9960:56;9953:63;8721:1301;-1:-1:-1;;;;;8721:1301:17:o;10235:826::-;-1:-1:-1;;;;;10632:15:17;;;10614:34;;10684:15;;10679:2;10664:18;;10657:43;10594:3;10731:2;10716:18;;10709:31;;;10557:4;;10763:57;;10800:19;;10792:6;10763:57;:::i;:::-;10868:9;10860:6;10856:22;10851:2;10840:9;10836:18;10829:50;10902:44;10939:6;10931;10902:44;:::i;:::-;10888:58;;10995:9;10987:6;10983:22;10977:3;10966:9;10962:19;10955:51;11023:32;11048:6;11040;11023:32;:::i;:::-;11015:40;10235:826;-1:-1:-1;;;;;;;;10235:826:17:o;11446:560::-;-1:-1:-1;;;;;11743:15:17;;;11725:34;;11795:15;;11790:2;11775:18;;11768:43;11842:2;11827:18;;11820:34;;;11885:2;11870:18;;11863:34;;;11705:3;11928;11913:19;;11906:32;;;11668:4;;11955:45;;11980:19;;11972:6;11955:45;:::i;:::-;11947:53;11446:560;-1:-1:-1;;;;;;;11446:560:17:o;12290:261::-;12469:2;12458:9;12451:21;12432:4;12489:56;12541:2;12530:9;12526:18;12518:6;12489:56;:::i;12556:465::-;12813:2;12802:9;12795:21;12776:4;12839:56;12891:2;12880:9;12876:18;12868:6;12839:56;:::i;:::-;12943:9;12935:6;12931:22;12926:2;12915:9;12911:18;12904:50;12971:44;13008:6;13000;12971:44;:::i;13446:219::-;13595:2;13584:9;13577:21;13558:4;13615:44;13655:2;13644:9;13640:18;13632:6;13615:44;:::i;14091:404::-;14293:2;14275:21;;;14332:2;14312:18;;;14305:30;14371:34;14366:2;14351:18;;14344:62;-1:-1:-1;;;14437:2:17;14422:18;;14415:38;14485:3;14470:19;;14091:404::o;17628:401::-;17830:2;17812:21;;;17869:2;17849:18;;;17842:30;17908:34;17903:2;17888:18;;17881:62;-1:-1:-1;;;17974:2:17;17959:18;;17952:35;18019:3;18004:19;;17628:401::o;18453:406::-;18655:2;18637:21;;;18694:2;18674:18;;;18667:30;18733:34;18728:2;18713:18;;18706:62;-1:-1:-1;;;18799:2:17;18784:18;;18777:40;18849:3;18834:19;;18453:406::o;19203:356::-;19405:2;19387:21;;;19424:18;;;19417:30;19483:34;19478:2;19463:18;;19456:62;19550:2;19535:18;;19203:356::o;23572:183::-;23632:4;23665:18;23657:6;23654:30;23651:56;;;23687:18;;:::i;:::-;-1:-1:-1;23732:1:17;23728:14;23744:4;23724:25;;23572:183::o;23886:128::-;23926:3;23957:1;23953:6;23950:1;23947:13;23944:39;;;23963:18;;:::i;:::-;-1:-1:-1;23999:9:17;;23886:128::o;24019:120::-;24059:1;24085;24075:35;;24090:18;;:::i;:::-;-1:-1:-1;24124:9:17;;24019:120::o;24144:125::-;24184:4;24212:1;24209;24206:8;24203:34;;;24217:18;;:::i;:::-;-1:-1:-1;24254:9:17;;24144:125::o;24274:258::-;24346:1;24356:113;24370:6;24367:1;24364:13;24356:113;;;24446:11;;;24440:18;24427:11;;;24420:39;24392:2;24385:10;24356:113;;;24487:6;24484:1;24481:13;24478:48;;;24522:1;24513:6;24508:3;24504:16;24497:27;24478:48;;24274:258;;;:::o;24537:380::-;24616:1;24612:12;;;;24659;;;24680:61;;24734:4;24726:6;24722:17;24712:27;;24680:61;24787:2;24779:6;24776:14;24756:18;24753:38;24750:161;;;24833:10;24828:3;24824:20;24821:1;24814:31;24868:4;24865:1;24858:15;24896:4;24893:1;24886:15;24750:161;;24537:380;;;:::o;24922:249::-;25032:2;25013:13;;-1:-1:-1;;25009:27:17;24997:40;;25067:18;25052:34;;25088:22;;;25049:62;25046:88;;;25114:18;;:::i;:::-;25150:2;25143:22;-1:-1:-1;;24922:249:17:o;25176:135::-;25215:3;-1:-1:-1;;25236:17:17;;25233:43;;;25256:18;;:::i;:::-;-1:-1:-1;25303:1:17;25292:13;;25176:135::o;25316:112::-;25348:1;25374;25364:35;;25379:18;;:::i;:::-;-1:-1:-1;25413:9:17;;25316:112::o;25433:127::-;25494:10;25489:3;25485:20;25482:1;25475:31;25525:4;25522:1;25515:15;25549:4;25546:1;25539:15;25565:127;25626:10;25621:3;25617:20;25614:1;25607:31;25657:4;25654:1;25647:15;25681:4;25678:1;25671:15;25697:127;25758:10;25753:3;25749:20;25746:1;25739:31;25789:4;25786:1;25779:15;25813:4;25810:1;25803:15;25829:127;25890:10;25885:3;25881:20;25878:1;25871:31;25921:4;25918:1;25911:15;25945:4;25942:1;25935:15;25961:179;25996:3;26038:1;26020:16;26017:23;26014:120;;;26084:1;26081;26078;26063:23;-1:-1:-1;26121:1:17;26115:8;26110:3;26106:18;26014:120;25961:179;:::o;26145:671::-;26184:3;26226:4;26208:16;26205:26;26202:39;;;26145:671;:::o;26202:39::-;26268:2;26262:9;-1:-1:-1;;26333:16:17;26329:25;;26326:1;26262:9;26305:50;26384:4;26378:11;26408:16;26443:18;26514:2;26507:4;26499:6;26495:17;26492:25;26487:2;26479:6;26476:14;26473:45;26470:58;;;26521:5;;;;;26145:671;:::o;26470:58::-;26558:6;26552:4;26548:17;26537:28;;26594:3;26588:10;26621:2;26613:6;26610:14;26607:27;;;26627:5;;;;;;26145:671;:::o;26607:27::-;26711:2;26692:16;26686:4;26682:27;26678:36;26671:4;26662:6;26657:3;26653:16;26649:27;26646:69;26643:82;;;26718:5;;;;;;26145:671;:::o;26643:82::-;26734:57;26785:4;26776:6;26768;26764:19;26760:30;26754:4;26734:57;:::i;:::-;-1:-1:-1;26807:3:17;;26145:671;-1:-1:-1;;;;;26145:671:17:o;26821:118::-;26907:5;26900:13;26893:21;26886:5;26883:32;26873:60;;26929:1;26926;26919:12;26944:131;-1:-1:-1;;;;;;27018:32:17;;27008:43;;26998:71;;27065:1;27062;27055:12

Swarm Source

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