ETH Price: $3,895.81 (+0.29%)

Token

Metaverse License Plate (MLPN)
 

Overview

Max Total Supply

2,106 MLPN

Holders

909

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 MLPN
0x2b3ce5158912cc45e95b9c70d0ab5c74653a4bce
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:
PlateNft

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 13 : plate-nft.sol
// SPDX-License-Identifier: MIT

/*
0123456789
*/

pragma solidity ^0.8.0;

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

contract PlateNft is ERC721, ERC721Enumerable, Ownable {
    string public PROVENANCE;
    bool public saleIsActive = false;
    string private _baseURIextended;
    bool public isAllowListActive = false;
    uint256 public maxSupply = 1000;
    uint256 public constant MAX_PUBLIC_MINT = 2;

    mapping(address => uint8) private _allowList;

    constructor() ERC721("Metaverse License Plate", "MLPN") {
    }

    function setMaxSupply(uint256 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }

    function setIsAllowListActive(bool _isAllowListActive) external onlyOwner {
        isAllowListActive = _isAllowListActive;
    }

    function setAllowList(address[] calldata addresses, uint8 numAllowedToMint) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            _allowList[addresses[i]] = numAllowedToMint;
        }
    }

    function numAvailableToMint(address addr) external view returns (uint8) {
        return _allowList[addr];
    }

    function mintAllowList(uint8 numberOfTokens) external payable {
        uint256 ts = totalSupply();
        require(isAllowListActive, "Allow list is not active");
        require(numberOfTokens <= _allowList[msg.sender], "Exceeded max available to purchase");
        require(ts + numberOfTokens <= maxSupply, "Purchase would exceed max tokens");

        _allowList[msg.sender] -= numberOfTokens;
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

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

    function setProvenance(string memory provenance) public onlyOwner {
        PROVENANCE = provenance;
    }

    function reserve(uint256 n) public onlyOwner {
      uint supply = totalSupply();
      uint i;
      for (i = 0; i < n; i++) {
          _safeMint(msg.sender, supply + i);
      }
    }

    function setSaleState(bool newState) public onlyOwner {
        saleIsActive = newState;
    }

    function mint(uint numberOfTokens) public payable {
        uint256 ts = totalSupply();
        require(saleIsActive, "Sale must be active to mint tokens");
        require(numberOfTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase");
        require(ts + numberOfTokens <= maxSupply, "Purchase would exceed max tokens");

        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }
}

File 2 of 13 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev 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, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @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.
     * - `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 tokenId
    ) internal virtual {}
}

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 7 of 13 : 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 8 of 13 : 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 9 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 13 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 11 of 13 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

Settings
{
  "optimizer": {
    "enabled": false,
    "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":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numAvailableToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506000600e60006101000a81548160ff0219169083151502179055506103e8600f553480156200004d57600080fd5b506040518060400160405280601781526020017f4d6574617665727365204c6963656e736520506c6174650000000000000000008152506040518060400160405280600481526020017f4d4c504e000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d2929190620001e2565b508060019080519060200190620000eb929190620001e2565b5050506200010e620001026200011460201b60201c565b6200011c60201b60201c565b620002f7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f09062000292565b90600052602060002090601f01602090048101928262000214576000855562000260565b82601f106200022f57805160ff191683800117855562000260565b8280016001018555821562000260579182015b828111156200025f57825182559160200191906001019062000242565b5b5090506200026f919062000273565b5090565b5b808211156200028e57600081600090555060010162000274565b5090565b60006002820490506001821680620002ab57607f821691505b60208210811415620002c257620002c1620002c8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61464780620003076000396000f3fe6080604052600436106101f95760003560e01c8063718bc4af1161010d578063c04a2836116100a0578063ddff5b1c1161006f578063ddff5b1c14610734578063e985e9c514610750578063eb8d24441461078d578063f2fde38b146107b8578063ffe630b5146107e1576101f9565b8063c04a283614610666578063c4e37095146106a3578063c87b56dd146106cc578063d5abeb0114610709576101f9565b806395d89b41116100dc57806395d89b41146105cd578063a0712d68146105f8578063a22cb46514610614578063b88d4fde1461063d576101f9565b8063718bc4af14610527578063819b25ba146105505780638295784d146105795780638da5cb5b146105a2576101f9565b806342842e0e116101905780636373a6b11161015f5780636373a6b11461045457806365f130971461047f5780636f8b44b0146104aa57806370a08231146104d3578063715018a614610510576101f9565b806342842e0e146103885780634f6ccce7146103b157806355f804b3146103ee5780636352211e14610417576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f757806329fc6bae146103205780632f745c591461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906132a2565b61080a565b6040516102329190613816565b60405180910390f35b34801561024757600080fd5b5061025061081c565b60405161025d9190613831565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613335565b6108ae565b60405161029a91906137af565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906131e5565b610933565b005b3480156102d857600080fd5b506102e1610a4b565b6040516102ee9190613b33565b60405180910390f35b34801561030357600080fd5b5061031e600480360381019061031991906130df565b610a58565b005b34801561032c57600080fd5b50610335610ab8565b6040516103429190613816565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906131e5565b610acb565b60405161037f9190613b33565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa91906130df565b610b70565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190613335565b610b90565b6040516103e59190613b33565b60405180910390f35b3480156103fa57600080fd5b50610415600480360381019061041091906132f4565b610c27565b005b34801561042357600080fd5b5061043e60048036038101906104399190613335565b610cbd565b60405161044b91906137af565b60405180910390f35b34801561046057600080fd5b50610469610d6f565b6040516104769190613831565b60405180910390f35b34801561048b57600080fd5b50610494610dfd565b6040516104a19190613b33565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613335565b610e02565b005b3480156104df57600080fd5b506104fa60048036038101906104f5919061307a565b610e88565b6040516105079190613b33565b60405180910390f35b34801561051c57600080fd5b50610525610f40565b005b34801561053357600080fd5b5061054e60048036038101906105499190613279565b610fc8565b005b34801561055c57600080fd5b5061057760048036038101906105729190613335565b611061565b005b34801561058557600080fd5b506105a0600480360381019061059b9190613221565b611121565b005b3480156105ae57600080fd5b506105b7611269565b6040516105c491906137af565b60405180910390f35b3480156105d957600080fd5b506105e2611293565b6040516105ef9190613831565b60405180910390f35b610612600480360381019061060d9190613335565b611325565b005b34801561062057600080fd5b5061063b600480360381019061063691906131a9565b61144c565b005b34801561064957600080fd5b50610664600480360381019061065f919061312e565b611462565b005b34801561067257600080fd5b5061068d6004803603810190610688919061307a565b6114c4565b60405161069a9190613b4e565b60405180910390f35b3480156106af57600080fd5b506106ca60048036038101906106c59190613279565b61151a565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613335565b6115b3565b6040516107009190613831565b60405180910390f35b34801561071557600080fd5b5061071e61165a565b60405161072b9190613b33565b60405180910390f35b61074e6004803603810190610749919061335e565b611660565b005b34801561075c57600080fd5b50610777600480360381019061077291906130a3565b611851565b6040516107849190613816565b60405180910390f35b34801561079957600080fd5b506107a26118e5565b6040516107af9190613816565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da919061307a565b6118f8565b005b3480156107ed57600080fd5b50610808600480360381019061080391906132f4565b6119f0565b005b600061081582611a86565b9050919050565b60606000805461082b90613de5565b80601f016020809104026020016040519081016040528092919081815260200182805461085790613de5565b80156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b60006108b982611b00565b6108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef906139f3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093e82610cbd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613a73565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ce611b6c565b73ffffffffffffffffffffffffffffffffffffffff1614806109fd57506109fc816109f7611b6c565b611851565b5b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3390613973565b60405180910390fd5b610a468383611b74565b505050565b6000600880549050905090565b610a69610a63611b6c565b82611c2d565b610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90613ad3565b60405180910390fd5b610ab3838383611d0b565b505050565b600e60009054906101000a900460ff1681565b6000610ad683610e88565b8210610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e90613853565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b8b83838360405180602001604052806000815250611462565b505050565b6000610b9a610a4b565b8210610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290613af3565b60405180910390fd5b60088281548110610c15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c2f611b6c565b73ffffffffffffffffffffffffffffffffffffffff16610c4d611269565b73ffffffffffffffffffffffffffffffffffffffff1614610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a90613a13565b60405180910390fd5b80600d9080519060200190610cb9929190612e3f565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d906139b3565b60405180910390fd5b80915050919050565b600b8054610d7c90613de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610da890613de5565b8015610df55780601f10610dca57610100808354040283529160200191610df5565b820191906000526020600020905b815481529060010190602001808311610dd857829003601f168201915b505050505081565b600281565b610e0a611b6c565b73ffffffffffffffffffffffffffffffffffffffff16610e28611269565b73ffffffffffffffffffffffffffffffffffffffff1614610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590613a13565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090613993565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f48611b6c565b73ffffffffffffffffffffffffffffffffffffffff16610f66611269565b73ffffffffffffffffffffffffffffffffffffffff1614610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390613a13565b60405180910390fd5b610fc66000611f72565b565b610fd0611b6c565b73ffffffffffffffffffffffffffffffffffffffff16610fee611269565b73ffffffffffffffffffffffffffffffffffffffff1614611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b90613a13565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b611069611b6c565b73ffffffffffffffffffffffffffffffffffffffff16611087611269565b73ffffffffffffffffffffffffffffffffffffffff16146110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d490613a13565b60405180910390fd5b60006110e7610a4b565b905060005b8281101561111c576111093382846111049190613c33565b612038565b808061111490613e48565b9150506110ec565b505050565b611129611b6c565b73ffffffffffffffffffffffffffffffffffffffff16611147611269565b73ffffffffffffffffffffffffffffffffffffffff161461119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490613a13565b60405180910390fd5b60005b838390508110156112635781601060008686858181106111e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906111fe919061307a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061125b90613e48565b9150506111a0565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112a290613de5565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613de5565b801561131b5780601f106112f05761010080835404028352916020019161131b565b820191906000526020600020905b8154815290600101906020018083116112fe57829003601f168201915b5050505050905090565b600061132f610a4b565b9050600c60009054906101000a900460ff16611380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137790613a53565b60405180910390fd5b60028211156113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90613a93565b60405180910390fd5b600f5482826113d39190613c33565b1115611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b906138b3565b60405180910390fd5b60005b828110156114475761143433828461142f9190613c33565b612038565b808061143f90613e48565b915050611417565b505050565b61145e611457611b6c565b8383612056565b5050565b61147361146d611b6c565b83611c2d565b6114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a990613ad3565b60405180910390fd5b6114be848484846121c3565b50505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611522611b6c565b73ffffffffffffffffffffffffffffffffffffffff16611540611269565b73ffffffffffffffffffffffffffffffffffffffff1614611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90613a13565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606115be82611b00565b6115fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f490613a33565b60405180910390fd5b600061160761221f565b905060008151116116275760405180602001604052806000815250611652565b80611631846122b1565b60405160200161164292919061378b565b6040516020818303038152906040525b915050919050565b600f5481565b600061166a610a4b565b9050600e60009054906101000a900460ff166116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613b13565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790613ab3565b60405180910390fd5b600f548260ff16826117629190613c33565b11156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a906138b3565b60405180910390fd5b81601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166117fe9190613cee565b92506101000a81548160ff021916908360ff16021790555060005b8260ff1681101561184c576118393382846118349190613c33565b612038565b808061184490613e48565b915050611819565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611900611b6c565b73ffffffffffffffffffffffffffffffffffffffff1661191e611269565b73ffffffffffffffffffffffffffffffffffffffff1614611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b90613a13565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90613893565b60405180910390fd5b6119ed81611f72565b50565b6119f8611b6c565b73ffffffffffffffffffffffffffffffffffffffff16611a16611269565b73ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390613a13565b60405180910390fd5b80600b9080519060200190611a82929190612e3f565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611af95750611af88261245e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be783610cbd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3882611b00565b611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90613953565b60405180910390fd5b6000611c8283610cbd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cc45750611cc38185611851565b5b80611d0257508373ffffffffffffffffffffffffffffffffffffffff16611cea846108ae565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d2b82610cbd565b73ffffffffffffffffffffffffffffffffffffffff1614611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d78906138d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de890613913565b60405180910390fd5b611dfc838383612540565b611e07600082611b74565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e579190613cba565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eae9190613c33565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f6d838383612550565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612052828260405180602001604052806000815250612555565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90613933565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121b69190613816565b60405180910390a3505050565b6121ce848484611d0b565b6121da848484846125b0565b612219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221090613873565b60405180910390fd5b50505050565b6060600d805461222e90613de5565b80601f016020809104026020016040519081016040528092919081815260200182805461225a90613de5565b80156122a75780601f1061227c576101008083540402835291602001916122a7565b820191906000526020600020905b81548152906001019060200180831161228a57829003601f168201915b5050505050905090565b606060008214156122f9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612459565b600082905060005b6000821461232b57808061231490613e48565b915050600a826123249190613c89565b9150612301565b60008167ffffffffffffffff81111561236d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561239f5781602001600182028036833780820191505090505b5090505b60008514612452576001826123b89190613cba565b9150600a856123c79190613e91565b60306123d39190613c33565b60f81b81838151811061240f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561244b9190613c89565b94506123a3565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061252957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612539575061253882612747565b5b9050919050565b61254b8383836127b1565b505050565b505050565b61255f83836128c5565b61256c60008484846125b0565b6125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a290613873565b60405180910390fd5b505050565b60006125d18473ffffffffffffffffffffffffffffffffffffffff16612a9f565b1561273a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fa611b6c565b8786866040518563ffffffff1660e01b815260040161261c94939291906137ca565b602060405180830381600087803b15801561263657600080fd5b505af192505050801561266757506040513d601f19601f8201168201806040525081019061266491906132cb565b60015b6126ea573d8060008114612697576040519150601f19603f3d011682016040523d82523d6000602084013e61269c565b606091505b506000815114156126e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d990613873565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061273f565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6127bc838383612ac2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127ff576127fa81612ac7565b61283e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461283d5761283c8382612b10565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128815761287c81612c7d565b6128c0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146128bf576128be8282612dc0565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292c906139d3565b60405180910390fd5b61293e81611b00565b1561297e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612975906138f3565b60405180910390fd5b61298a60008383612540565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129da9190613c33565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a9b60008383612550565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b1d84610e88565b612b279190613cba565b9050600060076000848152602001908152602001600020549050818114612c0c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c919190613cba565b9050600060096000848152602001908152602001600020549050600060088381548110612ce7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612d2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612da4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612dcb83610e88565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612e4b90613de5565b90600052602060002090601f016020900481019282612e6d5760008555612eb4565b82601f10612e8657805160ff1916838001178555612eb4565b82800160010185558215612eb4579182015b82811115612eb3578251825591602001919060010190612e98565b5b509050612ec19190612ec5565b5090565b5b80821115612ede576000816000905550600101612ec6565b5090565b6000612ef5612ef084613b8e565b613b69565b905082815260208101848484011115612f0d57600080fd5b612f18848285613da3565b509392505050565b6000612f33612f2e84613bbf565b613b69565b905082815260208101848484011115612f4b57600080fd5b612f56848285613da3565b509392505050565b600081359050612f6d8161459e565b92915050565b60008083601f840112612f8557600080fd5b8235905067ffffffffffffffff811115612f9e57600080fd5b602083019150836020820283011115612fb657600080fd5b9250929050565b600081359050612fcc816145b5565b92915050565b600081359050612fe1816145cc565b92915050565b600081519050612ff6816145cc565b92915050565b600082601f83011261300d57600080fd5b813561301d848260208601612ee2565b91505092915050565b600082601f83011261303757600080fd5b8135613047848260208601612f20565b91505092915050565b60008135905061305f816145e3565b92915050565b600081359050613074816145fa565b92915050565b60006020828403121561308c57600080fd5b600061309a84828501612f5e565b91505092915050565b600080604083850312156130b657600080fd5b60006130c485828601612f5e565b92505060206130d585828601612f5e565b9150509250929050565b6000806000606084860312156130f457600080fd5b600061310286828701612f5e565b935050602061311386828701612f5e565b925050604061312486828701613050565b9150509250925092565b6000806000806080858703121561314457600080fd5b600061315287828801612f5e565b945050602061316387828801612f5e565b935050604061317487828801613050565b925050606085013567ffffffffffffffff81111561319157600080fd5b61319d87828801612ffc565b91505092959194509250565b600080604083850312156131bc57600080fd5b60006131ca85828601612f5e565b92505060206131db85828601612fbd565b9150509250929050565b600080604083850312156131f857600080fd5b600061320685828601612f5e565b925050602061321785828601613050565b9150509250929050565b60008060006040848603121561323657600080fd5b600084013567ffffffffffffffff81111561325057600080fd5b61325c86828701612f73565b9350935050602061326f86828701613065565b9150509250925092565b60006020828403121561328b57600080fd5b600061329984828501612fbd565b91505092915050565b6000602082840312156132b457600080fd5b60006132c284828501612fd2565b91505092915050565b6000602082840312156132dd57600080fd5b60006132eb84828501612fe7565b91505092915050565b60006020828403121561330657600080fd5b600082013567ffffffffffffffff81111561332057600080fd5b61332c84828501613026565b91505092915050565b60006020828403121561334757600080fd5b600061335584828501613050565b91505092915050565b60006020828403121561337057600080fd5b600061337e84828501613065565b91505092915050565b61339081613d22565b82525050565b61339f81613d34565b82525050565b60006133b082613bf0565b6133ba8185613c06565b93506133ca818560208601613db2565b6133d381613f7e565b840191505092915050565b60006133e982613bfb565b6133f38185613c17565b9350613403818560208601613db2565b61340c81613f7e565b840191505092915050565b600061342282613bfb565b61342c8185613c28565b935061343c818560208601613db2565b80840191505092915050565b6000613455602b83613c17565b915061346082613f8f565b604082019050919050565b6000613478603283613c17565b915061348382613fde565b604082019050919050565b600061349b602683613c17565b91506134a68261402d565b604082019050919050565b60006134be602083613c17565b91506134c98261407c565b602082019050919050565b60006134e1602583613c17565b91506134ec826140a5565b604082019050919050565b6000613504601c83613c17565b915061350f826140f4565b602082019050919050565b6000613527602483613c17565b91506135328261411d565b604082019050919050565b600061354a601983613c17565b91506135558261416c565b602082019050919050565b600061356d602c83613c17565b915061357882614195565b604082019050919050565b6000613590603883613c17565b915061359b826141e4565b604082019050919050565b60006135b3602a83613c17565b91506135be82614233565b604082019050919050565b60006135d6602983613c17565b91506135e182614282565b604082019050919050565b60006135f9602083613c17565b9150613604826142d1565b602082019050919050565b600061361c602c83613c17565b9150613627826142fa565b604082019050919050565b600061363f602083613c17565b915061364a82614349565b602082019050919050565b6000613662602f83613c17565b915061366d82614372565b604082019050919050565b6000613685602283613c17565b9150613690826143c1565b604082019050919050565b60006136a8602183613c17565b91506136b382614410565b604082019050919050565b60006136cb601b83613c17565b91506136d68261445f565b602082019050919050565b60006136ee602283613c17565b91506136f982614488565b604082019050919050565b6000613711603183613c17565b915061371c826144d7565b604082019050919050565b6000613734602c83613c17565b915061373f82614526565b604082019050919050565b6000613757601883613c17565b915061376282614575565b602082019050919050565b61377681613d8c565b82525050565b61378581613d96565b82525050565b60006137978285613417565b91506137a38284613417565b91508190509392505050565b60006020820190506137c46000830184613387565b92915050565b60006080820190506137df6000830187613387565b6137ec6020830186613387565b6137f9604083018561376d565b818103606083015261380b81846133a5565b905095945050505050565b600060208201905061382b6000830184613396565b92915050565b6000602082019050818103600083015261384b81846133de565b905092915050565b6000602082019050818103600083015261386c81613448565b9050919050565b6000602082019050818103600083015261388c8161346b565b9050919050565b600060208201905081810360008301526138ac8161348e565b9050919050565b600060208201905081810360008301526138cc816134b1565b9050919050565b600060208201905081810360008301526138ec816134d4565b9050919050565b6000602082019050818103600083015261390c816134f7565b9050919050565b6000602082019050818103600083015261392c8161351a565b9050919050565b6000602082019050818103600083015261394c8161353d565b9050919050565b6000602082019050818103600083015261396c81613560565b9050919050565b6000602082019050818103600083015261398c81613583565b9050919050565b600060208201905081810360008301526139ac816135a6565b9050919050565b600060208201905081810360008301526139cc816135c9565b9050919050565b600060208201905081810360008301526139ec816135ec565b9050919050565b60006020820190508181036000830152613a0c8161360f565b9050919050565b60006020820190508181036000830152613a2c81613632565b9050919050565b60006020820190508181036000830152613a4c81613655565b9050919050565b60006020820190508181036000830152613a6c81613678565b9050919050565b60006020820190508181036000830152613a8c8161369b565b9050919050565b60006020820190508181036000830152613aac816136be565b9050919050565b60006020820190508181036000830152613acc816136e1565b9050919050565b60006020820190508181036000830152613aec81613704565b9050919050565b60006020820190508181036000830152613b0c81613727565b9050919050565b60006020820190508181036000830152613b2c8161374a565b9050919050565b6000602082019050613b48600083018461376d565b92915050565b6000602082019050613b63600083018461377c565b92915050565b6000613b73613b84565b9050613b7f8282613e17565b919050565b6000604051905090565b600067ffffffffffffffff821115613ba957613ba8613f4f565b5b613bb282613f7e565b9050602081019050919050565b600067ffffffffffffffff821115613bda57613bd9613f4f565b5b613be382613f7e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c3e82613d8c565b9150613c4983613d8c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c7e57613c7d613ec2565b5b828201905092915050565b6000613c9482613d8c565b9150613c9f83613d8c565b925082613caf57613cae613ef1565b5b828204905092915050565b6000613cc582613d8c565b9150613cd083613d8c565b925082821015613ce357613ce2613ec2565b5b828203905092915050565b6000613cf982613d96565b9150613d0483613d96565b925082821015613d1757613d16613ec2565b5b828203905092915050565b6000613d2d82613d6c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613dd0578082015181840152602081019050613db5565b83811115613ddf576000848401525b50505050565b60006002820490506001821680613dfd57607f821691505b60208210811415613e1157613e10613f20565b5b50919050565b613e2082613f7e565b810181811067ffffffffffffffff82111715613e3f57613e3e613f4f565b5b80604052505050565b6000613e5382613d8c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8657613e85613ec2565b5b600182019050919050565b6000613e9c82613d8c565b9150613ea783613d8c565b925082613eb757613eb6613ef1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b6145a781613d22565b81146145b257600080fd5b50565b6145be81613d34565b81146145c957600080fd5b50565b6145d581613d40565b81146145e057600080fd5b50565b6145ec81613d8c565b81146145f757600080fd5b50565b61460381613d96565b811461460e57600080fd5b5056fea264697066735822122009e4bbee9c593f0bb8b920ae8fddf2935ecb26fa962b406efec9c8e2f9b84db864736f6c63430008020033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063718bc4af1161010d578063c04a2836116100a0578063ddff5b1c1161006f578063ddff5b1c14610734578063e985e9c514610750578063eb8d24441461078d578063f2fde38b146107b8578063ffe630b5146107e1576101f9565b8063c04a283614610666578063c4e37095146106a3578063c87b56dd146106cc578063d5abeb0114610709576101f9565b806395d89b41116100dc57806395d89b41146105cd578063a0712d68146105f8578063a22cb46514610614578063b88d4fde1461063d576101f9565b8063718bc4af14610527578063819b25ba146105505780638295784d146105795780638da5cb5b146105a2576101f9565b806342842e0e116101905780636373a6b11161015f5780636373a6b11461045457806365f130971461047f5780636f8b44b0146104aa57806370a08231146104d3578063715018a614610510576101f9565b806342842e0e146103885780634f6ccce7146103b157806355f804b3146103ee5780636352211e14610417576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f757806329fc6bae146103205780632f745c591461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906132a2565b61080a565b6040516102329190613816565b60405180910390f35b34801561024757600080fd5b5061025061081c565b60405161025d9190613831565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613335565b6108ae565b60405161029a91906137af565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906131e5565b610933565b005b3480156102d857600080fd5b506102e1610a4b565b6040516102ee9190613b33565b60405180910390f35b34801561030357600080fd5b5061031e600480360381019061031991906130df565b610a58565b005b34801561032c57600080fd5b50610335610ab8565b6040516103429190613816565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906131e5565b610acb565b60405161037f9190613b33565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa91906130df565b610b70565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190613335565b610b90565b6040516103e59190613b33565b60405180910390f35b3480156103fa57600080fd5b50610415600480360381019061041091906132f4565b610c27565b005b34801561042357600080fd5b5061043e60048036038101906104399190613335565b610cbd565b60405161044b91906137af565b60405180910390f35b34801561046057600080fd5b50610469610d6f565b6040516104769190613831565b60405180910390f35b34801561048b57600080fd5b50610494610dfd565b6040516104a19190613b33565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613335565b610e02565b005b3480156104df57600080fd5b506104fa60048036038101906104f5919061307a565b610e88565b6040516105079190613b33565b60405180910390f35b34801561051c57600080fd5b50610525610f40565b005b34801561053357600080fd5b5061054e60048036038101906105499190613279565b610fc8565b005b34801561055c57600080fd5b5061057760048036038101906105729190613335565b611061565b005b34801561058557600080fd5b506105a0600480360381019061059b9190613221565b611121565b005b3480156105ae57600080fd5b506105b7611269565b6040516105c491906137af565b60405180910390f35b3480156105d957600080fd5b506105e2611293565b6040516105ef9190613831565b60405180910390f35b610612600480360381019061060d9190613335565b611325565b005b34801561062057600080fd5b5061063b600480360381019061063691906131a9565b61144c565b005b34801561064957600080fd5b50610664600480360381019061065f919061312e565b611462565b005b34801561067257600080fd5b5061068d6004803603810190610688919061307a565b6114c4565b60405161069a9190613b4e565b60405180910390f35b3480156106af57600080fd5b506106ca60048036038101906106c59190613279565b61151a565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613335565b6115b3565b6040516107009190613831565b60405180910390f35b34801561071557600080fd5b5061071e61165a565b60405161072b9190613b33565b60405180910390f35b61074e6004803603810190610749919061335e565b611660565b005b34801561075c57600080fd5b50610777600480360381019061077291906130a3565b611851565b6040516107849190613816565b60405180910390f35b34801561079957600080fd5b506107a26118e5565b6040516107af9190613816565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da919061307a565b6118f8565b005b3480156107ed57600080fd5b50610808600480360381019061080391906132f4565b6119f0565b005b600061081582611a86565b9050919050565b60606000805461082b90613de5565b80601f016020809104026020016040519081016040528092919081815260200182805461085790613de5565b80156108a45780601f10610879576101008083540402835291602001916108a4565b820191906000526020600020905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b60006108b982611b00565b6108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef906139f3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093e82610cbd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613a73565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ce611b6c565b73ffffffffffffffffffffffffffffffffffffffff1614806109fd57506109fc816109f7611b6c565b611851565b5b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3390613973565b60405180910390fd5b610a468383611b74565b505050565b6000600880549050905090565b610a69610a63611b6c565b82611c2d565b610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90613ad3565b60405180910390fd5b610ab3838383611d0b565b505050565b600e60009054906101000a900460ff1681565b6000610ad683610e88565b8210610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e90613853565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b8b83838360405180602001604052806000815250611462565b505050565b6000610b9a610a4b565b8210610bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd290613af3565b60405180910390fd5b60088281548110610c15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c2f611b6c565b73ffffffffffffffffffffffffffffffffffffffff16610c4d611269565b73ffffffffffffffffffffffffffffffffffffffff1614610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a90613a13565b60405180910390fd5b80600d9080519060200190610cb9929190612e3f565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d906139b3565b60405180910390fd5b80915050919050565b600b8054610d7c90613de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610da890613de5565b8015610df55780601f10610dca57610100808354040283529160200191610df5565b820191906000526020600020905b815481529060010190602001808311610dd857829003601f168201915b505050505081565b600281565b610e0a611b6c565b73ffffffffffffffffffffffffffffffffffffffff16610e28611269565b73ffffffffffffffffffffffffffffffffffffffff1614610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590613a13565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090613993565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f48611b6c565b73ffffffffffffffffffffffffffffffffffffffff16610f66611269565b73ffffffffffffffffffffffffffffffffffffffff1614610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390613a13565b60405180910390fd5b610fc66000611f72565b565b610fd0611b6c565b73ffffffffffffffffffffffffffffffffffffffff16610fee611269565b73ffffffffffffffffffffffffffffffffffffffff1614611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b90613a13565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b611069611b6c565b73ffffffffffffffffffffffffffffffffffffffff16611087611269565b73ffffffffffffffffffffffffffffffffffffffff16146110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d490613a13565b60405180910390fd5b60006110e7610a4b565b905060005b8281101561111c576111093382846111049190613c33565b612038565b808061111490613e48565b9150506110ec565b505050565b611129611b6c565b73ffffffffffffffffffffffffffffffffffffffff16611147611269565b73ffffffffffffffffffffffffffffffffffffffff161461119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490613a13565b60405180910390fd5b60005b838390508110156112635781601060008686858181106111e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906111fe919061307a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061125b90613e48565b9150506111a0565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112a290613de5565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613de5565b801561131b5780601f106112f05761010080835404028352916020019161131b565b820191906000526020600020905b8154815290600101906020018083116112fe57829003601f168201915b5050505050905090565b600061132f610a4b565b9050600c60009054906101000a900460ff16611380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137790613a53565b60405180910390fd5b60028211156113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90613a93565b60405180910390fd5b600f5482826113d39190613c33565b1115611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b906138b3565b60405180910390fd5b60005b828110156114475761143433828461142f9190613c33565b612038565b808061143f90613e48565b915050611417565b505050565b61145e611457611b6c565b8383612056565b5050565b61147361146d611b6c565b83611c2d565b6114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a990613ad3565b60405180910390fd5b6114be848484846121c3565b50505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611522611b6c565b73ffffffffffffffffffffffffffffffffffffffff16611540611269565b73ffffffffffffffffffffffffffffffffffffffff1614611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90613a13565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60606115be82611b00565b6115fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f490613a33565b60405180910390fd5b600061160761221f565b905060008151116116275760405180602001604052806000815250611652565b80611631846122b1565b60405160200161164292919061378b565b6040516020818303038152906040525b915050919050565b600f5481565b600061166a610a4b565b9050600e60009054906101000a900460ff166116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613b13565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168260ff161115611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790613ab3565b60405180910390fd5b600f548260ff16826117629190613c33565b11156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a906138b3565b60405180910390fd5b81601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166117fe9190613cee565b92506101000a81548160ff021916908360ff16021790555060005b8260ff1681101561184c576118393382846118349190613c33565b612038565b808061184490613e48565b915050611819565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611900611b6c565b73ffffffffffffffffffffffffffffffffffffffff1661191e611269565b73ffffffffffffffffffffffffffffffffffffffff1614611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b90613a13565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90613893565b60405180910390fd5b6119ed81611f72565b50565b6119f8611b6c565b73ffffffffffffffffffffffffffffffffffffffff16611a16611269565b73ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390613a13565b60405180910390fd5b80600b9080519060200190611a82929190612e3f565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611af95750611af88261245e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be783610cbd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3882611b00565b611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90613953565b60405180910390fd5b6000611c8283610cbd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cc45750611cc38185611851565b5b80611d0257508373ffffffffffffffffffffffffffffffffffffffff16611cea846108ae565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d2b82610cbd565b73ffffffffffffffffffffffffffffffffffffffff1614611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d78906138d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de890613913565b60405180910390fd5b611dfc838383612540565b611e07600082611b74565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e579190613cba565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eae9190613c33565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f6d838383612550565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612052828260405180602001604052806000815250612555565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90613933565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121b69190613816565b60405180910390a3505050565b6121ce848484611d0b565b6121da848484846125b0565b612219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221090613873565b60405180910390fd5b50505050565b6060600d805461222e90613de5565b80601f016020809104026020016040519081016040528092919081815260200182805461225a90613de5565b80156122a75780601f1061227c576101008083540402835291602001916122a7565b820191906000526020600020905b81548152906001019060200180831161228a57829003601f168201915b5050505050905090565b606060008214156122f9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612459565b600082905060005b6000821461232b57808061231490613e48565b915050600a826123249190613c89565b9150612301565b60008167ffffffffffffffff81111561236d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561239f5781602001600182028036833780820191505090505b5090505b60008514612452576001826123b89190613cba565b9150600a856123c79190613e91565b60306123d39190613c33565b60f81b81838151811061240f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561244b9190613c89565b94506123a3565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061252957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612539575061253882612747565b5b9050919050565b61254b8383836127b1565b505050565b505050565b61255f83836128c5565b61256c60008484846125b0565b6125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a290613873565b60405180910390fd5b505050565b60006125d18473ffffffffffffffffffffffffffffffffffffffff16612a9f565b1561273a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fa611b6c565b8786866040518563ffffffff1660e01b815260040161261c94939291906137ca565b602060405180830381600087803b15801561263657600080fd5b505af192505050801561266757506040513d601f19601f8201168201806040525081019061266491906132cb565b60015b6126ea573d8060008114612697576040519150601f19603f3d011682016040523d82523d6000602084013e61269c565b606091505b506000815114156126e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d990613873565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061273f565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6127bc838383612ac2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127ff576127fa81612ac7565b61283e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461283d5761283c8382612b10565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128815761287c81612c7d565b6128c0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146128bf576128be8282612dc0565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292c906139d3565b60405180910390fd5b61293e81611b00565b1561297e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612975906138f3565b60405180910390fd5b61298a60008383612540565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129da9190613c33565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a9b60008383612550565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b1d84610e88565b612b279190613cba565b9050600060076000848152602001908152602001600020549050818114612c0c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c919190613cba565b9050600060096000848152602001908152602001600020549050600060088381548110612ce7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612d2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612da4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612dcb83610e88565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612e4b90613de5565b90600052602060002090601f016020900481019282612e6d5760008555612eb4565b82601f10612e8657805160ff1916838001178555612eb4565b82800160010185558215612eb4579182015b82811115612eb3578251825591602001919060010190612e98565b5b509050612ec19190612ec5565b5090565b5b80821115612ede576000816000905550600101612ec6565b5090565b6000612ef5612ef084613b8e565b613b69565b905082815260208101848484011115612f0d57600080fd5b612f18848285613da3565b509392505050565b6000612f33612f2e84613bbf565b613b69565b905082815260208101848484011115612f4b57600080fd5b612f56848285613da3565b509392505050565b600081359050612f6d8161459e565b92915050565b60008083601f840112612f8557600080fd5b8235905067ffffffffffffffff811115612f9e57600080fd5b602083019150836020820283011115612fb657600080fd5b9250929050565b600081359050612fcc816145b5565b92915050565b600081359050612fe1816145cc565b92915050565b600081519050612ff6816145cc565b92915050565b600082601f83011261300d57600080fd5b813561301d848260208601612ee2565b91505092915050565b600082601f83011261303757600080fd5b8135613047848260208601612f20565b91505092915050565b60008135905061305f816145e3565b92915050565b600081359050613074816145fa565b92915050565b60006020828403121561308c57600080fd5b600061309a84828501612f5e565b91505092915050565b600080604083850312156130b657600080fd5b60006130c485828601612f5e565b92505060206130d585828601612f5e565b9150509250929050565b6000806000606084860312156130f457600080fd5b600061310286828701612f5e565b935050602061311386828701612f5e565b925050604061312486828701613050565b9150509250925092565b6000806000806080858703121561314457600080fd5b600061315287828801612f5e565b945050602061316387828801612f5e565b935050604061317487828801613050565b925050606085013567ffffffffffffffff81111561319157600080fd5b61319d87828801612ffc565b91505092959194509250565b600080604083850312156131bc57600080fd5b60006131ca85828601612f5e565b92505060206131db85828601612fbd565b9150509250929050565b600080604083850312156131f857600080fd5b600061320685828601612f5e565b925050602061321785828601613050565b9150509250929050565b60008060006040848603121561323657600080fd5b600084013567ffffffffffffffff81111561325057600080fd5b61325c86828701612f73565b9350935050602061326f86828701613065565b9150509250925092565b60006020828403121561328b57600080fd5b600061329984828501612fbd565b91505092915050565b6000602082840312156132b457600080fd5b60006132c284828501612fd2565b91505092915050565b6000602082840312156132dd57600080fd5b60006132eb84828501612fe7565b91505092915050565b60006020828403121561330657600080fd5b600082013567ffffffffffffffff81111561332057600080fd5b61332c84828501613026565b91505092915050565b60006020828403121561334757600080fd5b600061335584828501613050565b91505092915050565b60006020828403121561337057600080fd5b600061337e84828501613065565b91505092915050565b61339081613d22565b82525050565b61339f81613d34565b82525050565b60006133b082613bf0565b6133ba8185613c06565b93506133ca818560208601613db2565b6133d381613f7e565b840191505092915050565b60006133e982613bfb565b6133f38185613c17565b9350613403818560208601613db2565b61340c81613f7e565b840191505092915050565b600061342282613bfb565b61342c8185613c28565b935061343c818560208601613db2565b80840191505092915050565b6000613455602b83613c17565b915061346082613f8f565b604082019050919050565b6000613478603283613c17565b915061348382613fde565b604082019050919050565b600061349b602683613c17565b91506134a68261402d565b604082019050919050565b60006134be602083613c17565b91506134c98261407c565b602082019050919050565b60006134e1602583613c17565b91506134ec826140a5565b604082019050919050565b6000613504601c83613c17565b915061350f826140f4565b602082019050919050565b6000613527602483613c17565b91506135328261411d565b604082019050919050565b600061354a601983613c17565b91506135558261416c565b602082019050919050565b600061356d602c83613c17565b915061357882614195565b604082019050919050565b6000613590603883613c17565b915061359b826141e4565b604082019050919050565b60006135b3602a83613c17565b91506135be82614233565b604082019050919050565b60006135d6602983613c17565b91506135e182614282565b604082019050919050565b60006135f9602083613c17565b9150613604826142d1565b602082019050919050565b600061361c602c83613c17565b9150613627826142fa565b604082019050919050565b600061363f602083613c17565b915061364a82614349565b602082019050919050565b6000613662602f83613c17565b915061366d82614372565b604082019050919050565b6000613685602283613c17565b9150613690826143c1565b604082019050919050565b60006136a8602183613c17565b91506136b382614410565b604082019050919050565b60006136cb601b83613c17565b91506136d68261445f565b602082019050919050565b60006136ee602283613c17565b91506136f982614488565b604082019050919050565b6000613711603183613c17565b915061371c826144d7565b604082019050919050565b6000613734602c83613c17565b915061373f82614526565b604082019050919050565b6000613757601883613c17565b915061376282614575565b602082019050919050565b61377681613d8c565b82525050565b61378581613d96565b82525050565b60006137978285613417565b91506137a38284613417565b91508190509392505050565b60006020820190506137c46000830184613387565b92915050565b60006080820190506137df6000830187613387565b6137ec6020830186613387565b6137f9604083018561376d565b818103606083015261380b81846133a5565b905095945050505050565b600060208201905061382b6000830184613396565b92915050565b6000602082019050818103600083015261384b81846133de565b905092915050565b6000602082019050818103600083015261386c81613448565b9050919050565b6000602082019050818103600083015261388c8161346b565b9050919050565b600060208201905081810360008301526138ac8161348e565b9050919050565b600060208201905081810360008301526138cc816134b1565b9050919050565b600060208201905081810360008301526138ec816134d4565b9050919050565b6000602082019050818103600083015261390c816134f7565b9050919050565b6000602082019050818103600083015261392c8161351a565b9050919050565b6000602082019050818103600083015261394c8161353d565b9050919050565b6000602082019050818103600083015261396c81613560565b9050919050565b6000602082019050818103600083015261398c81613583565b9050919050565b600060208201905081810360008301526139ac816135a6565b9050919050565b600060208201905081810360008301526139cc816135c9565b9050919050565b600060208201905081810360008301526139ec816135ec565b9050919050565b60006020820190508181036000830152613a0c8161360f565b9050919050565b60006020820190508181036000830152613a2c81613632565b9050919050565b60006020820190508181036000830152613a4c81613655565b9050919050565b60006020820190508181036000830152613a6c81613678565b9050919050565b60006020820190508181036000830152613a8c8161369b565b9050919050565b60006020820190508181036000830152613aac816136be565b9050919050565b60006020820190508181036000830152613acc816136e1565b9050919050565b60006020820190508181036000830152613aec81613704565b9050919050565b60006020820190508181036000830152613b0c81613727565b9050919050565b60006020820190508181036000830152613b2c8161374a565b9050919050565b6000602082019050613b48600083018461376d565b92915050565b6000602082019050613b63600083018461377c565b92915050565b6000613b73613b84565b9050613b7f8282613e17565b919050565b6000604051905090565b600067ffffffffffffffff821115613ba957613ba8613f4f565b5b613bb282613f7e565b9050602081019050919050565b600067ffffffffffffffff821115613bda57613bd9613f4f565b5b613be382613f7e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c3e82613d8c565b9150613c4983613d8c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c7e57613c7d613ec2565b5b828201905092915050565b6000613c9482613d8c565b9150613c9f83613d8c565b925082613caf57613cae613ef1565b5b828204905092915050565b6000613cc582613d8c565b9150613cd083613d8c565b925082821015613ce357613ce2613ec2565b5b828203905092915050565b6000613cf982613d96565b9150613d0483613d96565b925082821015613d1757613d16613ec2565b5b828203905092915050565b6000613d2d82613d6c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613dd0578082015181840152602081019050613db5565b83811115613ddf576000848401525b50505050565b60006002820490506001821680613dfd57607f821691505b60208210811415613e1157613e10613f20565b5b50919050565b613e2082613f7e565b810181811067ffffffffffffffff82111715613e3f57613e3e613f4f565b5b80604052505050565b6000613e5382613d8c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8657613e85613ec2565b5b600182019050919050565b6000613e9c82613d8c565b9150613ea783613d8c565b925082613eb757613eb6613ef1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b6145a781613d22565b81146145b257600080fd5b50565b6145be81613d34565b81146145c957600080fd5b50565b6145d581613d40565b81146145e057600080fd5b50565b6145ec81613d8c565b81146145f757600080fd5b50565b61460381613d96565b811461460e57600080fd5b5056fea264697066735822122009e4bbee9c593f0bb8b920ae8fddf2935ecb26fa962b406efec9c8e2f9b84db864736f6c63430008020033

Deployed Bytecode Sourcemap

279:3061:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2036:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2488:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4000:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3538:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1615:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4727:330:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;449:37:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1291:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5123:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1798:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2223:111:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2191:235:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;341:24:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;531:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;708:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1929:205:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;818:131:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2583:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;957:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2650:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2887:450:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4284:153:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5368:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1195:114:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2783:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2818:329:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;493:31:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1317:522;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4503:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;372:32:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2467:108:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2036:179;2147:4;2171:36;2195:11;2171:23;:36::i;:::-;2164:43;;2036:179;;;:::o;2488:98:1:-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;4000:217::-;4076:7;4103:16;4111:7;4103;:16::i;:::-;4095:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4186:15;:24;4202:7;4186:24;;;;;;;;;;;;;;;;;;;;;4179:31;;4000:217;;;:::o;3538:401::-;3618:13;3634:23;3649:7;3634:14;:23::i;:::-;3618:39;;3681:5;3675:11;;:2;:11;;;;3667:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3772:5;3756:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3781:37;3798:5;3805:12;:10;:12::i;:::-;3781:16;:37::i;:::-;3756:62;3735:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3911:21;3920:2;3924:7;3911:8;:21::i;:::-;3538:401;;;:::o;1615:111:4:-;1676:7;1702:10;:17;;;;1695:24;;1615:111;:::o;4727:330:1:-;4916:41;4935:12;:10;:12::i;:::-;4949:7;4916:18;:41::i;:::-;4908:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5022:28;5032:4;5038:2;5042:7;5022:9;:28::i;:::-;4727:330;;;:::o;449:37:12:-;;;;;;;;;;;;;:::o;1291:253:4:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1511:12;:19;1524:5;1511:19;;;;;;;;;;;;;;;:26;1531:5;1511:26;;;;;;;;;;;;1504:33;;1291:253;;;;:::o;5123:179:1:-;5256:39;5273:4;5279:2;5283:7;5256:39;;;;;;;;;;;;:16;:39::i;:::-;5123:179;;;:::o;1798:230:4:-;1873:7;1908:30;:28;:30::i;:::-;1900:5;:38;1892:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2004:10;2015:5;2004:17;;;;;;;;;;;;;;;;;;;;;;;;1997:24;;1798:230;;;:::o;2223:111:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2318:8:12::1;2299:16;:27;;;;;;;;;;;;:::i;:::-;;2223:111:::0;:::o;2191:235:1:-;2263:7;2282:13;2298:7;:16;2306:7;2298:16;;;;;;;;;;;;;;;;;;;;;2282:32;;2349:1;2332:19;;:5;:19;;;;2324:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2414:5;2407:12;;;2191:235;;;:::o;341:24:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;531:43::-;573:1;531:43;:::o;708:102::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;792:10:12::1;780:9;:22;;;;708:102:::0;:::o;1929:205:1:-;2001:7;2045:1;2028:19;;:5;:19;;;;2020:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2111:9;:16;2121:5;2111:16;;;;;;;;;;;;;;;;2104:23;;1929:205;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;818:131:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;923:18:12::1;903:17;;:38;;;;;;;;;;;;;;;;;;818:131:::0;:::o;2583:192::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2637:11:12::1;2651:13;:11;:13::i;:::-;2637:27;;2673:6;2688:80;2704:1;2700;:5;2688:80;;;2725:33;2735:10;2756:1;2747:6;:10;;;;:::i;:::-;2725:9;:33::i;:::-;2707:3;;;;;:::i;:::-;;;;2688:80;;;1318:1:0;;2583:192:12::0;:::o;957:230::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1068:9:12::1;1063:117;1087:9;;:16;;1083:1;:20;1063:117;;;1152:16;1125:10;:24;1136:9;;1146:1;1136:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1125:24;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;1105:3;;;;;:::i;:::-;;;;1063:117;;;;957:230:::0;;;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;2650:102:1:-;2706:13;2738:7;2731:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2650:102;:::o;2887:450:12:-;2948:10;2961:13;:11;:13::i;:::-;2948:26;;2993:12;;;;;;;;;;;2985:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;573:1;3063:14;:33;;3055:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3170:9;;3152:14;3147:2;:19;;;;:::i;:::-;:32;;3139:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;3234:9;3229:101;3253:14;3249:1;:18;3229:101;;;3289:29;3299:10;3316:1;3311:2;:6;;;;:::i;:::-;3289:9;:29::i;:::-;3269:3;;;;;:::i;:::-;;;;3229:101;;;;2887:450;;:::o;4284:153:1:-;4378:52;4397:12;:10;:12::i;:::-;4411:8;4421;4378:18;:52::i;:::-;4284:153;;:::o;5368:320::-;5537:41;5556:12;:10;:12::i;:::-;5570:7;5537:18;:41::i;:::-;5529:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5642:39;5656:4;5662:2;5666:7;5675:5;5642:13;:39::i;:::-;5368:320;;;;:::o;1195:114:12:-;1260:5;1285:10;:16;1296:4;1285:16;;;;;;;;;;;;;;;;;;;;;;;;;1278:23;;1195:114;;;:::o;2783:96::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2863:8:12::1;2848:12;;:23;;;;;;;;;;;;;;;;;;2783:96:::0;:::o;2818:329:1:-;2891:13;2924:16;2932:7;2924;:16::i;:::-;2916:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3003:21;3027:10;:8;:10::i;:::-;3003:34;;3078:1;3060:7;3054:21;:25;:86;;;;;;;;;;;;;;;;;3106:7;3115:18;:7;:16;:18::i;:::-;3089:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3054:86;3047:93;;;2818:329;;;:::o;493:31:12:-;;;;:::o;1317:522::-;1390:10;1403:13;:11;:13::i;:::-;1390:26;;1435:17;;;;;;;;;;;1427:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;1518:10;:22;1529:10;1518:22;;;;;;;;;;;;;;;;;;;;;;;;;1500:40;;:14;:40;;;;1492:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1621:9;;1603:14;1598:19;;:2;:19;;;;:::i;:::-;:32;;1590:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1706:14;1680:10;:22;1691:10;1680:22;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1736:9;1731:101;1755:14;1751:18;;:1;:18;1731:101;;;1791:29;1801:10;1818:1;1813:2;:6;;;;:::i;:::-;1791:9;:29::i;:::-;1771:3;;;;;:::i;:::-;;;;1731:101;;;;1317:522;;:::o;4503:162:1:-;4600:4;4623:18;:25;4642:5;4623:25;;;;;;;;;;;;;;;:35;4649:8;4623:35;;;;;;;;;;;;;;;;;;;;;;;;;4616:42;;4503:162;;;;:::o;372:32:12:-;;;;;;;;;;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;2467:108:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2557:10:12::1;2544;:23;;;;;;;;;;;;:::i;:::-;;2467:108:::0;:::o;990:222:4:-;1092:4;1130:35;1115:50;;;:11;:50;;;;:90;;;;1169:36;1193:11;1169:23;:36::i;:::-;1115:90;1108:97;;990:222;;;:::o;7160:125:1:-;7225:4;7276:1;7248:30;;:7;:16;7256:7;7248:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7241:37;;7160:125;;;:::o;640:96:8:-;693:7;719:10;712:17;;640:96;:::o;11169:171:1:-;11270:2;11243:15;:24;11259:7;11243:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11325:7;11321:2;11287:46;;11296:23;11311:7;11296:14;:23::i;:::-;11287:46;;;;;;;;;;;;11169:171;;:::o;7443:344::-;7536:4;7560:16;7568:7;7560;:16::i;:::-;7552:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7635:13;7651:23;7666:7;7651:14;:23::i;:::-;7635:39;;7703:5;7692:16;;:7;:16;;;:52;;;;7712:32;7729:5;7736:7;7712:16;:32::i;:::-;7692:52;:87;;;;7772:7;7748:31;;:20;7760:7;7748:11;:20::i;:::-;:31;;;7692:87;7684:96;;;7443:344;;;;:::o;10453:605::-;10607:4;10580:31;;:23;10595:7;10580:14;:23::i;:::-;:31;;;10572:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10685:1;10671:16;;:2;:16;;;;10663:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10739:39;10760:4;10766:2;10770:7;10739:20;:39::i;:::-;10840:29;10857:1;10861:7;10840:8;:29::i;:::-;10899:1;10880:9;:15;10890:4;10880:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10927:1;10910:9;:13;10920:2;10910:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10957:2;10938:7;:16;10946:7;10938:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10994:7;10990:2;10975:27;;10984:4;10975:27;;;;;;;;;;;;11013:38;11033:4;11039:2;11043:7;11013:19;:38::i;:::-;10453:605;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2270:187;;:::o;8117:108:1:-;8192:26;8202:2;8206:7;8192:26;;;;;;;;;;;;:9;:26::i;:::-;8117:108;;:::o;11475:307::-;11625:8;11616:17;;:5;:17;;;;11608:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11711:8;11673:18;:25;11692:5;11673:25;;;;;;;;;;;;;;;:35;11699:8;11673:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11756:8;11734:41;;11749:5;11734:41;;;11766:8;11734:41;;;;;;:::i;:::-;;;;;;;;11475:307;;;:::o;6550:::-;6701:28;6711:4;6717:2;6721:7;6701:9;:28::i;:::-;6747:48;6770:4;6776:2;6780:7;6789:5;6747:22;:48::i;:::-;6739:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6550:307;;;;:::o;2342:117:12:-;2402:13;2435:16;2428:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2342:117;:::o;328:703:9:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;1570:300:1:-;1672:4;1722:25;1707:40;;;:11;:40;;;;:104;;;;1778:33;1763:48;;;:11;:48;;;;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;:::-;1707:156;1688:175;;1570:300;;;:::o;1847:181:12:-;1975:45;2002:4;2008:2;2012:7;1975:26;:45::i;:::-;1847:181;;;:::o;14163:121:1:-;;;;:::o;8446:311::-;8571:18;8577:2;8581:7;8571:5;:18::i;:::-;8620:54;8651:1;8655:2;8659:7;8668:5;8620:22;:54::i;:::-;8599:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8446:311;;;:::o;12335:778::-;12485:4;12505:15;:2;:13;;;:15::i;:::-;12501:606;;;12556:2;12540:36;;;12577:12;:10;:12::i;:::-;12591:4;12597:7;12606:5;12540:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12536:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12796:1;12779:6;:13;:18;12775:266;;;12821:60;;;;;;;;;;:::i;:::-;;;;;;;;12775:266;12993:6;12987:13;12978:6;12974:2;12970:15;12963:38;12536:519;12672:41;;;12662:51;;;:6;:51;;;;12655:58;;;;;12501:606;13092:4;13085:11;;12335:778;;;;;;;:::o;829:155:10:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2624:572:4:-;2763:45;2790:4;2796:2;2800:7;2763:26;:45::i;:::-;2839:1;2823:18;;:4;:18;;;2819:183;;;2857:40;2889:7;2857:31;:40::i;:::-;2819:183;;;2926:2;2918:10;;:4;:10;;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;2914:88;2819:183;3029:1;3015:16;;:2;:16;;;3011:179;;;3047:45;3084:7;3047:36;:45::i;:::-;3011:179;;;3119:4;3113:10;;:2;:10;;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;:::-;3109:81;3011:179;2624:572;;;:::o;9079:427:1:-;9172:1;9158:16;;:2;:16;;;;9150:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9230:16;9238:7;9230;:16::i;:::-;9229:17;9221:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9290:45;9319:1;9323:2;9327:7;9290:20;:45::i;:::-;9363:1;9346:9;:13;9356:2;9346:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9393:2;9374:7;:16;9382:7;9374:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9436:7;9432:2;9411:33;;9428:1;9411:33;;;;;;;;;;;;9455:44;9483:1;9487:2;9491:7;9455:19;:44::i;:::-;9079:427;;:::o;1175:320:7:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;13669:122:1:-;;;;:::o;3902:161:4:-;4005:10;:17;;;;3978:15;:24;3994:7;3978:24;;;;;;;;;;;:44;;;;4032:10;4048:7;4032:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3902:161;:::o;4680:970::-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;4942:51;;5003:18;5024:17;:26;5042:7;5024:26;;;;;;;;;;;;5003:47;;5168:14;5154:10;:28;5150:323;;5198:19;5220:12;:18;5233:4;5220:18;;;;;;;;;;;;;;;:34;5239:14;5220:34;;;;;;;;;;;;5198:56;;5302:11;5269:12;:18;5282:4;5269:18;;;;;;;;;;;;;;;:30;5288:10;5269:30;;;;;;;;;;;:44;;;;5418:10;5385:17;:30;5403:11;5385:30;;;;;;;;;;;:43;;;;5150:323;;5566:17;:26;5584:7;5566:26;;;;;;;;;;;5559:33;;;5609:12;:18;5622:4;5609:18;;;;;;;;;;;;;;;:34;5628:14;5609:34;;;;;;;;;;;5602:41;;;4680:970;;;;:::o;5938:1061::-;6187:22;6232:1;6212:10;:17;;;;:21;;;;:::i;:::-;6187:46;;6243:18;6264:15;:24;6280:7;6264:24;;;;;;;;;;;;6243:45;;6610:19;6632:10;6643:14;6632:26;;;;;;;;;;;;;;;;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6804:10;6773:15;:28;6789:11;6773:28;;;;;;;;;;;:41;;;;6942:15;:24;6958:7;6942:24;;;;;;;;;;;6935:31;;;6976:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5938:1061;;;;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;3574:37;;3648:7;3621:12;:16;3634:2;3621:16;;;;;;;;;;;;;;;:24;3638:6;3621:24;;;;;;;;;;;:34;;;;3694:6;3665:17;:26;3683:7;3665:26;;;;;;;;;;;:35;;;;3490:217;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:13:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;;;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;;1464:6;1451:20;1442:29;;1480:32;1506:5;1480:32;:::i;:::-;1432:86;;;;:::o;1524:141::-;;1611:6;1605:13;1596:22;;1627:32;1653:5;1627:32;:::i;:::-;1586:79;;;;:::o;1684:271::-;;1788:3;1781:4;1773:6;1769:17;1765:27;1755:2;;1806:1;1803;1796:12;1755:2;1846:6;1833:20;1871:78;1945:3;1937:6;1930:4;1922:6;1918:17;1871:78;:::i;:::-;1862:87;;1745:210;;;;;:::o;1975:273::-;;2080:3;2073:4;2065:6;2061:17;2057:27;2047:2;;2098:1;2095;2088:12;2047:2;2138:6;2125:20;2163:79;2238:3;2230:6;2223:4;2215:6;2211:17;2163:79;:::i;:::-;2154:88;;2037:211;;;;;:::o;2254:139::-;;2338:6;2325:20;2316:29;;2354:33;2381:5;2354:33;:::i;:::-;2306:87;;;;:::o;2399:135::-;;2481:6;2468:20;2459:29;;2497:31;2522:5;2497:31;:::i;:::-;2449:85;;;;:::o;2540:262::-;;2648:2;2636:9;2627:7;2623:23;2619:32;2616:2;;;2664:1;2661;2654:12;2616:2;2707:1;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;:::i;:::-;2722:63;;2678:117;2606:196;;;;:::o;2808:407::-;;;2933:2;2921:9;2912:7;2908:23;2904:32;2901:2;;;2949:1;2946;2939:12;2901:2;2992:1;3017:53;3062:7;3053:6;3042:9;3038:22;3017:53;:::i;:::-;3007:63;;2963:117;3119:2;3145:53;3190:7;3181:6;3170:9;3166:22;3145:53;:::i;:::-;3135:63;;3090:118;2891:324;;;;;:::o;3221:552::-;;;;3363:2;3351:9;3342:7;3338:23;3334:32;3331:2;;;3379:1;3376;3369:12;3331:2;3422:1;3447:53;3492:7;3483:6;3472:9;3468:22;3447:53;:::i;:::-;3437:63;;3393:117;3549:2;3575:53;3620:7;3611:6;3600:9;3596:22;3575:53;:::i;:::-;3565:63;;3520:118;3677:2;3703:53;3748:7;3739:6;3728:9;3724:22;3703:53;:::i;:::-;3693:63;;3648:118;3321:452;;;;;:::o;3779:809::-;;;;;3947:3;3935:9;3926:7;3922:23;3918:33;3915:2;;;3964:1;3961;3954:12;3915:2;4007:1;4032:53;4077:7;4068:6;4057:9;4053:22;4032:53;:::i;:::-;4022:63;;3978:117;4134:2;4160:53;4205:7;4196:6;4185:9;4181:22;4160:53;:::i;:::-;4150:63;;4105:118;4262:2;4288:53;4333:7;4324:6;4313:9;4309:22;4288:53;:::i;:::-;4278:63;;4233:118;4418:2;4407:9;4403:18;4390:32;4449:18;4441:6;4438:30;4435:2;;;4481:1;4478;4471:12;4435:2;4509:62;4563:7;4554:6;4543:9;4539:22;4509:62;:::i;:::-;4499:72;;4361:220;3905:683;;;;;;;:::o;4594:401::-;;;4716:2;4704:9;4695:7;4691:23;4687:32;4684:2;;;4732:1;4729;4722:12;4684:2;4775:1;4800:53;4845:7;4836:6;4825:9;4821:22;4800:53;:::i;:::-;4790:63;;4746:117;4902:2;4928:50;4970:7;4961:6;4950:9;4946:22;4928:50;:::i;:::-;4918:60;;4873:115;4674:321;;;;;:::o;5001:407::-;;;5126:2;5114:9;5105:7;5101:23;5097:32;5094:2;;;5142:1;5139;5132:12;5094:2;5185:1;5210:53;5255:7;5246:6;5235:9;5231:22;5210:53;:::i;:::-;5200:63;;5156:117;5312:2;5338:53;5383:7;5374:6;5363:9;5359:22;5338:53;:::i;:::-;5328:63;;5283:118;5084:324;;;;;:::o;5414:566::-;;;;5572:2;5560:9;5551:7;5547:23;5543:32;5540:2;;;5588:1;5585;5578:12;5540:2;5659:1;5648:9;5644:17;5631:31;5689:18;5681:6;5678:30;5675:2;;;5721:1;5718;5711:12;5675:2;5757:80;5829:7;5820:6;5809:9;5805:22;5757:80;:::i;:::-;5739:98;;;;5602:245;5886:2;5912:51;5955:7;5946:6;5935:9;5931:22;5912:51;:::i;:::-;5902:61;;5857:116;5530:450;;;;;:::o;5986:256::-;;6091:2;6079:9;6070:7;6066:23;6062:32;6059:2;;;6107:1;6104;6097:12;6059:2;6150:1;6175:50;6217:7;6208:6;6197:9;6193:22;6175:50;:::i;:::-;6165:60;;6121:114;6049:193;;;;:::o;6248:260::-;;6355:2;6343:9;6334:7;6330:23;6326:32;6323:2;;;6371:1;6368;6361:12;6323:2;6414:1;6439:52;6483:7;6474:6;6463:9;6459:22;6439:52;:::i;:::-;6429:62;;6385:116;6313:195;;;;:::o;6514:282::-;;6632:2;6620:9;6611:7;6607:23;6603:32;6600:2;;;6648:1;6645;6638:12;6600:2;6691:1;6716:63;6771:7;6762:6;6751:9;6747:22;6716:63;:::i;:::-;6706:73;;6662:127;6590:206;;;;:::o;6802:375::-;;6920:2;6908:9;6899:7;6895:23;6891:32;6888:2;;;6936:1;6933;6926:12;6888:2;7007:1;6996:9;6992:17;6979:31;7037:18;7029:6;7026:30;7023:2;;;7069:1;7066;7059:12;7023:2;7097:63;7152:7;7143:6;7132:9;7128:22;7097:63;:::i;:::-;7087:73;;6950:220;6878:299;;;;:::o;7183:262::-;;7291:2;7279:9;7270:7;7266:23;7262:32;7259:2;;;7307:1;7304;7297:12;7259:2;7350:1;7375:53;7420:7;7411:6;7400:9;7396:22;7375:53;:::i;:::-;7365:63;;7321:117;7249:196;;;;:::o;7451:258::-;;7557:2;7545:9;7536:7;7532:23;7528:32;7525:2;;;7573:1;7570;7563:12;7525:2;7616:1;7641:51;7684:7;7675:6;7664:9;7660:22;7641:51;:::i;:::-;7631:61;;7587:115;7515:194;;;;:::o;7715:118::-;7802:24;7820:5;7802:24;:::i;:::-;7797:3;7790:37;7780:53;;:::o;7839:109::-;7920:21;7935:5;7920:21;:::i;:::-;7915:3;7908:34;7898:50;;:::o;7954:360::-;;8068:38;8100:5;8068:38;:::i;:::-;8122:70;8185:6;8180:3;8122:70;:::i;:::-;8115:77;;8201:52;8246:6;8241:3;8234:4;8227:5;8223:16;8201:52;:::i;:::-;8278:29;8300:6;8278:29;:::i;:::-;8273:3;8269:39;8262:46;;8044:270;;;;;:::o;8320:364::-;;8436:39;8469:5;8436:39;:::i;:::-;8491:71;8555:6;8550:3;8491:71;:::i;:::-;8484:78;;8571:52;8616:6;8611:3;8604:4;8597:5;8593:16;8571:52;:::i;:::-;8648:29;8670:6;8648:29;:::i;:::-;8643:3;8639:39;8632:46;;8412:272;;;;;:::o;8690:377::-;;8824:39;8857:5;8824:39;:::i;:::-;8879:89;8961:6;8956:3;8879:89;:::i;:::-;8872:96;;8977:52;9022:6;9017:3;9010:4;9003:5;8999:16;8977:52;:::i;:::-;9054:6;9049:3;9045:16;9038:23;;8800:267;;;;;:::o;9073:366::-;;9236:67;9300:2;9295:3;9236:67;:::i;:::-;9229:74;;9312:93;9401:3;9312:93;:::i;:::-;9430:2;9425:3;9421:12;9414:19;;9219:220;;;:::o;9445:366::-;;9608:67;9672:2;9667:3;9608:67;:::i;:::-;9601:74;;9684:93;9773:3;9684:93;:::i;:::-;9802:2;9797:3;9793:12;9786:19;;9591:220;;;:::o;9817:366::-;;9980:67;10044:2;10039:3;9980:67;:::i;:::-;9973:74;;10056:93;10145:3;10056:93;:::i;:::-;10174:2;10169:3;10165:12;10158:19;;9963:220;;;:::o;10189:366::-;;10352:67;10416:2;10411:3;10352:67;:::i;:::-;10345:74;;10428:93;10517:3;10428:93;:::i;:::-;10546:2;10541:3;10537:12;10530:19;;10335:220;;;:::o;10561:366::-;;10724:67;10788:2;10783:3;10724:67;:::i;:::-;10717:74;;10800:93;10889:3;10800:93;:::i;:::-;10918:2;10913:3;10909:12;10902:19;;10707:220;;;:::o;10933:366::-;;11096:67;11160:2;11155:3;11096:67;:::i;:::-;11089:74;;11172:93;11261:3;11172:93;:::i;:::-;11290:2;11285:3;11281:12;11274:19;;11079:220;;;:::o;11305:366::-;;11468:67;11532:2;11527:3;11468:67;:::i;:::-;11461:74;;11544:93;11633:3;11544:93;:::i;:::-;11662:2;11657:3;11653:12;11646:19;;11451:220;;;:::o;11677:366::-;;11840:67;11904:2;11899:3;11840:67;:::i;:::-;11833:74;;11916:93;12005:3;11916:93;:::i;:::-;12034:2;12029:3;12025:12;12018:19;;11823:220;;;:::o;12049:366::-;;12212:67;12276:2;12271:3;12212:67;:::i;:::-;12205:74;;12288:93;12377:3;12288:93;:::i;:::-;12406:2;12401:3;12397:12;12390:19;;12195:220;;;:::o;12421:366::-;;12584:67;12648:2;12643:3;12584:67;:::i;:::-;12577:74;;12660:93;12749:3;12660:93;:::i;:::-;12778:2;12773:3;12769:12;12762:19;;12567:220;;;:::o;12793:366::-;;12956:67;13020:2;13015:3;12956:67;:::i;:::-;12949:74;;13032:93;13121:3;13032:93;:::i;:::-;13150:2;13145:3;13141:12;13134:19;;12939:220;;;:::o;13165:366::-;;13328:67;13392:2;13387:3;13328:67;:::i;:::-;13321:74;;13404:93;13493:3;13404:93;:::i;:::-;13522:2;13517:3;13513:12;13506:19;;13311:220;;;:::o;13537:366::-;;13700:67;13764:2;13759:3;13700:67;:::i;:::-;13693:74;;13776:93;13865:3;13776:93;:::i;:::-;13894:2;13889:3;13885:12;13878:19;;13683:220;;;:::o;13909:366::-;;14072:67;14136:2;14131:3;14072:67;:::i;:::-;14065:74;;14148:93;14237:3;14148:93;:::i;:::-;14266:2;14261:3;14257:12;14250:19;;14055:220;;;:::o;14281:366::-;;14444:67;14508:2;14503:3;14444:67;:::i;:::-;14437:74;;14520:93;14609:3;14520:93;:::i;:::-;14638:2;14633:3;14629:12;14622:19;;14427:220;;;:::o;14653:366::-;;14816:67;14880:2;14875:3;14816:67;:::i;:::-;14809:74;;14892:93;14981:3;14892:93;:::i;:::-;15010:2;15005:3;15001:12;14994:19;;14799:220;;;:::o;15025:366::-;;15188:67;15252:2;15247:3;15188:67;:::i;:::-;15181:74;;15264:93;15353:3;15264:93;:::i;:::-;15382:2;15377:3;15373:12;15366:19;;15171:220;;;:::o;15397:366::-;;15560:67;15624:2;15619:3;15560:67;:::i;:::-;15553:74;;15636:93;15725:3;15636:93;:::i;:::-;15754:2;15749:3;15745:12;15738:19;;15543:220;;;:::o;15769:366::-;;15932:67;15996:2;15991:3;15932:67;:::i;:::-;15925:74;;16008:93;16097:3;16008:93;:::i;:::-;16126:2;16121:3;16117:12;16110:19;;15915:220;;;:::o;16141:366::-;;16304:67;16368:2;16363:3;16304:67;:::i;:::-;16297:74;;16380:93;16469:3;16380:93;:::i;:::-;16498:2;16493:3;16489:12;16482:19;;16287:220;;;:::o;16513:366::-;;16676:67;16740:2;16735:3;16676:67;:::i;:::-;16669:74;;16752:93;16841:3;16752:93;:::i;:::-;16870:2;16865:3;16861:12;16854:19;;16659:220;;;:::o;16885:366::-;;17048:67;17112:2;17107:3;17048:67;:::i;:::-;17041:74;;17124:93;17213:3;17124:93;:::i;:::-;17242:2;17237:3;17233:12;17226:19;;17031:220;;;:::o;17257:366::-;;17420:67;17484:2;17479:3;17420:67;:::i;:::-;17413:74;;17496:93;17585:3;17496:93;:::i;:::-;17614:2;17609:3;17605:12;17598:19;;17403:220;;;:::o;17629:118::-;17716:24;17734:5;17716:24;:::i;:::-;17711:3;17704:37;17694:53;;:::o;17753:112::-;17836:22;17852:5;17836:22;:::i;:::-;17831:3;17824:35;17814:51;;:::o;17871:435::-;;18073:95;18164:3;18155:6;18073:95;:::i;:::-;18066:102;;18185:95;18276:3;18267:6;18185:95;:::i;:::-;18178:102;;18297:3;18290:10;;18055:251;;;;;:::o;18312:222::-;;18443:2;18432:9;18428:18;18420:26;;18456:71;18524:1;18513:9;18509:17;18500:6;18456:71;:::i;:::-;18410:124;;;;:::o;18540:640::-;;18773:3;18762:9;18758:19;18750:27;;18787:71;18855:1;18844:9;18840:17;18831:6;18787:71;:::i;:::-;18868:72;18936:2;18925:9;18921:18;18912:6;18868:72;:::i;:::-;18950;19018:2;19007:9;19003:18;18994:6;18950:72;:::i;:::-;19069:9;19063:4;19059:20;19054:2;19043:9;19039:18;19032:48;19097:76;19168:4;19159:6;19097:76;:::i;:::-;19089:84;;18740:440;;;;;;;:::o;19186:210::-;;19311:2;19300:9;19296:18;19288:26;;19324:65;19386:1;19375:9;19371:17;19362:6;19324:65;:::i;:::-;19278:118;;;;:::o;19402:313::-;;19553:2;19542:9;19538:18;19530:26;;19602:9;19596:4;19592:20;19588:1;19577:9;19573:17;19566:47;19630:78;19703:4;19694:6;19630:78;:::i;:::-;19622:86;;19520:195;;;;:::o;19721:419::-;;19925:2;19914:9;19910:18;19902:26;;19974:9;19968:4;19964:20;19960:1;19949:9;19945:17;19938:47;20002:131;20128:4;20002:131;:::i;:::-;19994:139;;19892:248;;;:::o;20146:419::-;;20350:2;20339:9;20335:18;20327:26;;20399:9;20393:4;20389:20;20385:1;20374:9;20370:17;20363:47;20427:131;20553:4;20427:131;:::i;:::-;20419:139;;20317:248;;;:::o;20571:419::-;;20775:2;20764:9;20760:18;20752:26;;20824:9;20818:4;20814:20;20810:1;20799:9;20795:17;20788:47;20852:131;20978:4;20852:131;:::i;:::-;20844:139;;20742:248;;;:::o;20996:419::-;;21200:2;21189:9;21185:18;21177:26;;21249:9;21243:4;21239:20;21235:1;21224:9;21220:17;21213:47;21277:131;21403:4;21277:131;:::i;:::-;21269:139;;21167:248;;;:::o;21421:419::-;;21625:2;21614:9;21610:18;21602:26;;21674:9;21668:4;21664:20;21660:1;21649:9;21645:17;21638:47;21702:131;21828:4;21702:131;:::i;:::-;21694:139;;21592:248;;;:::o;21846:419::-;;22050:2;22039:9;22035:18;22027:26;;22099:9;22093:4;22089:20;22085:1;22074:9;22070:17;22063:47;22127:131;22253:4;22127:131;:::i;:::-;22119:139;;22017:248;;;:::o;22271:419::-;;22475:2;22464:9;22460:18;22452:26;;22524:9;22518:4;22514:20;22510:1;22499:9;22495:17;22488:47;22552:131;22678:4;22552:131;:::i;:::-;22544:139;;22442:248;;;:::o;22696:419::-;;22900:2;22889:9;22885:18;22877:26;;22949:9;22943:4;22939:20;22935:1;22924:9;22920:17;22913:47;22977:131;23103:4;22977:131;:::i;:::-;22969:139;;22867:248;;;:::o;23121:419::-;;23325:2;23314:9;23310:18;23302:26;;23374:9;23368:4;23364:20;23360:1;23349:9;23345:17;23338:47;23402:131;23528:4;23402:131;:::i;:::-;23394:139;;23292:248;;;:::o;23546:419::-;;23750:2;23739:9;23735:18;23727:26;;23799:9;23793:4;23789:20;23785:1;23774:9;23770:17;23763:47;23827:131;23953:4;23827:131;:::i;:::-;23819:139;;23717:248;;;:::o;23971:419::-;;24175:2;24164:9;24160:18;24152:26;;24224:9;24218:4;24214:20;24210:1;24199:9;24195:17;24188:47;24252:131;24378:4;24252:131;:::i;:::-;24244:139;;24142:248;;;:::o;24396:419::-;;24600:2;24589:9;24585:18;24577:26;;24649:9;24643:4;24639:20;24635:1;24624:9;24620:17;24613:47;24677:131;24803:4;24677:131;:::i;:::-;24669:139;;24567:248;;;:::o;24821:419::-;;25025:2;25014:9;25010:18;25002:26;;25074:9;25068:4;25064:20;25060:1;25049:9;25045:17;25038:47;25102:131;25228:4;25102:131;:::i;:::-;25094:139;;24992:248;;;:::o;25246:419::-;;25450:2;25439:9;25435:18;25427:26;;25499:9;25493:4;25489:20;25485:1;25474:9;25470:17;25463:47;25527:131;25653:4;25527:131;:::i;:::-;25519:139;;25417:248;;;:::o;25671:419::-;;25875:2;25864:9;25860:18;25852:26;;25924:9;25918:4;25914:20;25910:1;25899:9;25895:17;25888:47;25952:131;26078:4;25952:131;:::i;:::-;25944:139;;25842:248;;;:::o;26096:419::-;;26300:2;26289:9;26285:18;26277:26;;26349:9;26343:4;26339:20;26335:1;26324:9;26320:17;26313:47;26377:131;26503:4;26377:131;:::i;:::-;26369:139;;26267:248;;;:::o;26521:419::-;;26725:2;26714:9;26710:18;26702:26;;26774:9;26768:4;26764:20;26760:1;26749:9;26745:17;26738:47;26802:131;26928:4;26802:131;:::i;:::-;26794:139;;26692:248;;;:::o;26946:419::-;;27150:2;27139:9;27135:18;27127:26;;27199:9;27193:4;27189:20;27185:1;27174:9;27170:17;27163:47;27227:131;27353:4;27227:131;:::i;:::-;27219:139;;27117:248;;;:::o;27371:419::-;;27575:2;27564:9;27560:18;27552:26;;27624:9;27618:4;27614:20;27610:1;27599:9;27595:17;27588:47;27652:131;27778:4;27652:131;:::i;:::-;27644:139;;27542:248;;;:::o;27796:419::-;;28000:2;27989:9;27985:18;27977:26;;28049:9;28043:4;28039:20;28035:1;28024:9;28020:17;28013:47;28077:131;28203:4;28077:131;:::i;:::-;28069:139;;27967:248;;;:::o;28221:419::-;;28425:2;28414:9;28410:18;28402:26;;28474:9;28468:4;28464:20;28460:1;28449:9;28445:17;28438:47;28502:131;28628:4;28502:131;:::i;:::-;28494:139;;28392:248;;;:::o;28646:419::-;;28850:2;28839:9;28835:18;28827:26;;28899:9;28893:4;28889:20;28885:1;28874:9;28870:17;28863:47;28927:131;29053:4;28927:131;:::i;:::-;28919:139;;28817:248;;;:::o;29071:419::-;;29275:2;29264:9;29260:18;29252:26;;29324:9;29318:4;29314:20;29310:1;29299:9;29295:17;29288:47;29352:131;29478:4;29352:131;:::i;:::-;29344:139;;29242:248;;;:::o;29496:222::-;;29627:2;29616:9;29612:18;29604:26;;29640:71;29708:1;29697:9;29693:17;29684:6;29640:71;:::i;:::-;29594:124;;;;:::o;29724:214::-;;29851:2;29840:9;29836:18;29828:26;;29864:67;29928:1;29917:9;29913:17;29904:6;29864:67;:::i;:::-;29818:120;;;;:::o;29944:129::-;;30005:20;;:::i;:::-;29995:30;;30034:33;30062:4;30054:6;30034:33;:::i;:::-;29985:88;;;:::o;30079:75::-;;30145:2;30139:9;30129:19;;30119:35;:::o;30160:307::-;;30311:18;30303:6;30300:30;30297:2;;;30333:18;;:::i;:::-;30297:2;30371:29;30393:6;30371:29;:::i;:::-;30363:37;;30455:4;30449;30445:15;30437:23;;30226:241;;;:::o;30473:308::-;;30625:18;30617:6;30614:30;30611:2;;;30647:18;;:::i;:::-;30611:2;30685:29;30707:6;30685:29;:::i;:::-;30677:37;;30769:4;30763;30759:15;30751:23;;30540:241;;;:::o;30787:98::-;;30872:5;30866:12;30856:22;;30845:40;;;:::o;30891:99::-;;30977:5;30971:12;30961:22;;30950:40;;;:::o;30996:168::-;;31113:6;31108:3;31101:19;31153:4;31148:3;31144:14;31129:29;;31091:73;;;;:::o;31170:169::-;;31288:6;31283:3;31276:19;31328:4;31323:3;31319:14;31304:29;;31266:73;;;;:::o;31345:148::-;;31484:3;31469:18;;31459:34;;;;:::o;31499:305::-;;31558:20;31576:1;31558:20;:::i;:::-;31553:25;;31592:20;31610:1;31592:20;:::i;:::-;31587:25;;31746:1;31678:66;31674:74;31671:1;31668:81;31665:2;;;31752:18;;:::i;:::-;31665:2;31796:1;31793;31789:9;31782:16;;31543:261;;;;:::o;31810:185::-;;31867:20;31885:1;31867:20;:::i;:::-;31862:25;;31901:20;31919:1;31901:20;:::i;:::-;31896:25;;31940:1;31930:2;;31945:18;;:::i;:::-;31930:2;31987:1;31984;31980:9;31975:14;;31852:143;;;;:::o;32001:191::-;;32061:20;32079:1;32061:20;:::i;:::-;32056:25;;32095:20;32113:1;32095:20;:::i;:::-;32090:25;;32134:1;32131;32128:8;32125:2;;;32139:18;;:::i;:::-;32125:2;32184:1;32181;32177:9;32169:17;;32046:146;;;;:::o;32198:185::-;;32256:18;32272:1;32256:18;:::i;:::-;32251:23;;32288:18;32304:1;32288:18;:::i;:::-;32283:23;;32325:1;32322;32319:8;32316:2;;;32330:18;;:::i;:::-;32316:2;32375:1;32372;32368:9;32360:17;;32241:142;;;;:::o;32389:96::-;;32455:24;32473:5;32455:24;:::i;:::-;32444:35;;32434:51;;;:::o;32491:90::-;;32568:5;32561:13;32554:21;32543:32;;32533:48;;;:::o;32587:149::-;;32663:66;32656:5;32652:78;32641:89;;32631:105;;;:::o;32742:126::-;;32819:42;32812:5;32808:54;32797:65;;32787:81;;;:::o;32874:77::-;;32940:5;32929:16;;32919:32;;;:::o;32957:86::-;;33032:4;33025:5;33021:16;33010:27;;33000:43;;;:::o;33049:154::-;33133:6;33128:3;33123;33110:30;33195:1;33186:6;33181:3;33177:16;33170:27;33100:103;;;:::o;33209:307::-;33277:1;33287:113;33301:6;33298:1;33295:13;33287:113;;;33386:1;33381:3;33377:11;33371:18;33367:1;33362:3;33358:11;33351:39;33323:2;33320:1;33316:10;33311:15;;33287:113;;;33418:6;33415:1;33412:13;33409:2;;;33498:1;33489:6;33484:3;33480:16;33473:27;33409:2;33258:258;;;;:::o;33522:320::-;;33603:1;33597:4;33593:12;33583:22;;33650:1;33644:4;33640:12;33671:18;33661:2;;33727:4;33719:6;33715:17;33705:27;;33661:2;33789;33781:6;33778:14;33758:18;33755:38;33752:2;;;33808:18;;:::i;:::-;33752:2;33573:269;;;;:::o;33848:281::-;33931:27;33953:4;33931:27;:::i;:::-;33923:6;33919:40;34061:6;34049:10;34046:22;34025:18;34013:10;34010:34;34007:62;34004:2;;;34072:18;;:::i;:::-;34004:2;34112:10;34108:2;34101:22;33891:238;;;:::o;34135:233::-;;34197:24;34215:5;34197:24;:::i;:::-;34188:33;;34243:66;34236:5;34233:77;34230:2;;;34313:18;;:::i;:::-;34230:2;34360:1;34353:5;34349:13;34342:20;;34178:190;;;:::o;34374:176::-;;34423:20;34441:1;34423:20;:::i;:::-;34418:25;;34457:20;34475:1;34457:20;:::i;:::-;34452:25;;34496:1;34486:2;;34501:18;;:::i;:::-;34486:2;34542:1;34539;34535:9;34530:14;;34408:142;;;;:::o;34556:180::-;34604:77;34601:1;34594:88;34701:4;34698:1;34691:15;34725:4;34722:1;34715:15;34742:180;34790:77;34787:1;34780:88;34887:4;34884:1;34877:15;34911:4;34908:1;34901:15;34928:180;34976:77;34973:1;34966:88;35073:4;35070:1;35063:15;35097:4;35094:1;35087:15;35114:180;35162:77;35159:1;35152:88;35259:4;35256:1;35249:15;35283:4;35280:1;35273:15;35300:102;;35392:2;35388:7;35383:2;35376:5;35372:14;35368:28;35358:38;;35348:54;;;:::o;35408:230::-;35548:34;35544:1;35536:6;35532:14;35525:58;35617:13;35612:2;35604:6;35600:15;35593:38;35514:124;:::o;35644:237::-;35784:34;35780:1;35772:6;35768:14;35761:58;35853:20;35848:2;35840:6;35836:15;35829:45;35750:131;:::o;35887:225::-;36027:34;36023:1;36015:6;36011:14;36004:58;36096:8;36091:2;36083:6;36079:15;36072:33;35993:119;:::o;36118:182::-;36258:34;36254:1;36246:6;36242:14;36235:58;36224:76;:::o;36306:224::-;36446:34;36442:1;36434:6;36430:14;36423:58;36515:7;36510:2;36502:6;36498:15;36491:32;36412:118;:::o;36536:178::-;36676:30;36672:1;36664:6;36660:14;36653:54;36642:72;:::o;36720:223::-;36860:34;36856:1;36848:6;36844:14;36837:58;36929:6;36924:2;36916:6;36912:15;36905:31;36826:117;:::o;36949:175::-;37089:27;37085:1;37077:6;37073:14;37066:51;37055:69;:::o;37130:231::-;37270:34;37266:1;37258:6;37254:14;37247:58;37339:14;37334:2;37326:6;37322:15;37315:39;37236:125;:::o;37367:243::-;37507:34;37503:1;37495:6;37491:14;37484:58;37576:26;37571:2;37563:6;37559:15;37552:51;37473:137;:::o;37616:229::-;37756:34;37752:1;37744:6;37740:14;37733:58;37825:12;37820:2;37812:6;37808:15;37801:37;37722:123;:::o;37851:228::-;37991:34;37987:1;37979:6;37975:14;37968:58;38060:11;38055:2;38047:6;38043:15;38036:36;37957:122;:::o;38085:182::-;38225:34;38221:1;38213:6;38209:14;38202:58;38191:76;:::o;38273:231::-;38413:34;38409:1;38401:6;38397:14;38390:58;38482:14;38477:2;38469:6;38465:15;38458:39;38379:125;:::o;38510:182::-;38650:34;38646:1;38638:6;38634:14;38627:58;38616:76;:::o;38698:234::-;38838:34;38834:1;38826:6;38822:14;38815:58;38907:17;38902:2;38894:6;38890:15;38883:42;38804:128;:::o;38938:221::-;39078:34;39074:1;39066:6;39062:14;39055:58;39147:4;39142:2;39134:6;39130:15;39123:29;39044:115;:::o;39165:220::-;39305:34;39301:1;39293:6;39289:14;39282:58;39374:3;39369:2;39361:6;39357:15;39350:28;39271:114;:::o;39391:177::-;39531:29;39527:1;39519:6;39515:14;39508:53;39497:71;:::o;39574:221::-;39714:34;39710:1;39702:6;39698:14;39691:58;39783:4;39778:2;39770:6;39766:15;39759:29;39680:115;:::o;39801:236::-;39941:34;39937:1;39929:6;39925:14;39918:58;40010:19;40005:2;39997:6;39993:15;39986:44;39907:130;:::o;40043:231::-;40183:34;40179:1;40171:6;40167:14;40160:58;40252:14;40247:2;40239:6;40235:15;40228:39;40149:125;:::o;40280:174::-;40420:26;40416:1;40408:6;40404:14;40397:50;40386:68;:::o;40460:122::-;40533:24;40551:5;40533:24;:::i;:::-;40526:5;40523:35;40513:2;;40572:1;40569;40562:12;40513:2;40503:79;:::o;40588:116::-;40658:21;40673:5;40658:21;:::i;:::-;40651:5;40648:32;40638:2;;40694:1;40691;40684:12;40638:2;40628:76;:::o;40710:120::-;40782:23;40799:5;40782:23;:::i;:::-;40775:5;40772:34;40762:2;;40820:1;40817;40810:12;40762:2;40752:78;:::o;40836:122::-;40909:24;40927:5;40909:24;:::i;:::-;40902:5;40899:35;40889:2;;40948:1;40945;40938:12;40889:2;40879:79;:::o;40964:118::-;41035:22;41051:5;41035:22;:::i;:::-;41028:5;41025:33;41015:2;;41072:1;41069;41062:12;41015:2;41005:77;:::o

Swarm Source

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