ETH Price: $3,036.59 (+0.42%)
Gas: 3 Gwei

Token

Ibis Chess Club (IBIS)
 

Overview

Max Total Supply

0 IBIS

Holders

288

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
colt45.eth
Balance
1 IBIS
0x87fca5618f5e7149c9a85a568640078e8eaee19d
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:
IBISChessclub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-17
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// 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: @openzeppelin/contracts/utils/Context.sol


// 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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/utils/Address.sol


// 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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _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 || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

        _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: IBISChessclub.sol


pragma solidity ^0.8.7;

abstract contract CATS {
    function balanceOf(address owner) external virtual view returns (uint256 balance);
}

abstract contract FLS {
    function balanceOf(address owner) external virtual view returns (uint256 balance);
}

contract IBISChessclub is ERC721, Ownable {
    CATS private cats;
    FLS private fls;

    using Strings for uint256;

    address catsAdress = 0x568a1f8554Edcea5CB5F94E463ac69A9C49c0A2d;
    address flsAddress = 0xf11B3a52e636dD04aa740cC97C5813CAAb0b75d0;

    uint256 public firstPawnId = 382;
    uint256 public firstKnightId = 748;
    uint256 public firstBishopId = 1196;
    uint256 public firstRookId = 1617;
    uint256 public firstQueenId = 2053;
    uint256 public firstKingId = 2517;
    uint256 public firstSpecialId = 2967;

    uint256 public MAX_SUPPLY_PAWNS = 366;
    uint256 public MAX_SUPPLY_KNIGHTS = 448;
    uint256 public MAX_SUPPLY_BISHOPS = 421;
    uint256 public MAX_SUPPLY_ROOKS = 436;
    uint256 public MAX_SUPPLY_QUEENS = 464;
    uint256 public MAX_SUPPLY_KINGS = 450;
    uint256 public MAX_SUPPLY_SPECIAL = 175;

    uint256 public numSpecial = 0;
    uint256 public numKings = 0;
    uint256 public numQueens = 0;
    uint256 public numRooks = 0;
    uint256 public numBishops = 0;
    uint256 public numKnights = 0;
    uint256 public numPawns = 0;

    uint256 public pawnPrice =     31400000000000000;
    uint256 public knightPrice =   42000000000000000;
    uint256 public bishopPrice =   69000000000000000;
    uint256 public rookPrice =     89000000000000000;
    uint256 public queenPrice =   111100000000000000;
    uint256 public kingPrice =    130000000000000000;
    uint256 public specialPrice = 210000000000000000;

    uint256 public saleState = 0; // 0 = no sale, 1 = freemint, 2 = presale, 3 = public sale

    string private baseURI;

    bytes32 public freeMintRoot = 0x2b97f8602f78fbab8ac7bb9fef77d88b04f5c2b152c727328ced917ffae3ca13;
    bytes32 public whitelistRoot;

    mapping(address => uint256) public whiteListTx;
    mapping(address => uint256) public freemintTx;

    enum ChessPiece { Pawn, Knight, Bishop, Rook, Queen, King, Special }

    constructor() ERC721("Ibis Chess Club", "IBIS") {
        baseURI = "http://ibis.mintthepieces.com/metadata/";

        cats = CATS(catsAdress);
        fls = FLS(flsAddress);
    }

    function setSaleStatus(uint256 _saleState) external onlyOwner {  // 0 = no sale, 1 = freemint, 2 = presale, 3 = public sale
        require(_saleState >= 0 && _saleState < 4, "No such sale state");
        saleState = _saleState;
    }

    function getPiecePrices() external view returns(uint256[7] memory prices) {
        return [pawnPrice, knightPrice, bishopPrice, rookPrice, queenPrice, kingPrice, specialPrice];
    }

    function reservePieces(uint256 amount) external onlyOwner {
        uint256 nonce = 0;
        uint256 rand;
        for (uint256 i = 0; i < amount; i++) {
            rand = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, nonce))) % 100;
            if (rand < 14) {
                // pawn
                randomMintPiece(ChessPiece.Pawn, 1);
            } else if (rand < 29) {
                // knight
                randomMintPiece(ChessPiece.Knight, 1);
            } else if (rand < 44) {
                // bishop
                randomMintPiece(ChessPiece.Bishop, 1);
            } else if (rand < 60) {
                // rook
                randomMintPiece(ChessPiece.Rook, 1);
            } else if (rand < 78) {
                // queen
                randomMintPiece(ChessPiece.Queen, 1);
            } else if (rand < 93) {
                // king
                randomMintPiece(ChessPiece.King, 1);
            } else {
                // special
                randomMintPiece(ChessPiece.Special, 1);
            }
            nonce++;
        }
    }

    function setPiecePrices(uint256[] calldata prices) external onlyOwner {
        require(prices.length == 7, "Wrong number of parameters given");
        if (prices[0] > 0) {
            pawnPrice = prices[0];
        }
        if (prices[1] > 0) {
            knightPrice = prices[1];
        }
        if (prices[2] > 0) {
            bishopPrice = prices[2];
        }
        if (prices[3] > 0) {
            rookPrice = prices[3];
        }
        if (prices[4] > 0) {
            queenPrice = prices[4];
        }
        if (prices[5] > 0) {
            kingPrice = prices[5];
        }
        if (prices[6] > 0) {
            kingPrice = prices[6];
        }
    }

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

    function tokenURI(uint256 tokenId) public override view returns (string memory) {
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : "";
    }

    // set new freemint root
    function setFreeMintRoot(bytes32 _root) external onlyOwner {
        freeMintRoot = _root;
    }

    // set new whitelist root
    function setWhitelistRoot(bytes32 _root) external onlyOwner {
        whitelistRoot = _root;
    }

    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }

    // emergency claim function if someone forgets to claim their free token
    function ownerClaimToken(uint256 id) external onlyOwner {
        require(!_exists(id), "Token already exists");
        _safeMint(msg.sender, id);
    }

    function freeClaimMint(bytes32[] calldata proof, uint256[] calldata tokenIds) external {
        require(saleState == 1, "Free claim not available right now");
        require(freemintTx[msg.sender] == 0, "Already claimed your tokens");
        bytes32 node = keccak256(abi.encodePacked(msg.sender));       
        require(MerkleProof.verify(proof, freeMintRoot, node), "Address is not available for free claim mint");

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(!_exists(tokenIds[i]), "Token already claimed");
        }
        freemintTx[msg.sender] = 1;
        for (uint256 i = 0; i < tokenIds.length; i++) {
            _safeMint(msg.sender, tokenIds[i]);
        }
    }

    function whitelistMint(bytes32[] calldata proof, uint256 typeId) external payable {
        require(saleState == 2, "Whitelist minting closed");
        require(whiteListTx[msg.sender] == 0, "Already have minted during presale");
        require(hasEnoughTokensSingle(typeId), "Would exceed maximum supply of this piece");
        require(checkValueOne(typeId, msg.value), "Incorrect value sent");
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(proof, whitelistRoot, node), "Address is not on whitelist");

        whiteListTx[msg.sender] = 1;
        randomMintPiece(ChessPiece(typeId), 1);
    }

    function mintFlsCats(uint256 typeId) external payable {
        require(saleState == 2, "Whitelist minting closed");
        require(whiteListTx[msg.sender] == 0, "Already have minted during presale");
        require(hasEnoughTokensSingle(typeId), "Would exceed maximum supply of this piece");
        require(checkValueOne(typeId, msg.value), "Incorrect value sent");
        require(fls.balanceOf(msg.sender) > 0 || cats.balanceOf(msg.sender) > 0, "Address does not own a Stranger nor a Cat");

        whiteListTx[msg.sender] = 1;
        randomMintPiece(ChessPiece(typeId), 1);
    }

    function randomNumber(uint256 max, uint256 offset, uint256 nonce) private view returns(uint256) {
        uint256 rand = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, nonce))) % max + offset;
        return rand;
    }

    function randomMintPiece(ChessPiece piece, uint256 amount) private {
        uint256 index;
        uint256 nonce = 0;

        if (piece == ChessPiece.Pawn) {
            for (uint256 i = 0; i < amount; i++) {
                nonce = randomNumber(MAX_SUPPLY_PAWNS, firstPawnId, nonce);
                index = randomNumber(MAX_SUPPLY_PAWNS, firstPawnId, nonce);
                while (_exists(index)) {
                    nonce++;
                    index = randomNumber(MAX_SUPPLY_PAWNS, firstPawnId, nonce);
                }
                numPawns++;
                _safeMint(msg.sender, index);
            }
        }

        if (piece == ChessPiece.Knight) {
            for (uint256 i = 0; i < amount; i++) {
                nonce = randomNumber(MAX_SUPPLY_KNIGHTS, firstKnightId, nonce);
                index = randomNumber(MAX_SUPPLY_KNIGHTS, firstKnightId, nonce);
                while (_exists(index)) {
                    nonce++;
                    index = randomNumber(MAX_SUPPLY_KNIGHTS, firstKnightId, nonce);
                }
                numKnights++;
                _safeMint(msg.sender, index);
            }
        }

        if (piece == ChessPiece.Bishop) {
            for (uint256 i = 0; i < amount; i++) {
                nonce = randomNumber(MAX_SUPPLY_BISHOPS, firstBishopId, nonce);
                index = randomNumber(MAX_SUPPLY_BISHOPS, firstBishopId, nonce);
                while (_exists(index)) {
                    nonce++;
                    index = randomNumber(MAX_SUPPLY_BISHOPS, firstBishopId, nonce);
                }
                numBishops++;
                _safeMint(msg.sender, index);
            }
        }

        if (piece == ChessPiece.Rook) {
            for (uint256 i = 0; i < amount; i++) {
                nonce = randomNumber(MAX_SUPPLY_ROOKS, firstRookId, nonce);
                index = randomNumber(MAX_SUPPLY_ROOKS, firstRookId, nonce);
                while (_exists(index)) {
                    nonce++;
                    index = randomNumber(MAX_SUPPLY_ROOKS, firstRookId, nonce);
                }
                numRooks++;
                _safeMint(msg.sender, index);
            }
        }

        if (piece == ChessPiece.Queen) {
            for (uint256 i = 0; i < amount; i++) {
                nonce = randomNumber(MAX_SUPPLY_QUEENS, firstQueenId, nonce);
                index = randomNumber(MAX_SUPPLY_QUEENS, firstQueenId, nonce);
                while (_exists(index)) {
                    nonce++;
                    index = randomNumber(MAX_SUPPLY_QUEENS, firstQueenId, nonce);
                }
                numQueens++;
                _safeMint(msg.sender, index);
            }
        }

        if (piece == ChessPiece.King) {
            for (uint256 i = 0; i < amount; i++) {
                nonce = randomNumber(MAX_SUPPLY_KINGS, firstKingId, nonce);
                index = randomNumber(MAX_SUPPLY_KINGS, firstKingId, nonce);
                while (_exists(index)) {
                    nonce++;
                    index = randomNumber(MAX_SUPPLY_KINGS, firstKingId, nonce);
                }
                numKings++;
                _safeMint(msg.sender, index);
            }
        }

        if (piece == ChessPiece.Special) {
            for (uint256 i = 0; i < amount; i++) {
                nonce = randomNumber(MAX_SUPPLY_SPECIAL, firstSpecialId, nonce);
                index = randomNumber(MAX_SUPPLY_SPECIAL, firstSpecialId, nonce);
                while (_exists(index)) {
                    nonce++;
                    index = randomNumber(MAX_SUPPLY_SPECIAL, firstSpecialId, nonce);
                }
                numSpecial++;
                _safeMint(msg.sender, index);
            }
        }
    }

    function hasEnoughTokensMultiple(uint256[] calldata ids) private view returns(bool) {
        return ids[0] + numPawns <= MAX_SUPPLY_PAWNS
                && ids[1] + numKnights <= MAX_SUPPLY_KNIGHTS 
                && ids[2] + numBishops <= MAX_SUPPLY_BISHOPS 
                && ids[3] + numRooks <= MAX_SUPPLY_ROOKS 
                && ids[4] + numQueens <= MAX_SUPPLY_QUEENS 
                && ids[5] + numKings <= MAX_SUPPLY_KINGS
                && ids[6] + numSpecial <= MAX_SUPPLY_SPECIAL;
    }

    function hasEnoughTokensSingle(uint256 typeId) private view returns(bool) {
        if (typeId == 0) {
            return numPawns + 1 <= MAX_SUPPLY_PAWNS;
        } else if (typeId == 1) {
            return numKnights + 1 <= MAX_SUPPLY_KNIGHTS;
        } else if (typeId == 2) {
            return numBishops + 1 <= MAX_SUPPLY_BISHOPS;
        } else if (typeId == 3) {
            return numRooks + 1 <= MAX_SUPPLY_ROOKS;
        } else if (typeId == 4) {
            return numQueens + 1 <= MAX_SUPPLY_QUEENS;
        } else if (typeId == 5) {
            return numKings + 1 <= MAX_SUPPLY_KINGS;
        } else {
            return numSpecial + 1 <= MAX_SUPPLY_SPECIAL;
        }
    }

    function checkValueMultiple(uint256[] calldata ids, uint256 value) private view returns(bool) {
        uint256 price = (ids[0] * pawnPrice) + (ids[1] * knightPrice) + (ids[2] * bishopPrice) + (ids[3] * rookPrice) + (ids[4] * queenPrice) + (ids[5] * kingPrice) + (ids[6] * specialPrice);
        return price == value;
    }

    function checkValueOne(uint256 typeId, uint256 value) private view returns(bool) {
        uint256 price;

        if (typeId == 0) {
            price = pawnPrice;
        } else if (typeId == 1) {
            price = knightPrice;
        } else if (typeId == 2) {
            price = bishopPrice;
        } else if (typeId == 3) {
            price = rookPrice;
        } else if (typeId == 4) {
            price = queenPrice;
        } else if (typeId == 5) {
            price = kingPrice;
        } else {
            price = specialPrice;
        }
        
        return price == value;
    }

    function publicMint(uint256[] calldata ids) external payable {
        require(saleState == 3, "Sale currently closed");
        require(checkValueMultiple(ids, msg.value), "Incorrect value sent");
        require(hasEnoughTokensMultiple(ids), "Order will exceed max number of tokens");


        if (ids[0] > 0) {
            randomMintPiece(ChessPiece.Pawn, ids[0]);
        }

        if (ids[1] > 0) {
            randomMintPiece(ChessPiece.Knight, ids[1]);
        }

        if (ids[2] > 0) {
            randomMintPiece(ChessPiece.Bishop, ids[2]);
        }

        if (ids[3] > 0) {
            randomMintPiece(ChessPiece.Rook, ids[3]);
        }

        if (ids[4] > 0) {
            randomMintPiece(ChessPiece.Queen, ids[4]);
        }
        
        if (ids[5] > 0) {
            randomMintPiece(ChessPiece.King, ids[5]);
        }

        if (ids[6] > 0) {
            randomMintPiece(ChessPiece.Special, ids[6]);
        }
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;

        address acct = 0x88110386fC2e19C7aECb9Ed242E65d5eEd165EE0;
        address studio = 0x388CcBf8c1A37F444DcFF6eDE0014DfA85BeDC1B;

        uint256 acct_share = balance / 100 * 85;
        uint256 studio_share = balance / 100 * 15;

        payable(acct).transfer(acct_share);
        payable(studio).transfer(studio_share);
    }

    function burn(uint256 tokenId) public virtual {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

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_SUPPLY_BISHOPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_KINGS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_KNIGHTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_PAWNS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_QUEENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_ROOKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_SPECIAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bishopPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"firstBishopId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstKingId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstKnightId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstPawnId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstQueenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstRookId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstSpecialId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"freeClaimMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freemintTx","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":"getPiecePrices","outputs":[{"internalType":"uint256[7]","name":"prices","type":"uint256[7]"}],"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":"kingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"knightPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"mintFlsCats","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numBishops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numKings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numKnights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numPawns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numQueens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numRooks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numSpecial","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerClaimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pawnPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"queenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reservePieces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rookPrice","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":"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":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setFreeMintRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"name":"setPiecePrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleState","type":"uint256"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"specialPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600980546001600160a01b031990811673568a1f8554edcea5cb5f94e463ac69a9c49c0a2d17909155600a805490911673f11b3a52e636dd04aa740cc97c5813caab0b75d017905561017e600b556102ec600c556104ac600d55610651600e55610805600f556109d5601055610b9760115561016e6012556101c06013556101a56014556101b46015556101d06016556101c260175560af60185560006019819055601a819055601b819055601c819055601d819055601e819055601f819055666f8e2235f28000602055669536c70891000060215566f523226980800060225567013c31074902800060235567018ab4dc828bc0006024556701cdda4faccd00006025556702ea11e32ad500006026556027557f2b97f8602f78fbab8ac7bb9fef77d88b04f5c2b152c727328ced917ffae3ca136029553480156200014957600080fd5b50604080518082018252600f81526e24b134b99021b432b9b99021b63ab160891b6020808301918252835180850190945260048452634942495360e01b9084015281519192916200019d916000916200028f565b508051620001b39060019060208401906200028f565b505050620001d0620001ca6200023960201b60201c565b6200023d565b60405180606001604052806027815260200162003ecd60279139805162000200916028916020909101906200028f565b50600954600780546001600160a01b039283166001600160a01b031991821617909155600a546008805491909316911617905562000372565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200029d9062000335565b90600052602060002090601f016020900481019282620002c157600085556200030c565b82601f10620002dc57805160ff19168380011785556200030c565b828001600101855582156200030c579182015b828111156200030c578251825591602001919060010190620002ef565b506200031a9291506200031e565b5090565b5b808211156200031a57600081556001016200031f565b600181811c908216806200034a57607f821691505b602082108114156200036c57634e487b7160e01b600052602260045260246000fd5b50919050565b613b4b80620003826000396000f3fe6080604052600436106103b85760003560e01c806370c42575116101f2578063b9883afc1161010d578063e9097ec2116100a0578063f2fde38b1161006f578063f2fde38b14610a35578063f5aa406d14610a55578063fdc59d8414610a75578063ffdc7be514610a8b57600080fd5b8063e9097ec2146109a0578063e985e9c5146109b6578063eaefc251146109ff578063f29f15af14610a1557600080fd5b8063c203dfbc116100dc578063c203dfbc14610932578063c59226fd14610954578063c87b56dd1461096a578063e1f14c811461098a57600080fd5b8063b9883afc146108d0578063bc10cd93146108e6578063bda32703146108fc578063c1f8778b1461091c57600080fd5b80639309a3fe11610185578063a22cb46511610154578063a22cb46514610864578063a614e04814610884578063a886c3771461089a578063b88d4fde146108b057600080fd5b80639309a3fe1461081057806395d89b4114610826578063962b9d811461083b578063a044a6cc1461085157600080fd5b8063835e7055116101c1578063835e7055146107a65780638373a4fd146107c65780638da5cb5b146107dc5780638f139231146107fa57600080fd5b806370c4257514610724578063715018a61461074457806379905dfd146107595780637af88f5a1461078657600080fd5b80633ba30d6f116102e25780635245f77b116102755780636352211e116102445780636352211e146106b85780636403b48e146106d857806364ece662146106ee57806370a082311461070457600080fd5b80635245f77b1461065657806355f804b31461066c578063603f4d521461068c57806360bf0267146106a257600080fd5b806342966c68116102b157806342966c68146105f457806347a63342146106145780634d03d5821461062a57806350b7d0631461064057600080fd5b80633ba30d6f146105935780633ccfd60b146105a95780633e85d7b6146105be57806342842e0e146105d457600080fd5b8063224fe7181161035a5780632904e6d9116103295780632904e6d914610541578063324f1ad914610554578063386bfc981461056a578063389c88a11461058057600080fd5b8063224fe718146104c857806322c97a05146104de57806323b872dd1461050b578063283dc3d11461052b57600080fd5b8063081812fc11610396578063081812fc14610438578063095ea7b3146104705780630be2143c146104925780630d3986f6146104b257600080fd5b806301f150c7146103bd57806301ffc9a7146103e657806306fdde0314610416575b600080fd5b3480156103c957600080fd5b506103d3601f5481565b6040519081526020015b60405180910390f35b3480156103f257600080fd5b506104066104013660046135f1565b610aa1565b60405190151581526020016103dd565b34801561042257600080fd5b5061042b610af3565b6040516103dd91906137f5565b34801561044457600080fd5b506104586104533660046135d8565b610b85565b6040516001600160a01b0390911681526020016103dd565b34801561047c57600080fd5b5061049061048b3660046134b4565b610c12565b005b34801561049e57600080fd5b506104906104ad3660046134de565b610d28565b3480156104be57600080fd5b506103d360225481565b3480156104d457600080fd5b506103d360245481565b3480156104ea57600080fd5b506103d36104f9366004613372565b602b6020526000908152604090205481565b34801561051757600080fd5b506104906105263660046133c0565b610f94565b34801561053757600080fd5b506103d360265481565b61049061054f36600461354a565b610fc6565b34801561056057600080fd5b506103d3601a5481565b34801561057657600080fd5b506103d3602a5481565b61049061058e366004613596565b611181565b34801561059f57600080fd5b506103d360235481565b3480156105b557600080fd5b506104906113fd565b3480156105ca57600080fd5b506103d3600c5481565b3480156105e057600080fd5b506104906105ef3660046133c0565b6114f4565b34801561060057600080fd5b5061049061060f3660046135d8565b61150f565b34801561062057600080fd5b506103d3601c5481565b34801561063657600080fd5b506103d360165481565b34801561064c57600080fd5b506103d360205481565b34801561066257600080fd5b506103d360155481565b34801561067857600080fd5b5061049061068736600461362b565b611589565b34801561069857600080fd5b506103d360275481565b3480156106ae57600080fd5b506103d3600d5481565b3480156106c457600080fd5b506104586106d33660046135d8565b6115c6565b3480156106e457600080fd5b506103d360145481565b3480156106fa57600080fd5b506103d360175481565b34801561071057600080fd5b506103d361071f366004613372565b61163d565b34801561073057600080fd5b5061049061073f3660046135d8565b6116c4565b34801561075057600080fd5b506104906116f3565b34801561076557600080fd5b506103d3610774366004613372565b602c6020526000908152604090205481565b34801561079257600080fd5b506104906107a1366004613596565b611729565b3480156107b257600080fd5b506104906107c13660046135d8565b611975565b3480156107d257600080fd5b506103d360105481565b3480156107e857600080fd5b506006546001600160a01b0316610458565b34801561080657600080fd5b506103d3600b5481565b34801561081c57600080fd5b506103d360215481565b34801561083257600080fd5b5061042b611aab565b34801561084757600080fd5b506103d3601b5481565b61049061085f3660046135d8565b611aba565b34801561087057600080fd5b5061049061087f366004613478565b611d06565b34801561089057600080fd5b506103d360185481565b3480156108a657600080fd5b506103d360295481565b3480156108bc57600080fd5b506104906108cb3660046133fc565b611d11565b3480156108dc57600080fd5b506103d3601d5481565b3480156108f257600080fd5b506103d3600e5481565b34801561090857600080fd5b506104906109173660046135d8565b611d43565b34801561092857600080fd5b506103d360195481565b34801561093e57600080fd5b50610947611dc4565b6040516103dd91906137c4565b34801561096057600080fd5b506103d360125481565b34801561097657600080fd5b5061042b6109853660046135d8565b611e12565b34801561099657600080fd5b506103d3600f5481565b3480156109ac57600080fd5b506103d360135481565b3480156109c257600080fd5b506104066109d136600461338d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a0b57600080fd5b506103d3601e5481565b348015610a2157600080fd5b50610490610a303660046135d8565b611e70565b348015610a4157600080fd5b50610490610a50366004613372565b611ee4565b348015610a6157600080fd5b50610490610a703660046135d8565b611f7c565b348015610a8157600080fd5b506103d360255481565b348015610a9757600080fd5b506103d360115481565b60006001600160e01b031982166380ac58cd60e01b1480610ad257506001600160e01b03198216635b5e139f60e01b145b80610aed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610b0290613a27565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2e90613a27565b8015610b7b5780601f10610b5057610100808354040283529160200191610b7b565b820191906000526020600020905b815481529060010190602001808311610b5e57829003601f168201915b5050505050905090565b6000610b9082611fab565b610bf65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c1d826115c6565b9050806001600160a01b0316836001600160a01b03161415610c8b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bed565b336001600160a01b0382161480610ca75750610ca781336109d1565b610d195760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bed565b610d238383611fc8565b505050565b602754600114610d855760405162461bcd60e51b815260206004820152602260248201527f4672656520636c61696d206e6f7420617661696c61626c65207269676874206e6044820152616f7760f01b6064820152608401610bed565b336000908152602c602052604090205415610de25760405162461bcd60e51b815260206004820152601b60248201527f416c726561647920636c61696d656420796f757220746f6b656e7300000000006044820152606401610bed565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610e57858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506029549150849050612036565b610eb85760405162461bcd60e51b815260206004820152602c60248201527f41646472657373206973206e6f7420617661696c61626c6520666f722066726560448201526b194818db185a5b481b5a5b9d60a21b6064820152608401610bed565b60005b82811015610f3b57610ee4848483818110610ed857610ed8613ad3565b90506020020135611fab565b15610f295760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185b1c9958591e4818db185a5b5959605a1b6044820152606401610bed565b80610f3381613a62565b915050610ebb565b50336000908152602c60205260408120600190555b82811015610f8c57610f7a33858584818110610f6e57610f6e613ad3565b9050602002013561204c565b80610f8481613a62565b915050610f50565b505050505050565b610f9f335b82612066565b610fbb5760405162461bcd60e51b8152600401610bed906138bd565b610d23838383612150565b6027546002146110135760405162461bcd60e51b815260206004820152601860248201527715da1a5d195b1a5cdd081b5a5b9d1a5b99c818db1bdcd95960421b6044820152606401610bed565b336000908152602b6020526040902054156110405760405162461bcd60e51b8152600401610bed90613957565b611049816122ec565b6110655760405162461bcd60e51b8152600401610bed9061390e565b61106f81346123a4565b61108b5760405162461bcd60e51b8152600401610bed9061385a565b6040516001600160601b03193360601b16602082015260009060340160405160208183030381529060405280519060200120905061110084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050602a549150849050612036565b61114c5760405162461bcd60e51b815260206004820152601b60248201527f41646472657373206973206e6f74206f6e2077686974656c69737400000000006044820152606401610bed565b336000908152602b602052604090206001905561117b82600681111561117457611174613abd565b600161241d565b50505050565b6027546003146111cb5760405162461bcd60e51b815260206004820152601560248201527414d85b194818dd5c9c995b9d1b1e4818db1bdcd959605a1b6044820152606401610bed565b6111d68282346128d8565b6111f25760405162461bcd60e51b8152600401610bed9061385a565b6111fc8282612a33565b6112575760405162461bcd60e51b815260206004820152602660248201527f4f726465722077696c6c20657863656564206d6178206e756d626572206f6620604482015265746f6b656e7360d01b6064820152608401610bed565b60008282600081811061126c5761126c613ad3565b90506020020135111561129d5761129d60008383600081811061129157611291613ad3565b9050602002013561241d565b6000828260018181106112b2576112b2613ad3565b9050602002013511156112d7576112d760018383600181811061129157611291613ad3565b6000828260028181106112ec576112ec613ad3565b9050602002013511156113115761131160028383600281811061129157611291613ad3565b60008282600381811061132657611326613ad3565b90506020020135111561134b5761134b60038383600381811061129157611291613ad3565b60008282600481811061136057611360613ad3565b9050602002013511156113855761138560048383600481811061129157611291613ad3565b60008282600581811061139a5761139a613ad3565b9050602002013511156113bf576113bf60058383600581811061129157611291613ad3565b6000828260068181106113d4576113d4613ad3565b9050602002013511156113f9576113f960068383600681811061129157611291613ad3565b5050565b6006546001600160a01b031633146114275760405162461bcd60e51b8152600401610bed90613888565b477388110386fc2e19c7aecb9ed242e65d5eed165ee073388ccbf8c1a37f444dcff6ede0014dfa85bedc1b600061145f6064856139b1565b61146a9060556139c5565b905060006114796064866139b1565b61148490600f6139c5565b6040519091506001600160a01b0385169083156108fc029084906000818181858888f193505050501580156114bd573d6000803e3d6000fd5b506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610f8c573d6000803e3d6000fd5b610d2383838360405180602001604052806000815250611d11565b61151833610f99565b61157d5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610bed565b61158681612ba0565b50565b6006546001600160a01b031633146115b35760405162461bcd60e51b8152600401610bed90613888565b80516113f99060289060208401906131e2565b6000818152600260205260408120546001600160a01b031680610aed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bed565b60006001600160a01b0382166116a85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bed565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146116ee5760405162461bcd60e51b8152600401610bed90613888565b602955565b6006546001600160a01b0316331461171d5760405162461bcd60e51b8152600401610bed90613888565b6117276000612c3b565b565b6006546001600160a01b031633146117535760405162461bcd60e51b8152600401610bed90613888565b600781146117a35760405162461bcd60e51b815260206004820181905260248201527f57726f6e67206e756d626572206f6620706172616d657465727320676976656e6044820152606401610bed565b6000828260008181106117b8576117b8613ad3565b9050602002013511156117e657818160008181106117d8576117d8613ad3565b905060200201356020819055505b6000828260018181106117fb576117fb613ad3565b905060200201351115611828578181600181811061181b5761181b613ad3565b6020029190910135602155505b60008282600281811061183d5761183d613ad3565b90506020020135111561186a578181600281811061185d5761185d613ad3565b6020029190910135602255505b60008282600381811061187f5761187f613ad3565b9050602002013511156118ac578181600381811061189f5761189f613ad3565b6020029190910135602355505b6000828260048181106118c1576118c1613ad3565b9050602002013511156118ee57818160048181106118e1576118e1613ad3565b6020029190910135602455505b60008282600581811061190357611903613ad3565b905060200201351115611930578181600581811061192357611923613ad3565b6020029190910135602555505b60008282600681811061194557611945613ad3565b9050602002013511156113f9578181600681811061196557611965613ad3565b6020029190910135602555505050565b6006546001600160a01b0316331461199f5760405162461bcd60e51b8152600401610bed90613888565b600080805b8381101561117b57604080514260208201526001600160601b03193360601b1691810191909152605481018490526064906074016040516020818303038152906040528051906020012060001c6119fb9190613a7d565b9150600e821015611a1757611a126000600161241d565b611a8b565b601d821015611a2b57611a1260018061241d565b602c821015611a4057611a126002600161241d565b603c821015611a5557611a126003600161241d565b604e821015611a6a57611a126004600161241d565b605d821015611a7f57611a126005600161241d565b611a8b6006600161241d565b82611a9581613a62565b9350508080611aa390613a62565b9150506119a4565b606060018054610b0290613a27565b602754600214611b075760405162461bcd60e51b815260206004820152601860248201527715da1a5d195b1a5cdd081b5a5b9d1a5b99c818db1bdcd95960421b6044820152606401610bed565b336000908152602b602052604090205415611b345760405162461bcd60e51b8152600401610bed90613957565b611b3d816122ec565b611b595760405162461bcd60e51b8152600401610bed9061390e565b611b6381346123a4565b611b7f5760405162461bcd60e51b8152600401610bed9061385a565b6008546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb9190613674565b1180611c8057506007546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611c4657600080fd5b505afa158015611c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7e9190613674565b115b611cde5760405162461bcd60e51b815260206004820152602960248201527f4164647265737320646f6573206e6f74206f776e206120537472616e676572206044820152681b9bdc88184810d85d60ba1b6064820152608401610bed565b336000908152602b602052604090206001905561158681600681111561117457611174613abd565b6113f9338383612c8d565b611d1b3383612066565b611d375760405162461bcd60e51b8152600401610bed906138bd565b61117b84848484612d5c565b6006546001600160a01b03163314611d6d5760405162461bcd60e51b8152600401610bed90613888565b611d7681611fab565b15611dba5760405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606401610bed565b611586338261204c565b611dcc613266565b6040518060e00160405280602054815260200160215481526020016022548152602001602354815260200160245481526020016025548152602001602654815250905090565b6060600060288054611e2390613a27565b905011611e3f5760405180602001604052806000815250610aed565b6028611e4a83612d8f565b604051602001611e5b9291906136d5565b60405160208183030381529060405292915050565b6006546001600160a01b03163314611e9a5760405162461bcd60e51b8152600401610bed90613888565b60048110611edf5760405162461bcd60e51b81526020600482015260126024820152714e6f20737563682073616c6520737461746560701b6044820152606401610bed565b602755565b6006546001600160a01b03163314611f0e5760405162461bcd60e51b8152600401610bed90613888565b6001600160a01b038116611f735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bed565b61158681612c3b565b6006546001600160a01b03163314611fa65760405162461bcd60e51b8152600401610bed90613888565b602a55565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ffd826115c6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826120438584612e8d565b14949350505050565b6113f9828260405180602001604052806000815250612f01565b600061207182611fab565b6120d25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bed565b60006120dd836115c6565b9050806001600160a01b0316846001600160a01b031614806121185750836001600160a01b031661210d84610b85565b6001600160a01b0316145b8061214857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612163826115c6565b6001600160a01b0316146121c75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610bed565b6001600160a01b0382166122295760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bed565b612234600082611fc8565b6001600160a01b038316600090815260036020526040812080546001929061225d9084906139e4565b90915550506001600160a01b038216600090815260036020526040812080546001929061228b908490613999565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008161230c57601254601f54612304906001613999565b111592915050565b816001141561232657601354601e54612304906001613999565b816002141561234057601454601d54612304906001613999565b816003141561235a57601554601c54612304906001613999565b816004141561237457601654601b54612304906001613999565b816005141561238e57601754601a54612304906001613999565b601854601954612304906001613999565b919050565b600080836123b55750602054612414565b83600114156123c75750602154612414565b83600214156123d95750602254612414565b83600314156123eb5750602354612414565b83600414156123fd5750602454612414565b836005141561240f5750602554612414565b506026545b90911492915050565b6000808084600681111561243357612433613abd565b14156124cb5760005b838110156124c957612453601254600b5484612f34565b9150612464601254600b5484612f34565b92505b61247083611fab565b15612498578161247f81613a62565b925050612491601254600b5484612f34565b9250612467565b601f80549060006124a883613a62565b91905055506124b7338461204c565b806124c181613a62565b91505061243c565b505b60018460068111156124df576124df613abd565b14156125775760005b83811015612575576124ff601354600c5484612f34565b9150612510601354600c5484612f34565b92505b61251c83611fab565b15612544578161252b81613a62565b92505061253d601354600c5484612f34565b9250612513565b601e805490600061255483613a62565b9190505550612563338461204c565b8061256d81613a62565b9150506124e8565b505b600284600681111561258b5761258b613abd565b14156126235760005b83811015612621576125ab601454600d5484612f34565b91506125bc601454600d5484612f34565b92505b6125c883611fab565b156125f057816125d781613a62565b9250506125e9601454600d5484612f34565b92506125bf565b601d805490600061260083613a62565b919050555061260f338461204c565b8061261981613a62565b915050612594565b505b600384600681111561263757612637613abd565b14156126cf5760005b838110156126cd57612657601554600e5484612f34565b9150612668601554600e5484612f34565b92505b61267483611fab565b1561269c578161268381613a62565b925050612695601554600e5484612f34565b925061266b565b601c80549060006126ac83613a62565b91905055506126bb338461204c565b806126c581613a62565b915050612640565b505b60048460068111156126e3576126e3613abd565b141561277b5760005b8381101561277957612703601654600f5484612f34565b9150612714601654600f5484612f34565b92505b61272083611fab565b15612748578161272f81613a62565b925050612741601654600f5484612f34565b9250612717565b601b805490600061275883613a62565b9190505550612767338461204c565b8061277181613a62565b9150506126ec565b505b600584600681111561278f5761278f613abd565b14156128275760005b83811015612825576127af60175460105484612f34565b91506127c060175460105484612f34565b92505b6127cc83611fab565b156127f457816127db81613a62565b9250506127ed60175460105484612f34565b92506127c3565b601a805490600061280483613a62565b9190505550612813338461204c565b8061281d81613a62565b915050612798565b505b600684600681111561283b5761283b613abd565b141561117b5760005b838110156128d15761285b60185460115484612f34565b915061286c60185460115484612f34565b92505b61287883611fab565b156128a0578161288781613a62565b92505061289960185460115484612f34565b925061286f565b601980549060006128b083613a62565b91905055506128bf338461204c565b806128c981613a62565b915050612844565b5050505050565b600080602654858560068181106128f1576128f1613ad3565b9050602002013561290291906139c5565b6025548686600581811061291857612918613ad3565b9050602002013561292991906139c5565b6024548787600481811061293f5761293f613ad3565b9050602002013561295091906139c5565b6023548888600381811061296657612966613ad3565b9050602002013561297791906139c5565b6022548989600281811061298d5761298d613ad3565b9050602002013561299e91906139c5565b6021548a8a60018181106129b4576129b4613ad3565b905060200201356129c591906139c5565b6020548b8b60008181106129db576129db613ad3565b905060200201356129ec91906139c5565b6129f69190613999565b612a009190613999565b612a0a9190613999565b612a149190613999565b612a1e9190613999565b612a289190613999565b909214949350505050565b6000601254601f5484846000818110612a4e57612a4e613ad3565b90506020020135612a5f9190613999565b11158015612a955750601354601e5484846001818110612a8157612a81613ad3565b90506020020135612a929190613999565b11155b8015612ac95750601454601d5484846002818110612ab557612ab5613ad3565b90506020020135612ac69190613999565b11155b8015612afd5750601554601c5484846003818110612ae957612ae9613ad3565b90506020020135612afa9190613999565b11155b8015612b315750601654601b5484846004818110612b1d57612b1d613ad3565b90506020020135612b2e9190613999565b11155b8015612b655750601754601a5484846005818110612b5157612b51613ad3565b90506020020135612b629190613999565b11155b8015612b99575060185460195484846006818110612b8557612b85613ad3565b90506020020135612b969190613999565b11155b9392505050565b6000612bab826115c6565b9050612bb8600083611fc8565b6001600160a01b0381166000908152600360205260408120805460019290612be19084906139e4565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612cef5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bed565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612d67848484612150565b612d7384848484612fa2565b61117b5760405162461bcd60e51b8152600401610bed90613808565b606081612db35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ddd5780612dc781613a62565b9150612dd69050600a836139b1565b9150612db7565b60008167ffffffffffffffff811115612df857612df8613ae9565b6040519080825280601f01601f191660200182016040528015612e22576020820181803683370190505b5090505b841561214857612e376001836139e4565b9150612e44600a86613a7d565b612e4f906030613999565b60f81b818381518110612e6457612e64613ad3565b60200101906001600160f81b031916908160001a905350612e86600a866139b1565b9450612e26565b600081815b8451811015612ef9576000858281518110612eaf57612eaf613ad3565b60200260200101519050808311612ed55760008381526020829052604090209250612ee6565b600081815260208490526040902092505b5080612ef181613a62565b915050612e92565b509392505050565b612f0b83836130af565b612f186000848484612fa2565b610d235760405162461bcd60e51b8152600401610bed90613808565b6000808385423386604051602001612f6c9392919092835260609190911b6001600160601b0319166020830152603482015260540190565b6040516020818303038152906040528051906020012060001c612f8f9190613a7d565b612f999190613999565b95945050505050565b60006001600160a01b0384163b156130a457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fe6903390899088908890600401613787565b602060405180830381600087803b15801561300057600080fd5b505af1925050508015613030575060408051601f3d908101601f1916820190925261302d9181019061360e565b60015b61308a573d80801561305e576040519150601f19603f3d011682016040523d82523d6000602084013e613063565b606091505b5080516130825760405162461bcd60e51b8152600401610bed90613808565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612148565b506001949350505050565b6001600160a01b0382166131055760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bed565b61310e81611fab565b1561315b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bed565b6001600160a01b0382166000908152600360205260408120805460019290613184908490613999565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546131ee90613a27565b90600052602060002090601f0160209004810192826132105760008555613256565b82601f1061322957805160ff1916838001178555613256565b82800160010185558215613256579182015b8281111561325657825182559160200191906001019061323b565b50613262929150613284565b5090565b6040518060e001604052806007906020820280368337509192915050565b5b808211156132625760008155600101613285565b600067ffffffffffffffff808411156132b4576132b4613ae9565b604051601f8501601f19908116603f011681019082821181831017156132dc576132dc613ae9565b816040528093508581528686860111156132f557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461239f57600080fd5b60008083601f84011261333857600080fd5b50813567ffffffffffffffff81111561335057600080fd5b6020830191508360208260051b850101111561336b57600080fd5b9250929050565b60006020828403121561338457600080fd5b612b998261330f565b600080604083850312156133a057600080fd5b6133a98361330f565b91506133b76020840161330f565b90509250929050565b6000806000606084860312156133d557600080fd5b6133de8461330f565b92506133ec6020850161330f565b9150604084013590509250925092565b6000806000806080858703121561341257600080fd5b61341b8561330f565b93506134296020860161330f565b925060408501359150606085013567ffffffffffffffff81111561344c57600080fd5b8501601f8101871361345d57600080fd5b61346c87823560208401613299565b91505092959194509250565b6000806040838503121561348b57600080fd5b6134948361330f565b9150602083013580151581146134a957600080fd5b809150509250929050565b600080604083850312156134c757600080fd5b6134d08361330f565b946020939093013593505050565b600080600080604085870312156134f457600080fd5b843567ffffffffffffffff8082111561350c57600080fd5b61351888838901613326565b9096509450602087013591508082111561353157600080fd5b5061353e87828801613326565b95989497509550505050565b60008060006040848603121561355f57600080fd5b833567ffffffffffffffff81111561357657600080fd5b61358286828701613326565b909790965060209590950135949350505050565b600080602083850312156135a957600080fd5b823567ffffffffffffffff8111156135c057600080fd5b6135cc85828601613326565b90969095509350505050565b6000602082840312156135ea57600080fd5b5035919050565b60006020828403121561360357600080fd5b8135612b9981613aff565b60006020828403121561362057600080fd5b8151612b9981613aff565b60006020828403121561363d57600080fd5b813567ffffffffffffffff81111561365457600080fd5b8201601f8101841361366557600080fd5b61214884823560208401613299565b60006020828403121561368657600080fd5b5051919050565b600081518084526136a58160208601602086016139fb565b601f01601f19169290920160200192915050565b600081516136cb8185602086016139fb565b9290920192915050565b600080845481600182811c9150808316806136f157607f831692505b602080841082141561371157634e487b7160e01b86526022600452602486fd5b818015613725576001811461373657613763565b60ff19861689528489019650613763565b60008b81526020902060005b8681101561375b5781548b820152908501908301613742565b505084890196505b505050505050612f9961377682866136b9565b64173539b7b760d91b815260050190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137ba9083018461368d565b9695505050505050565b60e08101818360005b60078110156137ec5781518352602092830192909101906001016137cd565b50505092915050565b602081526000612b99602083018461368d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273125b98dbdc9c9958dd081d985b1d59481cd95b9d60621b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526029908201527f576f756c6420657863656564206d6178696d756d20737570706c79206f66207460408201526868697320706965636560b81b606082015260800190565b60208082526022908201527f416c72656164792068617665206d696e74656420647572696e672070726573616040820152616c6560f01b606082015260800190565b600082198211156139ac576139ac613a91565b500190565b6000826139c0576139c0613aa7565b500490565b60008160001904831182151516156139df576139df613a91565b500290565b6000828210156139f6576139f6613a91565b500390565b60005b83811015613a165781810151838201526020016139fe565b8381111561117b5750506000910152565b600181811c90821680613a3b57607f821691505b60208210811415613a5c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a7657613a76613a91565b5060010190565b600082613a8c57613a8c613aa7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461158657600080fdfea2646970667358221220848768562cd046fcd4763b87483568ed36ae31e484f7acc947207a373f916e8f64736f6c63430008070033687474703a2f2f696269732e6d696e747468657069656365732e636f6d2f6d657461646174612f

Deployed Bytecode

0x6080604052600436106103b85760003560e01c806370c42575116101f2578063b9883afc1161010d578063e9097ec2116100a0578063f2fde38b1161006f578063f2fde38b14610a35578063f5aa406d14610a55578063fdc59d8414610a75578063ffdc7be514610a8b57600080fd5b8063e9097ec2146109a0578063e985e9c5146109b6578063eaefc251146109ff578063f29f15af14610a1557600080fd5b8063c203dfbc116100dc578063c203dfbc14610932578063c59226fd14610954578063c87b56dd1461096a578063e1f14c811461098a57600080fd5b8063b9883afc146108d0578063bc10cd93146108e6578063bda32703146108fc578063c1f8778b1461091c57600080fd5b80639309a3fe11610185578063a22cb46511610154578063a22cb46514610864578063a614e04814610884578063a886c3771461089a578063b88d4fde146108b057600080fd5b80639309a3fe1461081057806395d89b4114610826578063962b9d811461083b578063a044a6cc1461085157600080fd5b8063835e7055116101c1578063835e7055146107a65780638373a4fd146107c65780638da5cb5b146107dc5780638f139231146107fa57600080fd5b806370c4257514610724578063715018a61461074457806379905dfd146107595780637af88f5a1461078657600080fd5b80633ba30d6f116102e25780635245f77b116102755780636352211e116102445780636352211e146106b85780636403b48e146106d857806364ece662146106ee57806370a082311461070457600080fd5b80635245f77b1461065657806355f804b31461066c578063603f4d521461068c57806360bf0267146106a257600080fd5b806342966c68116102b157806342966c68146105f457806347a63342146106145780634d03d5821461062a57806350b7d0631461064057600080fd5b80633ba30d6f146105935780633ccfd60b146105a95780633e85d7b6146105be57806342842e0e146105d457600080fd5b8063224fe7181161035a5780632904e6d9116103295780632904e6d914610541578063324f1ad914610554578063386bfc981461056a578063389c88a11461058057600080fd5b8063224fe718146104c857806322c97a05146104de57806323b872dd1461050b578063283dc3d11461052b57600080fd5b8063081812fc11610396578063081812fc14610438578063095ea7b3146104705780630be2143c146104925780630d3986f6146104b257600080fd5b806301f150c7146103bd57806301ffc9a7146103e657806306fdde0314610416575b600080fd5b3480156103c957600080fd5b506103d3601f5481565b6040519081526020015b60405180910390f35b3480156103f257600080fd5b506104066104013660046135f1565b610aa1565b60405190151581526020016103dd565b34801561042257600080fd5b5061042b610af3565b6040516103dd91906137f5565b34801561044457600080fd5b506104586104533660046135d8565b610b85565b6040516001600160a01b0390911681526020016103dd565b34801561047c57600080fd5b5061049061048b3660046134b4565b610c12565b005b34801561049e57600080fd5b506104906104ad3660046134de565b610d28565b3480156104be57600080fd5b506103d360225481565b3480156104d457600080fd5b506103d360245481565b3480156104ea57600080fd5b506103d36104f9366004613372565b602b6020526000908152604090205481565b34801561051757600080fd5b506104906105263660046133c0565b610f94565b34801561053757600080fd5b506103d360265481565b61049061054f36600461354a565b610fc6565b34801561056057600080fd5b506103d3601a5481565b34801561057657600080fd5b506103d3602a5481565b61049061058e366004613596565b611181565b34801561059f57600080fd5b506103d360235481565b3480156105b557600080fd5b506104906113fd565b3480156105ca57600080fd5b506103d3600c5481565b3480156105e057600080fd5b506104906105ef3660046133c0565b6114f4565b34801561060057600080fd5b5061049061060f3660046135d8565b61150f565b34801561062057600080fd5b506103d3601c5481565b34801561063657600080fd5b506103d360165481565b34801561064c57600080fd5b506103d360205481565b34801561066257600080fd5b506103d360155481565b34801561067857600080fd5b5061049061068736600461362b565b611589565b34801561069857600080fd5b506103d360275481565b3480156106ae57600080fd5b506103d3600d5481565b3480156106c457600080fd5b506104586106d33660046135d8565b6115c6565b3480156106e457600080fd5b506103d360145481565b3480156106fa57600080fd5b506103d360175481565b34801561071057600080fd5b506103d361071f366004613372565b61163d565b34801561073057600080fd5b5061049061073f3660046135d8565b6116c4565b34801561075057600080fd5b506104906116f3565b34801561076557600080fd5b506103d3610774366004613372565b602c6020526000908152604090205481565b34801561079257600080fd5b506104906107a1366004613596565b611729565b3480156107b257600080fd5b506104906107c13660046135d8565b611975565b3480156107d257600080fd5b506103d360105481565b3480156107e857600080fd5b506006546001600160a01b0316610458565b34801561080657600080fd5b506103d3600b5481565b34801561081c57600080fd5b506103d360215481565b34801561083257600080fd5b5061042b611aab565b34801561084757600080fd5b506103d3601b5481565b61049061085f3660046135d8565b611aba565b34801561087057600080fd5b5061049061087f366004613478565b611d06565b34801561089057600080fd5b506103d360185481565b3480156108a657600080fd5b506103d360295481565b3480156108bc57600080fd5b506104906108cb3660046133fc565b611d11565b3480156108dc57600080fd5b506103d3601d5481565b3480156108f257600080fd5b506103d3600e5481565b34801561090857600080fd5b506104906109173660046135d8565b611d43565b34801561092857600080fd5b506103d360195481565b34801561093e57600080fd5b50610947611dc4565b6040516103dd91906137c4565b34801561096057600080fd5b506103d360125481565b34801561097657600080fd5b5061042b6109853660046135d8565b611e12565b34801561099657600080fd5b506103d3600f5481565b3480156109ac57600080fd5b506103d360135481565b3480156109c257600080fd5b506104066109d136600461338d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a0b57600080fd5b506103d3601e5481565b348015610a2157600080fd5b50610490610a303660046135d8565b611e70565b348015610a4157600080fd5b50610490610a50366004613372565b611ee4565b348015610a6157600080fd5b50610490610a703660046135d8565b611f7c565b348015610a8157600080fd5b506103d360255481565b348015610a9757600080fd5b506103d360115481565b60006001600160e01b031982166380ac58cd60e01b1480610ad257506001600160e01b03198216635b5e139f60e01b145b80610aed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610b0290613a27565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2e90613a27565b8015610b7b5780601f10610b5057610100808354040283529160200191610b7b565b820191906000526020600020905b815481529060010190602001808311610b5e57829003601f168201915b5050505050905090565b6000610b9082611fab565b610bf65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c1d826115c6565b9050806001600160a01b0316836001600160a01b03161415610c8b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bed565b336001600160a01b0382161480610ca75750610ca781336109d1565b610d195760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bed565b610d238383611fc8565b505050565b602754600114610d855760405162461bcd60e51b815260206004820152602260248201527f4672656520636c61696d206e6f7420617661696c61626c65207269676874206e6044820152616f7760f01b6064820152608401610bed565b336000908152602c602052604090205415610de25760405162461bcd60e51b815260206004820152601b60248201527f416c726561647920636c61696d656420796f757220746f6b656e7300000000006044820152606401610bed565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610e57858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506029549150849050612036565b610eb85760405162461bcd60e51b815260206004820152602c60248201527f41646472657373206973206e6f7420617661696c61626c6520666f722066726560448201526b194818db185a5b481b5a5b9d60a21b6064820152608401610bed565b60005b82811015610f3b57610ee4848483818110610ed857610ed8613ad3565b90506020020135611fab565b15610f295760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185b1c9958591e4818db185a5b5959605a1b6044820152606401610bed565b80610f3381613a62565b915050610ebb565b50336000908152602c60205260408120600190555b82811015610f8c57610f7a33858584818110610f6e57610f6e613ad3565b9050602002013561204c565b80610f8481613a62565b915050610f50565b505050505050565b610f9f335b82612066565b610fbb5760405162461bcd60e51b8152600401610bed906138bd565b610d23838383612150565b6027546002146110135760405162461bcd60e51b815260206004820152601860248201527715da1a5d195b1a5cdd081b5a5b9d1a5b99c818db1bdcd95960421b6044820152606401610bed565b336000908152602b6020526040902054156110405760405162461bcd60e51b8152600401610bed90613957565b611049816122ec565b6110655760405162461bcd60e51b8152600401610bed9061390e565b61106f81346123a4565b61108b5760405162461bcd60e51b8152600401610bed9061385a565b6040516001600160601b03193360601b16602082015260009060340160405160208183030381529060405280519060200120905061110084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050602a549150849050612036565b61114c5760405162461bcd60e51b815260206004820152601b60248201527f41646472657373206973206e6f74206f6e2077686974656c69737400000000006044820152606401610bed565b336000908152602b602052604090206001905561117b82600681111561117457611174613abd565b600161241d565b50505050565b6027546003146111cb5760405162461bcd60e51b815260206004820152601560248201527414d85b194818dd5c9c995b9d1b1e4818db1bdcd959605a1b6044820152606401610bed565b6111d68282346128d8565b6111f25760405162461bcd60e51b8152600401610bed9061385a565b6111fc8282612a33565b6112575760405162461bcd60e51b815260206004820152602660248201527f4f726465722077696c6c20657863656564206d6178206e756d626572206f6620604482015265746f6b656e7360d01b6064820152608401610bed565b60008282600081811061126c5761126c613ad3565b90506020020135111561129d5761129d60008383600081811061129157611291613ad3565b9050602002013561241d565b6000828260018181106112b2576112b2613ad3565b9050602002013511156112d7576112d760018383600181811061129157611291613ad3565b6000828260028181106112ec576112ec613ad3565b9050602002013511156113115761131160028383600281811061129157611291613ad3565b60008282600381811061132657611326613ad3565b90506020020135111561134b5761134b60038383600381811061129157611291613ad3565b60008282600481811061136057611360613ad3565b9050602002013511156113855761138560048383600481811061129157611291613ad3565b60008282600581811061139a5761139a613ad3565b9050602002013511156113bf576113bf60058383600581811061129157611291613ad3565b6000828260068181106113d4576113d4613ad3565b9050602002013511156113f9576113f960068383600681811061129157611291613ad3565b5050565b6006546001600160a01b031633146114275760405162461bcd60e51b8152600401610bed90613888565b477388110386fc2e19c7aecb9ed242e65d5eed165ee073388ccbf8c1a37f444dcff6ede0014dfa85bedc1b600061145f6064856139b1565b61146a9060556139c5565b905060006114796064866139b1565b61148490600f6139c5565b6040519091506001600160a01b0385169083156108fc029084906000818181858888f193505050501580156114bd573d6000803e3d6000fd5b506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610f8c573d6000803e3d6000fd5b610d2383838360405180602001604052806000815250611d11565b61151833610f99565b61157d5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610bed565b61158681612ba0565b50565b6006546001600160a01b031633146115b35760405162461bcd60e51b8152600401610bed90613888565b80516113f99060289060208401906131e2565b6000818152600260205260408120546001600160a01b031680610aed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bed565b60006001600160a01b0382166116a85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bed565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146116ee5760405162461bcd60e51b8152600401610bed90613888565b602955565b6006546001600160a01b0316331461171d5760405162461bcd60e51b8152600401610bed90613888565b6117276000612c3b565b565b6006546001600160a01b031633146117535760405162461bcd60e51b8152600401610bed90613888565b600781146117a35760405162461bcd60e51b815260206004820181905260248201527f57726f6e67206e756d626572206f6620706172616d657465727320676976656e6044820152606401610bed565b6000828260008181106117b8576117b8613ad3565b9050602002013511156117e657818160008181106117d8576117d8613ad3565b905060200201356020819055505b6000828260018181106117fb576117fb613ad3565b905060200201351115611828578181600181811061181b5761181b613ad3565b6020029190910135602155505b60008282600281811061183d5761183d613ad3565b90506020020135111561186a578181600281811061185d5761185d613ad3565b6020029190910135602255505b60008282600381811061187f5761187f613ad3565b9050602002013511156118ac578181600381811061189f5761189f613ad3565b6020029190910135602355505b6000828260048181106118c1576118c1613ad3565b9050602002013511156118ee57818160048181106118e1576118e1613ad3565b6020029190910135602455505b60008282600581811061190357611903613ad3565b905060200201351115611930578181600581811061192357611923613ad3565b6020029190910135602555505b60008282600681811061194557611945613ad3565b9050602002013511156113f9578181600681811061196557611965613ad3565b6020029190910135602555505050565b6006546001600160a01b0316331461199f5760405162461bcd60e51b8152600401610bed90613888565b600080805b8381101561117b57604080514260208201526001600160601b03193360601b1691810191909152605481018490526064906074016040516020818303038152906040528051906020012060001c6119fb9190613a7d565b9150600e821015611a1757611a126000600161241d565b611a8b565b601d821015611a2b57611a1260018061241d565b602c821015611a4057611a126002600161241d565b603c821015611a5557611a126003600161241d565b604e821015611a6a57611a126004600161241d565b605d821015611a7f57611a126005600161241d565b611a8b6006600161241d565b82611a9581613a62565b9350508080611aa390613a62565b9150506119a4565b606060018054610b0290613a27565b602754600214611b075760405162461bcd60e51b815260206004820152601860248201527715da1a5d195b1a5cdd081b5a5b9d1a5b99c818db1bdcd95960421b6044820152606401610bed565b336000908152602b602052604090205415611b345760405162461bcd60e51b8152600401610bed90613957565b611b3d816122ec565b611b595760405162461bcd60e51b8152600401610bed9061390e565b611b6381346123a4565b611b7f5760405162461bcd60e51b8152600401610bed9061385a565b6008546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb9190613674565b1180611c8057506007546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611c4657600080fd5b505afa158015611c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7e9190613674565b115b611cde5760405162461bcd60e51b815260206004820152602960248201527f4164647265737320646f6573206e6f74206f776e206120537472616e676572206044820152681b9bdc88184810d85d60ba1b6064820152608401610bed565b336000908152602b602052604090206001905561158681600681111561117457611174613abd565b6113f9338383612c8d565b611d1b3383612066565b611d375760405162461bcd60e51b8152600401610bed906138bd565b61117b84848484612d5c565b6006546001600160a01b03163314611d6d5760405162461bcd60e51b8152600401610bed90613888565b611d7681611fab565b15611dba5760405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606401610bed565b611586338261204c565b611dcc613266565b6040518060e00160405280602054815260200160215481526020016022548152602001602354815260200160245481526020016025548152602001602654815250905090565b6060600060288054611e2390613a27565b905011611e3f5760405180602001604052806000815250610aed565b6028611e4a83612d8f565b604051602001611e5b9291906136d5565b60405160208183030381529060405292915050565b6006546001600160a01b03163314611e9a5760405162461bcd60e51b8152600401610bed90613888565b60048110611edf5760405162461bcd60e51b81526020600482015260126024820152714e6f20737563682073616c6520737461746560701b6044820152606401610bed565b602755565b6006546001600160a01b03163314611f0e5760405162461bcd60e51b8152600401610bed90613888565b6001600160a01b038116611f735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bed565b61158681612c3b565b6006546001600160a01b03163314611fa65760405162461bcd60e51b8152600401610bed90613888565b602a55565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ffd826115c6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826120438584612e8d565b14949350505050565b6113f9828260405180602001604052806000815250612f01565b600061207182611fab565b6120d25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bed565b60006120dd836115c6565b9050806001600160a01b0316846001600160a01b031614806121185750836001600160a01b031661210d84610b85565b6001600160a01b0316145b8061214857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612163826115c6565b6001600160a01b0316146121c75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610bed565b6001600160a01b0382166122295760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bed565b612234600082611fc8565b6001600160a01b038316600090815260036020526040812080546001929061225d9084906139e4565b90915550506001600160a01b038216600090815260036020526040812080546001929061228b908490613999565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008161230c57601254601f54612304906001613999565b111592915050565b816001141561232657601354601e54612304906001613999565b816002141561234057601454601d54612304906001613999565b816003141561235a57601554601c54612304906001613999565b816004141561237457601654601b54612304906001613999565b816005141561238e57601754601a54612304906001613999565b601854601954612304906001613999565b919050565b600080836123b55750602054612414565b83600114156123c75750602154612414565b83600214156123d95750602254612414565b83600314156123eb5750602354612414565b83600414156123fd5750602454612414565b836005141561240f5750602554612414565b506026545b90911492915050565b6000808084600681111561243357612433613abd565b14156124cb5760005b838110156124c957612453601254600b5484612f34565b9150612464601254600b5484612f34565b92505b61247083611fab565b15612498578161247f81613a62565b925050612491601254600b5484612f34565b9250612467565b601f80549060006124a883613a62565b91905055506124b7338461204c565b806124c181613a62565b91505061243c565b505b60018460068111156124df576124df613abd565b14156125775760005b83811015612575576124ff601354600c5484612f34565b9150612510601354600c5484612f34565b92505b61251c83611fab565b15612544578161252b81613a62565b92505061253d601354600c5484612f34565b9250612513565b601e805490600061255483613a62565b9190505550612563338461204c565b8061256d81613a62565b9150506124e8565b505b600284600681111561258b5761258b613abd565b14156126235760005b83811015612621576125ab601454600d5484612f34565b91506125bc601454600d5484612f34565b92505b6125c883611fab565b156125f057816125d781613a62565b9250506125e9601454600d5484612f34565b92506125bf565b601d805490600061260083613a62565b919050555061260f338461204c565b8061261981613a62565b915050612594565b505b600384600681111561263757612637613abd565b14156126cf5760005b838110156126cd57612657601554600e5484612f34565b9150612668601554600e5484612f34565b92505b61267483611fab565b1561269c578161268381613a62565b925050612695601554600e5484612f34565b925061266b565b601c80549060006126ac83613a62565b91905055506126bb338461204c565b806126c581613a62565b915050612640565b505b60048460068111156126e3576126e3613abd565b141561277b5760005b8381101561277957612703601654600f5484612f34565b9150612714601654600f5484612f34565b92505b61272083611fab565b15612748578161272f81613a62565b925050612741601654600f5484612f34565b9250612717565b601b805490600061275883613a62565b9190505550612767338461204c565b8061277181613a62565b9150506126ec565b505b600584600681111561278f5761278f613abd565b14156128275760005b83811015612825576127af60175460105484612f34565b91506127c060175460105484612f34565b92505b6127cc83611fab565b156127f457816127db81613a62565b9250506127ed60175460105484612f34565b92506127c3565b601a805490600061280483613a62565b9190505550612813338461204c565b8061281d81613a62565b915050612798565b505b600684600681111561283b5761283b613abd565b141561117b5760005b838110156128d15761285b60185460115484612f34565b915061286c60185460115484612f34565b92505b61287883611fab565b156128a0578161288781613a62565b92505061289960185460115484612f34565b925061286f565b601980549060006128b083613a62565b91905055506128bf338461204c565b806128c981613a62565b915050612844565b5050505050565b600080602654858560068181106128f1576128f1613ad3565b9050602002013561290291906139c5565b6025548686600581811061291857612918613ad3565b9050602002013561292991906139c5565b6024548787600481811061293f5761293f613ad3565b9050602002013561295091906139c5565b6023548888600381811061296657612966613ad3565b9050602002013561297791906139c5565b6022548989600281811061298d5761298d613ad3565b9050602002013561299e91906139c5565b6021548a8a60018181106129b4576129b4613ad3565b905060200201356129c591906139c5565b6020548b8b60008181106129db576129db613ad3565b905060200201356129ec91906139c5565b6129f69190613999565b612a009190613999565b612a0a9190613999565b612a149190613999565b612a1e9190613999565b612a289190613999565b909214949350505050565b6000601254601f5484846000818110612a4e57612a4e613ad3565b90506020020135612a5f9190613999565b11158015612a955750601354601e5484846001818110612a8157612a81613ad3565b90506020020135612a929190613999565b11155b8015612ac95750601454601d5484846002818110612ab557612ab5613ad3565b90506020020135612ac69190613999565b11155b8015612afd5750601554601c5484846003818110612ae957612ae9613ad3565b90506020020135612afa9190613999565b11155b8015612b315750601654601b5484846004818110612b1d57612b1d613ad3565b90506020020135612b2e9190613999565b11155b8015612b655750601754601a5484846005818110612b5157612b51613ad3565b90506020020135612b629190613999565b11155b8015612b99575060185460195484846006818110612b8557612b85613ad3565b90506020020135612b969190613999565b11155b9392505050565b6000612bab826115c6565b9050612bb8600083611fc8565b6001600160a01b0381166000908152600360205260408120805460019290612be19084906139e4565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612cef5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bed565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612d67848484612150565b612d7384848484612fa2565b61117b5760405162461bcd60e51b8152600401610bed90613808565b606081612db35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ddd5780612dc781613a62565b9150612dd69050600a836139b1565b9150612db7565b60008167ffffffffffffffff811115612df857612df8613ae9565b6040519080825280601f01601f191660200182016040528015612e22576020820181803683370190505b5090505b841561214857612e376001836139e4565b9150612e44600a86613a7d565b612e4f906030613999565b60f81b818381518110612e6457612e64613ad3565b60200101906001600160f81b031916908160001a905350612e86600a866139b1565b9450612e26565b600081815b8451811015612ef9576000858281518110612eaf57612eaf613ad3565b60200260200101519050808311612ed55760008381526020829052604090209250612ee6565b600081815260208490526040902092505b5080612ef181613a62565b915050612e92565b509392505050565b612f0b83836130af565b612f186000848484612fa2565b610d235760405162461bcd60e51b8152600401610bed90613808565b6000808385423386604051602001612f6c9392919092835260609190911b6001600160601b0319166020830152603482015260540190565b6040516020818303038152906040528051906020012060001c612f8f9190613a7d565b612f999190613999565b95945050505050565b60006001600160a01b0384163b156130a457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fe6903390899088908890600401613787565b602060405180830381600087803b15801561300057600080fd5b505af1925050508015613030575060408051601f3d908101601f1916820190925261302d9181019061360e565b60015b61308a573d80801561305e576040519150601f19603f3d011682016040523d82523d6000602084013e613063565b606091505b5080516130825760405162461bcd60e51b8152600401610bed90613808565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612148565b506001949350505050565b6001600160a01b0382166131055760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bed565b61310e81611fab565b1561315b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bed565b6001600160a01b0382166000908152600360205260408120805460019290613184908490613999565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546131ee90613a27565b90600052602060002090601f0160209004810192826132105760008555613256565b82601f1061322957805160ff1916838001178555613256565b82800160010185558215613256579182015b8281111561325657825182559160200191906001019061323b565b50613262929150613284565b5090565b6040518060e001604052806007906020820280368337509192915050565b5b808211156132625760008155600101613285565b600067ffffffffffffffff808411156132b4576132b4613ae9565b604051601f8501601f19908116603f011681019082821181831017156132dc576132dc613ae9565b816040528093508581528686860111156132f557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461239f57600080fd5b60008083601f84011261333857600080fd5b50813567ffffffffffffffff81111561335057600080fd5b6020830191508360208260051b850101111561336b57600080fd5b9250929050565b60006020828403121561338457600080fd5b612b998261330f565b600080604083850312156133a057600080fd5b6133a98361330f565b91506133b76020840161330f565b90509250929050565b6000806000606084860312156133d557600080fd5b6133de8461330f565b92506133ec6020850161330f565b9150604084013590509250925092565b6000806000806080858703121561341257600080fd5b61341b8561330f565b93506134296020860161330f565b925060408501359150606085013567ffffffffffffffff81111561344c57600080fd5b8501601f8101871361345d57600080fd5b61346c87823560208401613299565b91505092959194509250565b6000806040838503121561348b57600080fd5b6134948361330f565b9150602083013580151581146134a957600080fd5b809150509250929050565b600080604083850312156134c757600080fd5b6134d08361330f565b946020939093013593505050565b600080600080604085870312156134f457600080fd5b843567ffffffffffffffff8082111561350c57600080fd5b61351888838901613326565b9096509450602087013591508082111561353157600080fd5b5061353e87828801613326565b95989497509550505050565b60008060006040848603121561355f57600080fd5b833567ffffffffffffffff81111561357657600080fd5b61358286828701613326565b909790965060209590950135949350505050565b600080602083850312156135a957600080fd5b823567ffffffffffffffff8111156135c057600080fd5b6135cc85828601613326565b90969095509350505050565b6000602082840312156135ea57600080fd5b5035919050565b60006020828403121561360357600080fd5b8135612b9981613aff565b60006020828403121561362057600080fd5b8151612b9981613aff565b60006020828403121561363d57600080fd5b813567ffffffffffffffff81111561365457600080fd5b8201601f8101841361366557600080fd5b61214884823560208401613299565b60006020828403121561368657600080fd5b5051919050565b600081518084526136a58160208601602086016139fb565b601f01601f19169290920160200192915050565b600081516136cb8185602086016139fb565b9290920192915050565b600080845481600182811c9150808316806136f157607f831692505b602080841082141561371157634e487b7160e01b86526022600452602486fd5b818015613725576001811461373657613763565b60ff19861689528489019650613763565b60008b81526020902060005b8681101561375b5781548b820152908501908301613742565b505084890196505b505050505050612f9961377682866136b9565b64173539b7b760d91b815260050190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137ba9083018461368d565b9695505050505050565b60e08101818360005b60078110156137ec5781518352602092830192909101906001016137cd565b50505092915050565b602081526000612b99602083018461368d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273125b98dbdc9c9958dd081d985b1d59481cd95b9d60621b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526029908201527f576f756c6420657863656564206d6178696d756d20737570706c79206f66207460408201526868697320706965636560b81b606082015260800190565b60208082526022908201527f416c72656164792068617665206d696e74656420647572696e672070726573616040820152616c6560f01b606082015260800190565b600082198211156139ac576139ac613a91565b500190565b6000826139c0576139c0613aa7565b500490565b60008160001904831182151516156139df576139df613a91565b500290565b6000828210156139f6576139f6613a91565b500390565b60005b83811015613a165781810151838201526020016139fe565b8381111561117b5750506000910152565b600181811c90821680613a3b57607f821691505b60208210811415613a5c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613a7657613a76613a91565b5060010190565b600082613a8c57613a8c613aa7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461158657600080fdfea2646970667358221220848768562cd046fcd4763b87483568ed36ae31e484f7acc947207a373f916e8f64736f6c63430008070033

Deployed Bytecode Sourcemap

39941:15287:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41030:27;;;;;;;;;;;;;;;;;;;10532:25:1;;;10520:2;10505:18;41030:27:0;;;;;;;;26531:305;;;;;;;;;;-1:-1:-1;26531:305:0;;;;;:::i;:::-;;:::i;:::-;;;10359:14:1;;10352:22;10334:41;;10322:2;10307:18;26531:305:0;10194:187:1;27476:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29035:221::-;;;;;;;;;;-1:-1:-1;29035:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9157:32:1;;;9139:51;;9127:2;9112:18;29035:221:0;8993:203:1;28558:411:0;;;;;;;;;;-1:-1:-1;28558:411:0;;;;;:::i;:::-;;:::i;:::-;;45297:724;;;;;;;;;;-1:-1:-1;45297:724:0;;;;;:::i;:::-;;:::i;41176:48::-;;;;;;;;;;;;;;;;41286;;;;;;;;;;;;;;;;41720:46;;;;;;;;;;-1:-1:-1;41720:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;29785:339;;;;;;;;;;-1:-1:-1;29785:339:0;;;;;:::i;:::-;;:::i;41396:48::-;;;;;;;;;;;;;;;;46029:659;;;;;;:::i;:::-;;:::i;40855:27::-;;;;;;;;;;;;;;;;41683:28;;;;;;;;;;;;;;;;53603:979;;;;;;:::i;:::-;;:::i;41231:48::-;;;;;;;;;;;;;;;;54590:435;;;;;;;;;;;;;:::i;40253:34::-;;;;;;;;;;;;;;;;30195:185;;;;;;;;;;-1:-1:-1;30195:185:0;;;;;:::i;:::-;;:::i;55033:192::-;;;;;;;;;;-1:-1:-1;55033:192:0;;;;;:::i;:::-;;:::i;40924:27::-;;;;;;;;;;;;;;;;40682:38;;;;;;;;;;;;;;;;41066:48;;;;;;;;;;;;;;;;40638:37;;;;;;;;;;;;;;;;44959:88;;;;;;;;;;-1:-1:-1;44959:88:0;;;;;:::i;:::-;;:::i;41453:28::-;;;;;;;;;;;;;;;;40294:35;;;;;;;;;;;;;;;;27170:239;;;;;;;;;;-1:-1:-1;27170:239:0;;;;;:::i;:::-;;:::i;40592:39::-;;;;;;;;;;;;;;;;40727:37;;;;;;;;;;;;;;;;26900:208;;;;;;;;;;-1:-1:-1;26900:208:0;;;;;:::i;:::-;;:::i;44714:98::-;;;;;;;;;;-1:-1:-1;44714:98:0;;;;;:::i;:::-;;:::i;7152:103::-;;;;;;;;;;;;;:::i;41773:45::-;;;;;;;;;;-1:-1:-1;41773:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;43663:696;;;;;;;;;;-1:-1:-1;43663:696:0;;;;;:::i;:::-;;:::i;42536:1119::-;;;;;;;;;;-1:-1:-1;42536:1119:0;;;;;:::i;:::-;;:::i;40417:33::-;;;;;;;;;;;;;;;;6501:87;;;;;;;;;;-1:-1:-1;6574:6:0;;-1:-1:-1;;;;;6574:6:0;6501:87;;40214:32;;;;;;;;;;;;;;;;41121:48;;;;;;;;;;;;;;;;27645:104;;;;;;;;;;;;;:::i;40889:28::-;;;;;;;;;;;;;;;;46696:597;;;;;;:::i;:::-;;:::i;29328:155::-;;;;;;;;;;-1:-1:-1;29328:155:0;;;;;:::i;:::-;;:::i;40771:39::-;;;;;;;;;;;;;;;;41580:96;;;;;;;;;;;;;;;;30451:328;;;;;;;;;;-1:-1:-1;30451:328:0;;;;;:::i;:::-;;:::i;40958:29::-;;;;;;;;;;;;;;;;40336:33;;;;;;;;;;;;;;;;45133:156;;;;;;;;;;-1:-1:-1;45133:156:0;;;;;:::i;:::-;;:::i;40819:29::-;;;;;;;;;;;;;;;;42343:185;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40502:37::-;;;;;;;;;;;;;;;;44475:201;;;;;;;;;;-1:-1:-1;44475:201:0;;;;;:::i;:::-;;:::i;40376:34::-;;;;;;;;;;;;;;;;40546:39;;;;;;;;;;;;;;;;29554:164;;;;;;;;;;-1:-1:-1;29554:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29675:25:0;;;29651:4;29675:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29554:164;40994:29;;;;;;;;;;;;;;;;42097:238;;;;;;;;;;-1:-1:-1;42097:238:0;;;;;:::i;:::-;;:::i;7410:201::-;;;;;;;;;;-1:-1:-1;7410:201:0;;;;;:::i;:::-;;:::i;44851:100::-;;;;;;;;;;-1:-1:-1;44851:100:0;;;;;:::i;:::-;;:::i;41341:48::-;;;;;;;;;;;;;;;;40457:36;;;;;;;;;;;;;;;;26531:305;26633:4;-1:-1:-1;;;;;;26670:40:0;;-1:-1:-1;;;26670:40:0;;:105;;-1:-1:-1;;;;;;;26727:48:0;;-1:-1:-1;;;26727:48:0;26670:105;:158;;;-1:-1:-1;;;;;;;;;;19394:40:0;;;26792:36;26650:178;26531:305;-1:-1:-1;;26531:305:0:o;27476:100::-;27530:13;27563:5;27556:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27476:100;:::o;29035:221::-;29111:7;29139:16;29147:7;29139;:16::i;:::-;29131:73;;;;-1:-1:-1;;;29131:73:0;;18233:2:1;29131:73:0;;;18215:21:1;18272:2;18252:18;;;18245:30;18311:34;18291:18;;;18284:62;-1:-1:-1;;;18362:18:1;;;18355:42;18414:19;;29131:73:0;;;;;;;;;-1:-1:-1;29224:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29224:24:0;;29035:221::o;28558:411::-;28639:13;28655:23;28670:7;28655:14;:23::i;:::-;28639:39;;28703:5;-1:-1:-1;;;;;28697:11:0;:2;-1:-1:-1;;;;;28697:11:0;;;28689:57;;;;-1:-1:-1;;;28689:57:0;;19363:2:1;28689:57:0;;;19345:21:1;19402:2;19382:18;;;19375:30;19441:34;19421:18;;;19414:62;-1:-1:-1;;;19492:18:1;;;19485:31;19533:19;;28689:57:0;19161:397:1;28689:57:0;5305:10;-1:-1:-1;;;;;28781:21:0;;;;:62;;-1:-1:-1;28806:37:0;28823:5;5305:10;29554:164;:::i;28806:37::-;28759:168;;;;-1:-1:-1;;;28759:168:0;;16223:2:1;28759:168:0;;;16205:21:1;16262:2;16242:18;;;16235:30;16301:34;16281:18;;;16274:62;16372:26;16352:18;;;16345:54;16416:19;;28759:168:0;16021:420:1;28759:168:0;28940:21;28949:2;28953:7;28940:8;:21::i;:::-;28628:341;28558:411;;:::o;45297:724::-;45403:9;;45416:1;45403:14;45395:61;;;;-1:-1:-1;;;45395:61:0;;17830:2:1;45395:61:0;;;17812:21:1;17869:2;17849:18;;;17842:30;17908:34;17888:18;;;17881:62;-1:-1:-1;;;17959:18:1;;;17952:32;18001:19;;45395:61:0;17628:398:1;45395:61:0;45486:10;45475:22;;;;:10;:22;;;;;;:27;45467:67;;;;-1:-1:-1;;;45467:67:0;;19007:2:1;45467:67:0;;;18989:21:1;19046:2;19026:18;;;19019:30;19085:29;19065:18;;;19058:57;19132:18;;45467:67:0;18805:351:1;45467:67:0;45570:28;;-1:-1:-1;;;;;;45587:10:0;7238:2:1;7234:15;7230:53;45570:28:0;;;7218:66:1;45545:12:0;;7300::1;;45570:28:0;;;;;;;;;;;;45560:39;;;;;;45545:54;;45625:45;45644:5;;45625:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45651:12:0;;;-1:-1:-1;45665:4:0;;-1:-1:-1;45625:18:0;:45::i;:::-;45617:102;;;;-1:-1:-1;;;45617:102:0;;20112:2:1;45617:102:0;;;20094:21:1;20151:2;20131:18;;;20124:30;20190:34;20170:18;;;20163:62;-1:-1:-1;;;20241:18:1;;;20234:42;20293:19;;45617:102:0;19910:408:1;45617:102:0;45737:9;45732:128;45752:19;;;45732:128;;;45802:20;45810:8;;45819:1;45810:11;;;;;;;:::i;:::-;;;;;;;45802:7;:20::i;:::-;45801:21;45793:55;;;;-1:-1:-1;;;45793:55:0;;14751:2:1;45793:55:0;;;14733:21:1;14790:2;14770:18;;;14763:30;-1:-1:-1;;;14809:18:1;;;14802:51;14870:18;;45793:55:0;14549:345:1;45793:55:0;45773:3;;;;:::i;:::-;;;;45732:128;;;-1:-1:-1;45881:10:0;45870:22;;;;:10;:22;;;;;45895:1;45870:26;;45907:107;45927:19;;;45907:107;;;45968:34;45978:10;45990:8;;45999:1;45990:11;;;;;;;:::i;:::-;;;;;;;45968:9;:34::i;:::-;45948:3;;;;:::i;:::-;;;;45907:107;;;;45384:637;45297:724;;;;:::o;29785:339::-;29980:41;5305:10;29999:12;30013:7;29980:18;:41::i;:::-;29972:103;;;;-1:-1:-1;;;29972:103:0;;;;;;;:::i;:::-;30088:28;30098:4;30104:2;30108:7;30088:9;:28::i;46029:659::-;46130:9;;46143:1;46130:14;46122:51;;;;-1:-1:-1;;;46122:51:0;;15514:2:1;46122:51:0;;;15496:21:1;15553:2;15533:18;;;15526:30;-1:-1:-1;;;15572:18:1;;;15565:54;15636:18;;46122:51:0;15312:348:1;46122:51:0;46204:10;46192:23;;;;:11;:23;;;;;;:28;46184:75;;;;-1:-1:-1;;;46184:75:0;;;;;;;:::i;:::-;46278:29;46300:6;46278:21;:29::i;:::-;46270:83;;;;-1:-1:-1;;;46270:83:0;;;;;;;:::i;:::-;46372:32;46386:6;46394:9;46372:13;:32::i;:::-;46364:65;;;;-1:-1:-1;;;46364:65:0;;;;;;;:::i;:::-;46465:28;;-1:-1:-1;;;;;;46482:10:0;7238:2:1;7234:15;7230:53;46465:28:0;;;7218:66:1;46440:12:0;;7300::1;;46465:28:0;;;;;;;;;;;;46455:39;;;;;;46440:54;;46513:46;46532:5;;46513:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46539:13:0;;;-1:-1:-1;46554:4:0;;-1:-1:-1;46513:18:0;:46::i;:::-;46505:86;;;;-1:-1:-1;;;46505:86:0;;15867:2:1;46505:86:0;;;15849:21:1;15906:2;15886:18;;;15879:30;15945:29;15925:18;;;15918:57;15992:18;;46505:86:0;15665:351:1;46505:86:0;46616:10;46604:23;;;;:11;:23;;;;;46630:1;46604:27;;46642:38;46669:6;46658:18;;;;;;;;:::i;:::-;46678:1;46642:15;:38::i;:::-;46111:577;46029:659;;;:::o;53603:979::-;53683:9;;53696:1;53683:14;53675:48;;;;-1:-1:-1;;;53675:48:0;;12226:2:1;53675:48:0;;;12208:21:1;12265:2;12245:18;;;12238:30;-1:-1:-1;;;12284:18:1;;;12277:51;12345:18;;53675:48:0;12024:345:1;53675:48:0;53742:34;53761:3;;53766:9;53742:18;:34::i;:::-;53734:67;;;;-1:-1:-1;;;53734:67:0;;;;;;;:::i;:::-;53820:28;53844:3;;53820:23;:28::i;:::-;53812:79;;;;-1:-1:-1;;;53812:79:0;;20525:2:1;53812:79:0;;;20507:21:1;20564:2;20544:18;;;20537:30;20603:34;20583:18;;;20576:62;-1:-1:-1;;;20654:18:1;;;20647:36;20700:19;;53812:79:0;20323:402:1;53812:79:0;53919:1;53910:3;;53914:1;53910:6;;;;;;;:::i;:::-;;;;;;;:10;53906:83;;;53937:40;53953:15;53970:3;;53974:1;53970:6;;;;;;;:::i;:::-;;;;;;;53937:15;:40::i;:::-;54014:1;54005:3;;54009:1;54005:6;;;;;;;:::i;:::-;;;;;;;:10;54001:85;;;54032:42;54048:17;54067:3;;54071:1;54067:6;;;;;;;:::i;54032:42::-;54111:1;54102:3;;54106:1;54102:6;;;;;;;:::i;:::-;;;;;;;:10;54098:85;;;54129:42;54145:17;54164:3;;54168:1;54164:6;;;;;;;:::i;54129:42::-;54208:1;54199:3;;54203:1;54199:6;;;;;;;:::i;:::-;;;;;;;:10;54195:83;;;54226:40;54242:15;54259:3;;54263:1;54259:6;;;;;;;:::i;54226:40::-;54303:1;54294:3;;54298:1;54294:6;;;;;;;:::i;:::-;;;;;;;:10;54290:84;;;54321:41;54337:16;54355:3;;54359:1;54355:6;;;;;;;:::i;54321:41::-;54407:1;54398:3;;54402:1;54398:6;;;;;;;:::i;:::-;;;;;;;:10;54394:83;;;54425:40;54441:15;54458:3;;54462:1;54458:6;;;;;;;:::i;54425:40::-;54502:1;54493:3;;54497:1;54493:6;;;;;;;:::i;:::-;;;;;;;:10;54489:86;;;54520:43;54536:18;54556:3;;54560:1;54556:6;;;;;;;:::i;54520:43::-;53603:979;;:::o;54590:435::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;54656:21:::1;54705:42;54775;54638:15;54851:13;54861:3;54656:21:::0;54851:13:::1;:::i;:::-;:18;::::0;54867:2:::1;54851:18;:::i;:::-;54830:39:::0;-1:-1:-1;54880:20:0::1;54903:13;54913:3;54903:7:::0;:13:::1;:::i;:::-;:18;::::0;54919:2:::1;54903:18;:::i;:::-;54934:34;::::0;54880:41;;-1:-1:-1;;;;;;54934:22:0;::::1;::::0;:34;::::1;;;::::0;54957:10;;54934:34:::1;::::0;;;54957:10;54934:22;:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;54979:38:0::1;::::0;-1:-1:-1;;;;;54979:24:0;::::1;::::0;:38;::::1;;;::::0;55004:12;;54979:38:::1;::::0;;;55004:12;54979:24;:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;30195:185:::0;30333:39;30350:4;30356:2;30360:7;30333:39;;;;;;;;;;;;:16;:39::i;55033:192::-;55098:41;5305:10;55117:12;5225:98;55098:41;55090:102;;;;-1:-1:-1;;;55090:102:0;;22573:2:1;55090:102:0;;;22555:21:1;22612:2;22592:18;;;22585:30;22651:34;22631:18;;;22624:62;-1:-1:-1;;;22702:18:1;;;22695:46;22758:19;;55090:102:0;22371:412:1;55090:102:0;55203:14;55209:7;55203:5;:14::i;:::-;55033:192;:::o;44959:88::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;45026:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;27170:239::-:0;27242:7;27278:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27278:16:0;27313:19;27305:73;;;;-1:-1:-1;;;27305:73:0;;17059:2:1;27305:73:0;;;17041:21:1;17098:2;17078:18;;;17071:30;17137:34;17117:18;;;17110:62;-1:-1:-1;;;17188:18:1;;;17181:39;17237:19;;27305:73:0;16857:405:1;26900:208:0;26972:7;-1:-1:-1;;;;;27000:19:0;;26992:74;;;;-1:-1:-1;;;26992:74:0;;16648:2:1;26992:74:0;;;16630:21:1;16687:2;16667:18;;;16660:30;16726:34;16706:18;;;16699:62;-1:-1:-1;;;16777:18:1;;;16770:40;16827:19;;26992:74:0;16446:406:1;26992:74:0;-1:-1:-1;;;;;;27084:16:0;;;;;:9;:16;;;;;;;26900:208::o;44714:98::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;44784:12:::1;:20:::0;44714:98::o;7152:103::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;7217:30:::1;7244:1;7217:18;:30::i;:::-;7152:103::o:0;43663:696::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;43769:1:::1;43752:18:::0;::::1;43744:63;;;::::0;-1:-1:-1;;;43744:63:0;;14390:2:1;43744:63:0::1;::::0;::::1;14372:21:1::0;;;14409:18;;;14402:30;14468:34;14448:18;;;14441:62;14520:18;;43744:63:0::1;14188:356:1::0;43744:63:0::1;43834:1;43822:6;;43829:1;43822:9;;;;;;;:::i;:::-;;;;;;;:13;43818:67;;;43864:6;;43871:1;43864:9;;;;;;;:::i;:::-;;;;;;;43852;:21;;;;43818:67;43911:1;43899:6;;43906:1;43899:9;;;;;;;:::i;:::-;;;;;;;:13;43895:69;;;43943:6;;43950:1;43943:9;;;;;;;:::i;:::-;;;::::0;;;::::1;;43929:11;:23:::0;-1:-1:-1;43895:69:0::1;43990:1;43978:6;;43985:1;43978:9;;;;;;;:::i;:::-;;;;;;;:13;43974:69;;;44022:6;;44029:1;44022:9;;;;;;;:::i;:::-;;;::::0;;;::::1;;44008:11;:23:::0;-1:-1:-1;43974:69:0::1;44069:1;44057:6;;44064:1;44057:9;;;;;;;:::i;:::-;;;;;;;:13;44053:67;;;44099:6;;44106:1;44099:9;;;;;;;:::i;:::-;;;::::0;;;::::1;;44087;:21:::0;-1:-1:-1;44053:67:0::1;44146:1;44134:6;;44141:1;44134:9;;;;;;;:::i;:::-;;;;;;;:13;44130:68;;;44177:6;;44184:1;44177:9;;;;;;;:::i;:::-;;;::::0;;;::::1;;44164:10;:22:::0;-1:-1:-1;44130:68:0::1;44224:1;44212:6;;44219:1;44212:9;;;;;;;:::i;:::-;;;;;;;:13;44208:67;;;44254:6;;44261:1;44254:9;;;;;;;:::i;:::-;;;::::0;;;::::1;;44242;:21:::0;-1:-1:-1;44208:67:0::1;44301:1;44289:6;;44296:1;44289:9;;;;;;;:::i;:::-;;;;;;;:13;44285:67;;;44331:6;;44338:1;44331:9;;;;;;;:::i;:::-;;;::::0;;;::::1;;44319;:21:::0;-1:-1:-1;43663:696:0;;:::o;42536:1119::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;42605:13:::1;::::0;;42656:992:::1;42680:6;42676:1;:10;42656:992;;;42733:52;::::0;;42750:15:::1;42733:52;::::0;::::1;8814:19:1::0;-1:-1:-1;;;;;;42767:10:0::1;8871:2:1::0;8867:15;8863:53;8849:12;;;8842:75;;;;8933:12;;;8926:28;;;42790:3:0::1;::::0;8970:12:1;;42733:52:0::1;;;;;;;;;;;;42723:63;;;;;;42715:72;;:78;;;;:::i;:::-;42708:85;;42819:2;42812:4;:9;42808:807;;;42867:35;42883:15;42900:1;42867:15;:35::i;:::-;42808:807;;;42935:2;42928:4;:9;42924:691;;;42985:37;43001:17;43020:1:::0;42985:15:::1;:37::i;42924:691::-;43055:2;43048:4;:9;43044:571;;;43105:37;43121:17;43140:1;43105:15;:37::i;43044:571::-;43175:2;43168:4;:9;43164:451;;;43223:35;43239:15;43256:1;43223:15;:35::i;43164:451::-;43291:2;43284:4;:9;43280:335;;;43340:36;43356:16;43374:1;43340:15;:36::i;43280:335::-;43409:2;43402:4;:9;43398:217;;;43457:35;43473:15;43490:1;43457:15;:35::i;43398:217::-;43561:38;43577:18;43597:1;43561:15;:38::i;:::-;43629:7:::0;::::1;::::0;::::1;:::i;:::-;;;;42688:3;;;;;:::i;:::-;;;;42656:992;;27645:104:::0;27701:13;27734:7;27727:14;;;;;:::i;46696:597::-;46769:9;;46782:1;46769:14;46761:51;;;;-1:-1:-1;;;46761:51:0;;15514:2:1;46761:51:0;;;15496:21:1;15553:2;15533:18;;;15526:30;-1:-1:-1;;;15572:18:1;;;15565:54;15636:18;;46761:51:0;15312:348:1;46761:51:0;46843:10;46831:23;;;;:11;:23;;;;;;:28;46823:75;;;;-1:-1:-1;;;46823:75:0;;;;;;;:::i;:::-;46917:29;46939:6;46917:21;:29::i;:::-;46909:83;;;;-1:-1:-1;;;46909:83:0;;;;;;;:::i;:::-;47011:32;47025:6;47033:9;47011:13;:32::i;:::-;47003:65;;;;-1:-1:-1;;;47003:65:0;;;;;;;:::i;:::-;47087:3;;:25;;-1:-1:-1;;;47087:25:0;;47101:10;47087:25;;;9139:51:1;47115:1:0;;-1:-1:-1;;;;;47087:3:0;;:13;;9112:18:1;;47087:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;:63;;;-1:-1:-1;47120:4:0;;:26;;-1:-1:-1;;;47120:26:0;;47135:10;47120:26;;;9139:51:1;47149:1:0;;-1:-1:-1;;;;;47120:4:0;;:14;;9112:18:1;;47120:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;47087:63;47079:117;;;;-1:-1:-1;;;47079:117:0;;21760:2:1;47079:117:0;;;21742:21:1;21799:2;21779:18;;;21772:30;21838:34;21818:18;;;21811:62;-1:-1:-1;;;21889:18:1;;;21882:39;21938:19;;47079:117:0;21558:405:1;47079:117:0;47221:10;47209:23;;;;:11;:23;;;;;47235:1;47209:27;;47247:38;47274:6;47263:18;;;;;;;;:::i;29328:155::-;29423:52;5305:10;29456:8;29466;29423:18;:52::i;30451:328::-;30626:41;5305:10;30659:7;30626:18;:41::i;:::-;30618:103;;;;-1:-1:-1;;;30618:103:0;;;;;;;:::i;:::-;30732:39;30746:4;30752:2;30756:7;30765:5;30732:13;:39::i;45133:156::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;45209:11:::1;45217:2;45209:7;:11::i;:::-;45208:12;45200:45;;;::::0;-1:-1:-1;;;45200:45:0;;12933:2:1;45200:45:0::1;::::0;::::1;12915:21:1::0;12972:2;12952:18;;;12945:30;-1:-1:-1;;;12991:18:1;;;12984:50;13051:18;;45200:45:0::1;12731:344:1::0;45200:45:0::1;45256:25;45266:10;45278:2;45256:9;:25::i;42343:185::-:0;42391:24;;:::i;:::-;42428:92;;;;;;;;42436:9;;42428:92;;;;42447:11;;42428:92;;;;42460:11;;42428:92;;;;42473:9;;42428:92;;;;42484:10;;42428:92;;;;42496:9;;42428:92;;;;42507:12;;42428:92;;;;;42343:185;:::o;44475:201::-;44540:13;44597:1;44579:7;44573:21;;;;;:::i;:::-;;;:25;:95;;;;;;;;;;;;;;;;;44625:7;44634:18;:7;:16;:18::i;:::-;44608:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44566:102;44475:201;-1:-1:-1;;44475:201:0:o;42097:238::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;42270:1:::1;42257:10;:14;42230:64;;;::::0;-1:-1:-1;;;42230:64:0;;19765:2:1;42230:64:0::1;::::0;::::1;19747:21:1::0;19804:2;19784:18;;;19777:30;-1:-1:-1;;;19823:18:1;;;19816:48;19881:18;;42230:64:0::1;19563:342:1::0;42230:64:0::1;42305:9;:22:::0;42097:238::o;7410:201::-;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7499:22:0;::::1;7491:73;;;::::0;-1:-1:-1;;;7491:73:0;;11413:2:1;7491:73:0::1;::::0;::::1;11395:21:1::0;11452:2;11432:18;;;11425:30;11491:34;11471:18;;;11464:62;-1:-1:-1;;;11542:18:1;;;11535:36;11588:19;;7491:73:0::1;11211:402:1::0;7491:73:0::1;7575:28;7594:8;7575:18;:28::i;44851:100::-:0;6574:6;;-1:-1:-1;;;;;6574:6:0;5305:10;6721:23;6713:68;;;;-1:-1:-1;;;6713:68:0;;;;;;;:::i;:::-;44922:13:::1;:21:::0;44851:100::o;32289:127::-;32354:4;32378:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32378:16:0;:30;;;32289:127::o;36435:174::-;36510:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36510:29:0;-1:-1:-1;;;;;36510:29:0;;;;;;;;:24;;36564:23;36510:24;36564:14;:23::i;:::-;-1:-1:-1;;;;;36555:46:0;;;;;;;;;;;36435:174;;:::o;956:190::-;1081:4;1134;1105:25;1118:5;1125:4;1105:12;:25::i;:::-;:33;;956:190;-1:-1:-1;;;;956:190:0:o;33273:110::-;33349:26;33359:2;33363:7;33349:26;;;;;;;;;;;;:9;:26::i;32583:348::-;32676:4;32701:16;32709:7;32701;:16::i;:::-;32693:73;;;;-1:-1:-1;;;32693:73:0;;15101:2:1;32693:73:0;;;15083:21:1;15140:2;15120:18;;;15113:30;15179:34;15159:18;;;15152:62;-1:-1:-1;;;15230:18:1;;;15223:42;15282:19;;32693:73:0;14899:408:1;32693:73:0;32777:13;32793:23;32808:7;32793:14;:23::i;:::-;32777:39;;32846:5;-1:-1:-1;;;;;32835:16:0;:7;-1:-1:-1;;;;;32835:16:0;;:51;;;;32879:7;-1:-1:-1;;;;;32855:31:0;:20;32867:7;32855:11;:20::i;:::-;-1:-1:-1;;;;;32855:31:0;;32835:51;:87;;;-1:-1:-1;;;;;;29675:25:0;;;29651:4;29675:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32890:32;32827:96;32583:348;-1:-1:-1;;;;32583:348:0:o;35692:625::-;35851:4;-1:-1:-1;;;;;35824:31:0;:23;35839:7;35824:14;:23::i;:::-;-1:-1:-1;;;;;35824:31:0;;35816:81;;;;-1:-1:-1;;;35816:81:0;;11820:2:1;35816:81:0;;;11802:21:1;11859:2;11839:18;;;11832:30;11898:34;11878:18;;;11871:62;-1:-1:-1;;;11949:18:1;;;11942:35;11994:19;;35816:81:0;11618:401:1;35816:81:0;-1:-1:-1;;;;;35916:16:0;;35908:65;;;;-1:-1:-1;;;35908:65:0;;13282:2:1;35908:65:0;;;13264:21:1;13321:2;13301:18;;;13294:30;13360:34;13340:18;;;13333:62;-1:-1:-1;;;13411:18:1;;;13404:34;13455:19;;35908:65:0;13080:400:1;35908:65:0;36090:29;36107:1;36111:7;36090:8;:29::i;:::-;-1:-1:-1;;;;;36132:15:0;;;;;;:9;:15;;;;;:20;;36151:1;;36132:15;:20;;36151:1;;36132:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36163:13:0;;;;;;:9;:13;;;;;:18;;36180:1;;36163:13;:18;;36180:1;;36163:18;:::i;:::-;;;;-1:-1:-1;;36192:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36192:21:0;-1:-1:-1;;;;;36192:21:0;;;;;;;;;36231:27;;36192:16;;36231:27;;;;;;;28628:341;28558:411;;:::o;51925:706::-;51993:4;52014:11;52010:614;;52065:16;;52049:8;;:12;;52060:1;52049:12;:::i;:::-;:32;;;51925:706;-1:-1:-1;;51925:706:0:o;52010:614::-;52103:6;52113:1;52103:11;52099:525;;;52156:18;;52138:10;;:14;;52151:1;52138:14;:::i;52099:525::-;52196:6;52206:1;52196:11;52192:432;;;52249:18;;52231:10;;:14;;52244:1;52231:14;:::i;52192:432::-;52289:6;52299:1;52289:11;52285:339;;;52340:16;;52324:8;;:12;;52335:1;52324:12;:::i;52285:339::-;52378:6;52388:1;52378:11;52374:250;;;52430:17;;52413:9;;:13;;52425:1;52413:13;:::i;52374:250::-;52469:6;52479:1;52469:11;52465:159;;;52520:16;;52504:8;;:12;;52515:1;52504:12;:::i;52465:159::-;52594:18;;52576:10;;:14;;52589:1;52576:14;:::i;52465:159::-;51925:706;;;:::o;52974:621::-;53049:4;;53096:11;53092:454;;-1:-1:-1;53132:9:0;;53092:454;;;53163:6;53173:1;53163:11;53159:387;;;-1:-1:-1;53199:11:0;;53159:387;;;53232:6;53242:1;53232:11;53228:318;;;-1:-1:-1;53268:11:0;;53228:318;;;53301:6;53311:1;53301:11;53297:249;;;-1:-1:-1;53337:9:0;;53297:249;;;53368:6;53378:1;53368:11;53364:182;;;-1:-1:-1;53404:10:0;;53364:182;;;53436:6;53446:1;53436:11;53432:114;;;-1:-1:-1;53472:9:0;;53432:114;;;-1:-1:-1;53522:12:0;;53432:114;53573:14;;;;52974:621;-1:-1:-1;;52974:621:0:o;47548:3848::-;47626:13;;;47684:5;:24;;;;;;;;:::i;:::-;;47680:511;;;47730:9;47725:455;47749:6;47745:1;:10;47725:455;;;47789:50;47802:16;;47820:11;;47833:5;47789:12;:50::i;:::-;47781:58;;47866:50;47879:16;;47897:11;;47910:5;47866:12;:50::i;:::-;47858:58;;47935:154;47942:14;47950:5;47942:7;:14::i;:::-;47935:154;;;47981:7;;;;:::i;:::-;;;;48019:50;48032:16;;48050:11;;48063:5;48019:12;:50::i;:::-;48011:58;;47935:154;;;48107:8;:10;;;:8;:10;;;:::i;:::-;;;;;;48136:28;48146:10;48158:5;48136:9;:28::i;:::-;47757:3;;;;:::i;:::-;;;;47725:455;;;;47680:511;48216:17;48207:5;:26;;;;;;;;:::i;:::-;;48203:527;;;48255:9;48250:469;48274:6;48270:1;:10;48250:469;;;48314:54;48327:18;;48347:13;;48362:5;48314:12;:54::i;:::-;48306:62;;48395:54;48408:18;;48428:13;;48443:5;48395:12;:54::i;:::-;48387:62;;48468:158;48475:14;48483:5;48475:7;:14::i;:::-;48468:158;;;48514:7;;;;:::i;:::-;;;;48552:54;48565:18;;48585:13;;48600:5;48552:12;:54::i;:::-;48544:62;;48468:158;;;48644:10;:12;;;:10;:12;;;:::i;:::-;;;;;;48675:28;48685:10;48697:5;48675:9;:28::i;:::-;48282:3;;;;:::i;:::-;;;;48250:469;;;;48203:527;48755:17;48746:5;:26;;;;;;;;:::i;:::-;;48742:527;;;48794:9;48789:469;48813:6;48809:1;:10;48789:469;;;48853:54;48866:18;;48886:13;;48901:5;48853:12;:54::i;:::-;48845:62;;48934:54;48947:18;;48967:13;;48982:5;48934:12;:54::i;:::-;48926:62;;49007:158;49014:14;49022:5;49014:7;:14::i;:::-;49007:158;;;49053:7;;;;:::i;:::-;;;;49091:54;49104:18;;49124:13;;49139:5;49091:12;:54::i;:::-;49083:62;;49007:158;;;49183:10;:12;;;:10;:12;;;:::i;:::-;;;;;;49214:28;49224:10;49236:5;49214:9;:28::i;:::-;48821:3;;;;:::i;:::-;;;;48789:469;;;;48742:527;49294:15;49285:5;:24;;;;;;;;:::i;:::-;;49281:511;;;49331:9;49326:455;49350:6;49346:1;:10;49326:455;;;49390:50;49403:16;;49421:11;;49434:5;49390:12;:50::i;:::-;49382:58;;49467:50;49480:16;;49498:11;;49511:5;49467:12;:50::i;:::-;49459:58;;49536:154;49543:14;49551:5;49543:7;:14::i;:::-;49536:154;;;49582:7;;;;:::i;:::-;;;;49620:50;49633:16;;49651:11;;49664:5;49620:12;:50::i;:::-;49612:58;;49536:154;;;49708:8;:10;;;:8;:10;;;:::i;:::-;;;;;;49737:28;49747:10;49759:5;49737:9;:28::i;:::-;49358:3;;;;:::i;:::-;;;;49326:455;;;;49281:511;49817:16;49808:5;:25;;;;;;;;:::i;:::-;;49804:519;;;49855:9;49850:462;49874:6;49870:1;:10;49850:462;;;49914:52;49927:17;;49946:12;;49960:5;49914:12;:52::i;:::-;49906:60;;49993:52;50006:17;;50025:12;;50039:5;49993:12;:52::i;:::-;49985:60;;50064:156;50071:14;50079:5;50071:7;:14::i;:::-;50064:156;;;50110:7;;;;:::i;:::-;;;;50148:52;50161:17;;50180:12;;50194:5;50148:12;:52::i;:::-;50140:60;;50064:156;;;50238:9;:11;;;:9;:11;;;:::i;:::-;;;;;;50268:28;50278:10;50290:5;50268:9;:28::i;:::-;49882:3;;;;:::i;:::-;;;;49850:462;;;;49804:519;50348:15;50339:5;:24;;;;;;;;:::i;:::-;;50335:511;;;50385:9;50380:455;50404:6;50400:1;:10;50380:455;;;50444:50;50457:16;;50475:11;;50488:5;50444:12;:50::i;:::-;50436:58;;50521:50;50534:16;;50552:11;;50565:5;50521:12;:50::i;:::-;50513:58;;50590:154;50597:14;50605:5;50597:7;:14::i;:::-;50590:154;;;50636:7;;;;:::i;:::-;;;;50674:50;50687:16;;50705:11;;50718:5;50674:12;:50::i;:::-;50666:58;;50590:154;;;50762:8;:10;;;:8;:10;;;:::i;:::-;;;;;;50791:28;50801:10;50813:5;50791:9;:28::i;:::-;50412:3;;;;:::i;:::-;;;;50380:455;;;;50335:511;50871:18;50862:5;:27;;;;;;;;:::i;:::-;;50858:531;;;50911:9;50906:472;50930:6;50926:1;:10;50906:472;;;50970:55;50983:18;;51003:14;;51019:5;50970:12;:55::i;:::-;50962:63;;51052:55;51065:18;;51085:14;;51101:5;51052:12;:55::i;:::-;51044:63;;51126:159;51133:14;51141:5;51133:7;:14::i;:::-;51126:159;;;51172:7;;;;:::i;:::-;;;;51210:55;51223:18;;51243:14;;51259:5;51210:12;:55::i;:::-;51202:63;;51126:159;;;51303:10;:12;;;:10;:12;;;:::i;:::-;;;;;;51334:28;51344:10;51356:5;51334:9;:28::i;:::-;50938:3;;;;:::i;:::-;;;;50906:472;;;;47615:3781;;47548:3848;;:::o;52639:327::-;52727:4;52744:13;52913:12;;52904:3;;52908:1;52904:6;;;;;;;:::i;:::-;;;;;;;:21;;;;:::i;:::-;52890:9;;52881:3;;52885:1;52881:6;;;;;;;:::i;:::-;;;;;;;:18;;;;:::i;:::-;52866:10;;52857:3;;52861:1;52857:6;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;52843:9;;52834:3;;52838:1;52834:6;;;;;;;:::i;:::-;;;;;;;:18;;;;:::i;:::-;52818:11;;52809:3;;52813:1;52809:6;;;;;;;:::i;:::-;;;;;;;:20;;;;:::i;:::-;52793:11;;52784:3;;52788:1;52784:6;;;;;;;:::i;:::-;;;;;;;:20;;;;:::i;:::-;52770:9;;52761:3;;52765:1;52761:6;;;;;;;:::i;:::-;;;;;;;:18;;;;:::i;:::-;52760:45;;;;:::i;:::-;:70;;;;:::i;:::-;:93;;;;:::i;:::-;:117;;;;:::i;:::-;:140;;;;:::i;:::-;:166;;;;:::i;:::-;52944:14;;;;52639:327;-1:-1:-1;;;;52639:327:0:o;51404:513::-;51482:4;51527:16;;51515:8;;51506:3;;51510:1;51506:6;;;;;;;:::i;:::-;;;;;;;:17;;;;:::i;:::-;:37;;:99;;;;;51587:18;;51573:10;;51564:3;;51568:1;51564:6;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;:41;;51506:99;:162;;;;;51650:18;;51636:10;;51627:3;;51631:1;51627:6;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;:41;;51506:162;:221;;;;;51711:16;;51699:8;;51690:3;;51694:1;51690:6;;;;;;;:::i;:::-;;;;;;;:17;;;;:::i;:::-;:37;;51506:221;:282;;;;;51771:17;;51758:9;;51749:3;;51753:1;51749:6;;;;;;;:::i;:::-;;;;;;;:18;;;;:::i;:::-;:39;;51506:282;:341;;;;;51831:16;;51819:8;;51810:3;;51814:1;51810:6;;;;;;;:::i;:::-;;;;;;;:17;;;;:::i;:::-;:37;;51506:341;:403;;;;;51891:18;;51877:10;;51868:3;;51872:1;51868:6;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;:41;;51506:403;51499:410;51404:513;-1:-1:-1;;;51404:513:0:o;34935:420::-;34995:13;35011:23;35026:7;35011:14;:23::i;:::-;34995:39;;35136:29;35153:1;35157:7;35136:8;:29::i;:::-;-1:-1:-1;;;;;35178:16:0;;;;;;:9;:16;;;;;:21;;35198:1;;35178:16;:21;;35198:1;;35178:21;:::i;:::-;;;;-1:-1:-1;;35217:16:0;;;;:7;:16;;;;;;35210:23;;-1:-1:-1;;;;;;35210:23:0;;;35251:36;35225:7;;35217:16;-1:-1:-1;;;;;35251:36:0;;;;;35217:16;;35251:36;53603:979;;:::o;7771:191::-;7864:6;;;-1:-1:-1;;;;;7881:17:0;;;-1:-1:-1;;;;;;7881:17:0;;;;;;;7914:40;;7864:6;;;7881:17;7864:6;;7914:40;;7845:16;;7914:40;7834:128;7771:191;:::o;36751:315::-;36906:8;-1:-1:-1;;;;;36897:17:0;:5;-1:-1:-1;;;;;36897:17:0;;;36889:55;;;;-1:-1:-1;;;36889:55:0;;13687:2:1;36889:55:0;;;13669:21:1;13726:2;13706:18;;;13699:30;13765:27;13745:18;;;13738:55;13810:18;;36889:55:0;13485:349:1;36889:55:0;-1:-1:-1;;;;;36955:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36955:46:0;;;;;;;;;;37017:41;;10334::1;;;37017::0;;10307:18:1;37017:41:0;;;;;;;36751:315;;;:::o;31661:::-;31818:28;31828:4;31834:2;31838:7;31818:9;:28::i;:::-;31865:48;31888:4;31894:2;31898:7;31907:5;31865:22;:48::i;:::-;31857:111;;;;-1:-1:-1;;;31857:111:0;;;;;;;:::i;2787:723::-;2843:13;3064:10;3060:53;;-1:-1:-1;;3091:10:0;;;;;;;;;;;;-1:-1:-1;;;3091:10:0;;;;;2787:723::o;3060:53::-;3138:5;3123:12;3179:78;3186:9;;3179:78;;3212:8;;;;:::i;:::-;;-1:-1:-1;3235:10:0;;-1:-1:-1;3243:2:0;3235:10;;:::i;:::-;;;3179:78;;;3267:19;3299:6;3289:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3289:17:0;;3267:39;;3317:154;3324:10;;3317:154;;3351:11;3361:1;3351:11;;:::i;:::-;;-1:-1:-1;3420:10:0;3428:2;3420:5;:10;:::i;:::-;3407:24;;:2;:24;:::i;:::-;3394:39;;3377:6;3384;3377:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3377:56:0;;;;;;;;-1:-1:-1;3448:11:0;3457:2;3448:11;;:::i;:::-;;;3317:154;;1508:675;1591:7;1634:4;1591:7;1649:497;1673:5;:12;1669:1;:16;1649:497;;;1707:20;1730:5;1736:1;1730:8;;;;;;;;:::i;:::-;;;;;;;1707:31;;1773:12;1757;:28;1753:382;;2259:13;2309:15;;;2345:4;2338:15;;;2392:4;2376:21;;1885:57;;1753:382;;;2259:13;2309:15;;;2345:4;2338:15;;;2392:4;2376:21;;2062:57;;1753:382;-1:-1:-1;1687:3:0;;;;:::i;:::-;;;;1649:497;;;-1:-1:-1;2163:12:0;1508:675;-1:-1:-1;;;1508:675:0:o;33610:321::-;33740:18;33746:2;33750:7;33740:5;:18::i;:::-;33791:54;33822:1;33826:2;33830:7;33839:5;33791:22;:54::i;:::-;33769:154;;;;-1:-1:-1;;;33769:154:0;;;;;;;:::i;47301:239::-;47388:7;47408:12;47504:6;47498:3;47458:15;47475:10;47487:5;47441:52;;;;;;;;;8814:19:1;;;8871:2;8867:15;;;;-1:-1:-1;;;;;;8863:53:1;8858:2;8849:12;;8842:75;8942:2;8933:12;;8926:28;8979:2;8970:12;;8629:359;47441:52:0;;;;;;;;;;;;;47431:63;;;;;;47423:72;;:78;;;;:::i;:::-;:87;;;;:::i;:::-;47408:102;47301:239;-1:-1:-1;;;;;47301:239:0:o;37631:799::-;37786:4;-1:-1:-1;;;;;37807:13:0;;9497:19;:23;37803:620;;37843:72;;-1:-1:-1;;;37843:72:0;;-1:-1:-1;;;;;37843:36:0;;;;;:72;;5305:10;;37894:4;;37900:7;;37909:5;;37843:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37843:72:0;;;;;;;;-1:-1:-1;;37843:72:0;;;;;;;;;;;;:::i;:::-;;;37839:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38085:13:0;;38081:272;;38128:60;;-1:-1:-1;;;38128:60:0;;;;;;;:::i;38081:272::-;38303:6;38297:13;38288:6;38284:2;38280:15;38273:38;37839:529;-1:-1:-1;;;;;;37966:51:0;-1:-1:-1;;;37966:51:0;;-1:-1:-1;37959:58:0;;37803:620;-1:-1:-1;38407:4:0;37631:799;;;;;;:::o;34267:439::-;-1:-1:-1;;;;;34347:16:0;;34339:61;;;;-1:-1:-1;;;34339:61:0;;17469:2:1;34339:61:0;;;17451:21:1;;;17488:18;;;17481:30;17547:34;17527:18;;;17520:62;17599:18;;34339:61:0;17267:356:1;34339:61:0;34420:16;34428:7;34420;:16::i;:::-;34419:17;34411:58;;;;-1:-1:-1;;;34411:58:0;;12576:2:1;34411:58:0;;;12558:21:1;12615:2;12595:18;;;12588:30;12654;12634:18;;;12627:58;12702:18;;34411:58:0;12374:352:1;34411:58:0;-1:-1:-1;;;;;34540:13:0;;;;;;:9;:13;;;;;:18;;34557:1;;34540:13;:18;;34557:1;;34540:18;:::i;:::-;;;;-1:-1:-1;;34569:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34569:21:0;-1:-1:-1;;;;;34569:21:0;;;;;;;;34608:33;;34569:16;;;34608:33;;34569:16;;34608:33;53603:979;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;828:367;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:1;;1039:18;1028:30;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1122:67;828:367;;;;;:::o;1200:186::-;1259:6;1312:2;1300:9;1291:7;1287:23;1283:32;1280:52;;;1328:1;1325;1318:12;1280:52;1351:29;1370:9;1351:29;:::i;1391:260::-;1459:6;1467;1520:2;1508:9;1499:7;1495:23;1491:32;1488:52;;;1536:1;1533;1526:12;1488:52;1559:29;1578:9;1559:29;:::i;:::-;1549:39;;1607:38;1641:2;1630:9;1626:18;1607:38;:::i;:::-;1597:48;;1391:260;;;;;:::o;1656:328::-;1733:6;1741;1749;1802:2;1790:9;1781:7;1777:23;1773:32;1770:52;;;1818:1;1815;1808:12;1770:52;1841:29;1860:9;1841:29;:::i;:::-;1831:39;;1889:38;1923:2;1912:9;1908:18;1889:38;:::i;:::-;1879:48;;1974:2;1963:9;1959:18;1946:32;1936:42;;1656:328;;;;;:::o;1989:666::-;2084:6;2092;2100;2108;2161:3;2149:9;2140:7;2136:23;2132:33;2129:53;;;2178:1;2175;2168:12;2129:53;2201:29;2220:9;2201:29;:::i;:::-;2191:39;;2249:38;2283:2;2272:9;2268:18;2249:38;:::i;:::-;2239:48;;2334:2;2323:9;2319:18;2306:32;2296:42;;2389:2;2378:9;2374:18;2361:32;2416:18;2408:6;2405:30;2402:50;;;2448:1;2445;2438:12;2402:50;2471:22;;2524:4;2516:13;;2512:27;-1:-1:-1;2502:55:1;;2553:1;2550;2543:12;2502:55;2576:73;2641:7;2636:2;2623:16;2618:2;2614;2610:11;2576:73;:::i;:::-;2566:83;;;1989:666;;;;;;;:::o;2660:347::-;2725:6;2733;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;2825:29;2844:9;2825:29;:::i;:::-;2815:39;;2904:2;2893:9;2889:18;2876:32;2951:5;2944:13;2937:21;2930:5;2927:32;2917:60;;2973:1;2970;2963:12;2917:60;2996:5;2986:15;;;2660:347;;;;;:::o;3012:254::-;3080:6;3088;3141:2;3129:9;3120:7;3116:23;3112:32;3109:52;;;3157:1;3154;3147:12;3109:52;3180:29;3199:9;3180:29;:::i;:::-;3170:39;3256:2;3241:18;;;;3228:32;;-1:-1:-1;;;3012:254:1:o;3271:773::-;3393:6;3401;3409;3417;3470:2;3458:9;3449:7;3445:23;3441:32;3438:52;;;3486:1;3483;3476:12;3438:52;3526:9;3513:23;3555:18;3596:2;3588:6;3585:14;3582:34;;;3612:1;3609;3602:12;3582:34;3651:70;3713:7;3704:6;3693:9;3689:22;3651:70;:::i;:::-;3740:8;;-1:-1:-1;3625:96:1;-1:-1:-1;3828:2:1;3813:18;;3800:32;;-1:-1:-1;3844:16:1;;;3841:36;;;3873:1;3870;3863:12;3841:36;;3912:72;3976:7;3965:8;3954:9;3950:24;3912:72;:::i;:::-;3271:773;;;;-1:-1:-1;4003:8:1;-1:-1:-1;;;;3271:773:1:o;4049:505::-;4144:6;4152;4160;4213:2;4201:9;4192:7;4188:23;4184:32;4181:52;;;4229:1;4226;4219:12;4181:52;4269:9;4256:23;4302:18;4294:6;4291:30;4288:50;;;4334:1;4331;4324:12;4288:50;4373:70;4435:7;4426:6;4415:9;4411:22;4373:70;:::i;:::-;4462:8;;4347:96;;-1:-1:-1;4544:2:1;4529:18;;;;4516:32;;4049:505;-1:-1:-1;;;;4049:505:1:o;4559:437::-;4645:6;4653;4706:2;4694:9;4685:7;4681:23;4677:32;4674:52;;;4722:1;4719;4712:12;4674:52;4762:9;4749:23;4795:18;4787:6;4784:30;4781:50;;;4827:1;4824;4817:12;4781:50;4866:70;4928:7;4919:6;4908:9;4904:22;4866:70;:::i;:::-;4955:8;;4840:96;;-1:-1:-1;4559:437:1;-1:-1:-1;;;;4559:437:1:o;5001:180::-;5060:6;5113:2;5101:9;5092:7;5088:23;5084:32;5081:52;;;5129:1;5126;5119:12;5081:52;-1:-1:-1;5152:23:1;;5001:180;-1:-1:-1;5001:180:1:o;5186:245::-;5244:6;5297:2;5285:9;5276:7;5272:23;5268:32;5265:52;;;5313:1;5310;5303:12;5265:52;5352:9;5339:23;5371:30;5395:5;5371:30;:::i;5436:249::-;5505:6;5558:2;5546:9;5537:7;5533:23;5529:32;5526:52;;;5574:1;5571;5564:12;5526:52;5606:9;5600:16;5625:30;5649:5;5625:30;:::i;5690:450::-;5759:6;5812:2;5800:9;5791:7;5787:23;5783:32;5780:52;;;5828:1;5825;5818:12;5780:52;5868:9;5855:23;5901:18;5893:6;5890:30;5887:50;;;5933:1;5930;5923:12;5887:50;5956:22;;6009:4;6001:13;;5997:27;-1:-1:-1;5987:55:1;;6038:1;6035;6028:12;5987:55;6061:73;6126:7;6121:2;6108:16;6103:2;6099;6095:11;6061:73;:::i;6330:184::-;6400:6;6453:2;6441:9;6432:7;6428:23;6424:32;6421:52;;;6469:1;6466;6459:12;6421:52;-1:-1:-1;6492:16:1;;6330:184;-1:-1:-1;6330:184:1:o;6519:257::-;6560:3;6598:5;6592:12;6625:6;6620:3;6613:19;6641:63;6697:6;6690:4;6685:3;6681:14;6674:4;6667:5;6663:16;6641:63;:::i;:::-;6758:2;6737:15;-1:-1:-1;;6733:29:1;6724:39;;;;6765:4;6720:50;;6519:257;-1:-1:-1;;6519:257:1:o;6781:185::-;6823:3;6861:5;6855:12;6876:52;6921:6;6916:3;6909:4;6902:5;6898:16;6876:52;:::i;:::-;6944:16;;;;;6781:185;-1:-1:-1;;6781:185:1:o;7323:1301::-;7600:3;7629:1;7662:6;7656:13;7692:3;7714:1;7742:9;7738:2;7734:18;7724:28;;7802:2;7791:9;7787:18;7824;7814:61;;7868:4;7860:6;7856:17;7846:27;;7814:61;7894:2;7942;7934:6;7931:14;7911:18;7908:38;7905:165;;;-1:-1:-1;;;7969:33:1;;8025:4;8022:1;8015:15;8055:4;7976:3;8043:17;7905:165;8086:18;8113:104;;;;8231:1;8226:320;;;;8079:467;;8113:104;-1:-1:-1;;8146:24:1;;8134:37;;8191:16;;;;-1:-1:-1;8113:104:1;;8226:320;23043:1;23036:14;;;23080:4;23067:18;;8321:1;8335:165;8349:6;8346:1;8343:13;8335:165;;;8427:14;;8414:11;;;8407:35;8470:16;;;;8364:10;;8335:165;;;8339:3;;8529:6;8524:3;8520:16;8513:23;;8079:467;;;;;;;8562:56;8587:30;8613:3;8605:6;8587:30;:::i;:::-;-1:-1:-1;;;7031:20:1;;7076:1;7067:11;;6971:113;9201:488;-1:-1:-1;;;;;9470:15:1;;;9452:34;;9522:15;;9517:2;9502:18;;9495:43;9569:2;9554:18;;9547:34;;;9617:3;9612:2;9597:18;;9590:31;;;9395:4;;9638:45;;9663:19;;9655:6;9638:45;:::i;:::-;9630:53;9201:488;-1:-1:-1;;;;;;9201:488:1:o;9694:495::-;9874:3;9859:19;;9863:9;9955:6;9832:4;9989:194;10003:4;10000:1;9997:11;9989:194;;;10062:13;;10050:26;;10099:4;10123:12;;;;10158:15;;;;10023:1;10016:9;9989:194;;;9993:3;;;9694:495;;;;:::o;10568:219::-;10717:2;10706:9;10699:21;10680:4;10737:44;10777:2;10766:9;10762:18;10754:6;10737:44;:::i;10792:414::-;10994:2;10976:21;;;11033:2;11013:18;;;11006:30;11072:34;11067:2;11052:18;;11045:62;-1:-1:-1;;;11138:2:1;11123:18;;11116:48;11196:3;11181:19;;10792:414::o;13839:344::-;14041:2;14023:21;;;14080:2;14060:18;;;14053:30;-1:-1:-1;;;14114:2:1;14099:18;;14092:50;14174:2;14159:18;;13839:344::o;18444:356::-;18646:2;18628:21;;;18665:18;;;18658:30;18724:34;18719:2;18704:18;;18697:62;18791:2;18776:18;;18444:356::o;20730:413::-;20932:2;20914:21;;;20971:2;20951:18;;;20944:30;21010:34;21005:2;20990:18;;20983:62;-1:-1:-1;;;21076:2:1;21061:18;;21054:47;21133:3;21118:19;;20730:413::o;21148:405::-;21350:2;21332:21;;;21389:2;21369:18;;;21362:30;21428:34;21423:2;21408:18;;21401:62;-1:-1:-1;;;21494:2:1;21479:18;;21472:39;21543:3;21528:19;;21148:405::o;21968:398::-;22170:2;22152:21;;;22209:2;22189:18;;;22182:30;22248:34;22243:2;22228:18;;22221:62;-1:-1:-1;;;22314:2:1;22299:18;;22292:32;22356:3;22341:19;;21968:398::o;23096:128::-;23136:3;23167:1;23163:6;23160:1;23157:13;23154:39;;;23173:18;;:::i;:::-;-1:-1:-1;23209:9:1;;23096:128::o;23229:120::-;23269:1;23295;23285:35;;23300:18;;:::i;:::-;-1:-1:-1;23334:9:1;;23229:120::o;23354:168::-;23394:7;23460:1;23456;23452:6;23448:14;23445:1;23442:21;23437:1;23430:9;23423:17;23419:45;23416:71;;;23467:18;;:::i;:::-;-1:-1:-1;23507:9:1;;23354:168::o;23527:125::-;23567:4;23595:1;23592;23589:8;23586:34;;;23600:18;;:::i;:::-;-1:-1:-1;23637:9:1;;23527:125::o;23657:258::-;23729:1;23739:113;23753:6;23750:1;23747:13;23739:113;;;23829:11;;;23823:18;23810:11;;;23803:39;23775:2;23768:10;23739:113;;;23870:6;23867:1;23864:13;23861:48;;;-1:-1:-1;;23905:1:1;23887:16;;23880:27;23657:258::o;23920:380::-;23999:1;23995:12;;;;24042;;;24063:61;;24117:4;24109:6;24105:17;24095:27;;24063:61;24170:2;24162:6;24159:14;24139:18;24136:38;24133:161;;;24216:10;24211:3;24207:20;24204:1;24197:31;24251:4;24248:1;24241:15;24279:4;24276:1;24269:15;24133:161;;23920:380;;;:::o;24305:135::-;24344:3;-1:-1:-1;;24365:17:1;;24362:43;;;24385:18;;:::i;:::-;-1:-1:-1;24432:1:1;24421:13;;24305:135::o;24445:112::-;24477:1;24503;24493:35;;24508:18;;:::i;:::-;-1:-1:-1;24542:9:1;;24445:112::o;24562:127::-;24623:10;24618:3;24614:20;24611:1;24604:31;24654:4;24651:1;24644:15;24678:4;24675:1;24668:15;24694:127;24755:10;24750:3;24746:20;24743:1;24736:31;24786:4;24783:1;24776:15;24810:4;24807:1;24800:15;24826:127;24887:10;24882:3;24878:20;24875:1;24868:31;24918:4;24915:1;24908:15;24942:4;24939:1;24932:15;24958:127;25019:10;25014:3;25010:20;25007:1;25000:31;25050:4;25047:1;25040:15;25074:4;25071:1;25064:15;25090:127;25151:10;25146:3;25142:20;25139:1;25132:31;25182:4;25179:1;25172:15;25206:4;25203:1;25196:15;25222:131;-1:-1:-1;;;;;;25296:32:1;;25286:43;;25276:71;;25343:1;25340;25333:12

Swarm Source

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