ETH Price: $3,457.95 (-0.73%)
Gas: 2 Gwei

Token

Bones Club Companions (BCC)
 

Overview

Max Total Supply

916 BCC

Holders

399

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BCC
0x00fc3210e35086c730ded40bb760e37180076d3e
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:
BonesClubCompanions

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-19
*/

// File @openzeppelin/contracts/utils/introspection/[email protected]

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/token/ERC721/[email protected]

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/[email protected]

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/token/ERC721/extensions/[email protected]

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/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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/utils/[email protected]

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/introspection/[email protected]

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/[email protected]

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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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


// File @openzeppelin/contracts/access/[email protected]

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() {
        _setOwner(_msgSender());
    }

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File @openzeppelin/contracts/utils/structs/[email protected]
pragma solidity ^0.8.0;

/**
 * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.
 * Largelly inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
 */
library BitMaps {
    struct BitMap {
        mapping(uint256 => uint256) _data;
    }

    /**
     * @dev Returns whether the bit at `index` is set.
     */
    function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        return bitmap._data[bucket] & mask != 0;
    }

    /**
     * @dev Sets the bit at `index` to the boolean `value`.
     */
    function setTo(
        BitMap storage bitmap,
        uint256 index,
        bool value
    ) internal {
        if (value) {
            set(bitmap, index);
        } else {
            unset(bitmap, index);
        }
    }

    /**
     * @dev Sets the bit at `index`.
     */
    function set(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] |= mask;
    }

    /**
     * @dev Unsets the bit at `index`.
     */
    function unset(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] &= ~mask;
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/BonesClubCompanions.sol
pragma solidity ^0.8.0;


contract BonesClubCompanions is Ownable, ERC721Enumerable {
    // Libraries
    using Counters for Counters.Counter;
    using Strings for uint256;

    // Private fields
    Counters.Counter private _tokenIds;

    // Public constants
    uint256 public constant BCC_MAX_SUPPLY = 4100;
    //address public constant BONES_CLUB_CONTRACT = 0x719995D7D02126Cb7BEB17233075Bca1bf1cFfBE;
    address public constant BONES_CLUB_CONTRACT = 0x8f5a0ea6A20C7221cD865bd5C96f3b18614F7364;

    // Public fields
    bool public mintOpen = false;
    bool public claimOpen = true;
    bool public locked = false;

    uint256 public mintPrice = 0.01 ether;
    uint256 public mintAmount = 3;
    uint256 public bought = 0;
    string public baseURI = "";
    

    mapping(uint256 => bool) public claimed;

    modifier notLocked() {
        require(!locked, "Contract has been locked");
        _;
    }

    constructor() ERC721("Bones Club Companions", "BCC") {
        baseURI = "";
        //ownerMint(30);
    }

    function mint(uint256 quantity) public payable {
        require(mintOpen, "Public mint is not open atm.");
        require(quantity > 0, "Quantity must be at least 1");

        // Limit buys
        if (quantity > mintAmount) {
            quantity = mintAmount;
        }

        // Limit buys that exceed BCC_MAX_SUPPLY
        if (quantity + bought > BCC_MAX_SUPPLY) {
            quantity = BCC_MAX_SUPPLY - bought;
        }

        uint256 price = getPrice(quantity);

        // Ensure enough ETH
        require(msg.value >= price, "Not enough ETH sent");

        for (uint256 i = 0; i < quantity; i++) {
            _mintInternal(msg.sender);
            bought += 1;
        }

        // Return any remaining ether after the buy
        uint256 remaining = msg.value - price;

        if (remaining > 0) {
            (bool success, ) = msg.sender.call{value: remaining}("");
            require(success);
        }
    }

    function claimOne() public {
        require(claimOpen, "Claims are not open atm.");
        ERC721Enumerable bones = ERC721Enumerable(BONES_CLUB_CONTRACT);
        uint256 numBones = bones.balanceOf(msg.sender);
        for (uint256 i = 0; i < numBones; i++) {
            uint256 bonesId = bones.tokenOfOwnerByIndex(msg.sender, i);
            if (claimed[bonesId]) {
                continue;
            }
            claimed[bonesId] = true;
            _mintInternal(msg.sender);
            break;
        }
    }

    function claimThree() public {
        require(claimOpen, "Claims are not open atm.");
        uint256 qty = 0;
        ERC721Enumerable bones = ERC721Enumerable(BONES_CLUB_CONTRACT);
        uint256 numBones = bones.balanceOf(msg.sender);
        for (uint256 i = 0; i < numBones; i++) {
            if(qty == 3) {
                break;
            }
            uint256 bonesId = bones.tokenOfOwnerByIndex(msg.sender, i);
            if (claimed[bonesId]) {
                continue;
            }
            claimed[bonesId] = true;
            _mintInternal(msg.sender);
            qty += 1;
        }
    }

    function claimFive() public {
        require(claimOpen, "Claims are not open atm.");
        uint256 qty = 0;
        ERC721Enumerable bones = ERC721Enumerable(BONES_CLUB_CONTRACT);
        uint256 numBones = bones.balanceOf(msg.sender);
        for (uint256 i = 0; i < numBones; i++) {
            if(qty == 5) {
                break;
            }
            uint256 bonesId = bones.tokenOfOwnerByIndex(msg.sender, i);
            if (claimed[bonesId]) {
                continue;
            }
            claimed[bonesId] = true;
            _mintInternal(msg.sender);
            qty += 1;
        }
    }

    function claimAll() public {
        require(claimOpen, "Claims are not open atm.");
        ERC721Enumerable bones = ERC721Enumerable(BONES_CLUB_CONTRACT);
        uint256 numBones = bones.balanceOf(msg.sender);
        for (uint256 i = 0; i < numBones; i++) {
            uint256 bonesId = bones.tokenOfOwnerByIndex(msg.sender, i);
            if (claimed[bonesId]) {
                continue;
            }
            claimed[bonesId] = true;
            _mintInternal(msg.sender);
        }
    }

    function unclaimed(address owner) external view returns (uint256) {
        uint256 total = 0;
        ERC721Enumerable bones = ERC721Enumerable(BONES_CLUB_CONTRACT);
        uint256 numBones = bones.balanceOf(owner);
        for (uint256 i = 0; i < numBones; i++) {
            uint256 bonesId = bones.tokenOfOwnerByIndex(owner, i);
            if (claimed[bonesId]) {
                continue;
            }
            total += 1;
        }
        return total;
    }

    function getQuantityFromValue(uint256 value) public view returns (uint256) {
        return value / mintPrice;
    }

    function getPrice(uint256 quantity) public view returns (uint256) {
        require(quantity <= BCC_MAX_SUPPLY);
        return quantity * (mintPrice);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            tokenId > 0 && tokenId <= totalSupply(),
            "URI query for nonexistent token"
        );
        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }

    // Admin methods
    function ownerMint(uint256 quantity) public onlyOwner {
        for (uint256 i = 0; i < quantity; i++) {
            _mintInternal(msg.sender);
        }
    }

    function setMintAmount(uint256 amount) external onlyOwner {
        mintAmount = amount;
    }

    function setMintPrice(uint256 price) external onlyOwner {
        mintPrice = price;
    }

    function setOpen(bool laFlag) external onlyOwner {
        mintOpen = laFlag;
    }

    function setOpenFree(bool laFlag) external onlyOwner {
        claimOpen = laFlag;
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner notLocked {
        baseURI = newBaseURI;
    }

    function lock() external onlyOwner {
        locked = true;
    }

    function withdraw(uint256 amount, address addy) external payable onlyOwner {
        require(payable(addy).send(amount));    
    }

    function withdrawAll() external payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

    // Private Methods
    function _mintInternal(address owner) private {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(owner, newItemId);
    }
}

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":"BCC_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BONES_CLUB_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimThree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"getQuantityFromValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"laFlag","type":"bool"}],"name":"setOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"laFlag","type":"bool"}],"name":"setOpenFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"unclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"addy","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff0219169083151502179055506000600c60026101000a81548160ff021916908315150217905550662386f26fc10000600d556003600e556000600f556040518060200160405280600081525060109080519060200190620000919291906200025a565b503480156200009f57600080fd5b506040518060400160405280601581526020017f426f6e657320436c756220436f6d70616e696f6e7300000000000000000000008152506040518060400160405280600381526020017f42434300000000000000000000000000000000000000000000000000000000008152506200012c620001206200018e60201b60201c565b6200019660201b60201c565b8160019080519060200190620001449291906200025a565b5080600290805190602001906200015d9291906200025a565b5050506040518060200160405280600081525060109080519060200190620001879291906200025a565b506200036f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000268906200030a565b90600052602060002090601f0160209004810192826200028c5760008555620002d8565b82601f10620002a757805160ff1916838001178555620002d8565b82800160010185558215620002d8579182015b82811115620002d7578251825591602001919060010190620002ba565b5b509050620002e79190620002eb565b5090565b5b8082111562000306576000816000905550600101620002ec565b5090565b600060028204905060018216806200032357607f821691505b602082108114156200033a576200033962000340565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615147806200037f6000396000f3fe60806040526004361061027c5760003560e01c80636fdca5e01161014f578063b88d4fde116100c1578063e75722301161007a578063e757223014610938578063e985e9c514610975578063f19e75d4146109b2578063f2fde38b146109db578063f4a0a52814610a04578063f83d08ba14610a2d5761027c565b8063b88d4fde1461082a578063c7cd997f14610853578063c87b56dd1461087c578063cf309012146108b9578063d1058e59146108e4578063dbe7e3bd146108fb5761027c565b80638f419fa7116101135780638f419fa71461074f57806395d89b4114610766578063987fa94f14610791578063a0712d68146107ba578063a22cb465146107d6578063b7b88175146107ff5761027c565b80636fdca5e01461069d57806370a08231146106c6578063715018a614610703578063853828b61461071a5780638da5cb5b146107245761027c565b806334976b9b116101f357806355f804b3116101ac57806355f804b31461059f5780635a2bcc18146105c85780636352211e146105f35780636817c76c146106305780636b6af26d1461065b5780636c0360eb146106725761027c565b806334976b9b1461048f57806342842e0e146104ba5780634b8bcb58146104e35780634f1e9d3c1461050e5780634f6ccce714610525578063505bd3da146105625761027c565b80630f7828ac116102455780630f7828ac1461036b57806318160ddd1461039657806323b872dd146103c157806324bbd049146103ea57806329ed3f74146104155780632f745c59146104525761027c565b8062f714ce1461028157806301ffc9a71461029d57806306fdde03146102da578063081812fc14610305578063095ea7b314610342575b600080fd5b61029b60048036038101906102969190613d6c565b610a44565b005b3480156102a957600080fd5b506102c460048036038101906102bf9190613c6f565b610b02565b6040516102d1919061430c565b60405180910390f35b3480156102e657600080fd5b506102ef610b7c565b6040516102fc9190614327565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190613d12565b610c0e565b604051610339919061427c565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613c02565b610c93565b005b34801561037757600080fd5b50610380610dab565b60405161038d9190614629565b60405180910390f35b3480156103a257600080fd5b506103ab610db1565b6040516103b89190614629565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613aec565b610dbe565b005b3480156103f657600080fd5b506103ff610e1e565b60405161040c919061430c565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613d12565b610e31565b6040516104499190614629565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190613c02565b610e48565b6040516104869190614629565b60405180910390f35b34801561049b57600080fd5b506104a4610eed565b6040516104b19190614629565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190613aec565b610ef3565b005b3480156104ef57600080fd5b506104f8610f13565b604051610505919061430c565b60405180910390f35b34801561051a57600080fd5b50610523610f26565b005b34801561053157600080fd5b5061054c60048036038101906105479190613d12565b611134565b6040516105599190614629565b60405180910390f35b34801561056e57600080fd5b5061058960048036038101906105849190613a7f565b6111a5565b6040516105969190614629565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613cc9565b611348565b005b3480156105d457600080fd5b506105dd61142e565b6040516105ea9190614629565b60405180910390f35b3480156105ff57600080fd5b5061061a60048036038101906106159190613d12565b611434565b604051610627919061427c565b60405180910390f35b34801561063c57600080fd5b506106456114e6565b6040516106529190614629565b60405180910390f35b34801561066757600080fd5b506106706114ec565b005b34801561067e57600080fd5b50610687611715565b6040516106949190614327565b60405180910390f35b3480156106a957600080fd5b506106c460048036038101906106bf9190613c42565b6117a3565b005b3480156106d257600080fd5b506106ed60048036038101906106e89190613a7f565b61183c565b6040516106fa9190614629565b60405180910390f35b34801561070f57600080fd5b506107186118f4565b005b61072261197c565b005b34801561073057600080fd5b50610739611a38565b604051610746919061427c565b60405180910390f35b34801561075b57600080fd5b50610764611a61565b005b34801561077257600080fd5b5061077b611c8a565b6040516107889190614327565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b39190613c42565b611d1c565b005b6107d460048036038101906107cf9190613d12565b611db5565b005b3480156107e257600080fd5b506107fd60048036038101906107f89190613bc2565b611fa9565b005b34801561080b57600080fd5b5061081461212a565b604051610821919061427c565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190613b3f565b612142565b005b34801561085f57600080fd5b5061087a60048036038101906108759190613d12565b6121a4565b005b34801561088857600080fd5b506108a3600480360381019061089e9190613d12565b61222a565b6040516108b09190614327565b60405180910390f35b3480156108c557600080fd5b506108ce6122b4565b6040516108db919061430c565b60405180910390f35b3480156108f057600080fd5b506108f96122c7565b005b34801561090757600080fd5b50610922600480360381019061091d9190613d12565b6124d1565b60405161092f919061430c565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613d12565b6124f1565b60405161096c9190614629565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190613aac565b612517565b6040516109a9919061430c565b60405180910390f35b3480156109be57600080fd5b506109d960048036038101906109d49190613d12565b6125ab565b005b3480156109e757600080fd5b50610a0260048036038101906109fd9190613a7f565b612652565b005b348015610a1057600080fd5b50610a2b6004803603810190610a269190613d12565b61274a565b005b348015610a3957600080fd5b50610a426127d0565b005b610a4c612869565b73ffffffffffffffffffffffffffffffffffffffff16610a6a611a38565b73ffffffffffffffffffffffffffffffffffffffff1614610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab790614529565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050610afe57600080fd5b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b755750610b7482612871565b5b9050919050565b606060018054610b8b906148f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb7906148f9565b8015610c045780601f10610bd957610100808354040283529160200191610c04565b820191906000526020600020905b815481529060010190602001808311610be757829003601f168201915b5050505050905090565b6000610c1982612953565b610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90614509565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c9e82611434565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614589565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d2e612869565b73ffffffffffffffffffffffffffffffffffffffff161480610d5d5750610d5c81610d57612869565b612517565b5b610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390614489565b60405180910390fd5b610da683836129bf565b505050565b61100481565b6000600980549050905090565b610dcf610dc9612869565b82612a78565b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e05906145c9565b60405180910390fd5b610e19838383612b56565b505050565b600c60009054906101000a900460ff1681565b6000600d5482610e419190614784565b9050919050565b6000610e538361183c565b8210610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b90614389565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b610f0e83838360405180602001604052806000815250612142565b505050565b600c60019054906101000a900460ff1681565b600c60019054906101000a900460ff16610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90614469565b60405180910390fd5b6000738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610fc9919061427c565b60206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110199190613d3f565b905060005b8181101561112f5760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b81526004016110639291906142e3565b60206040518083038186803b15801561107b57600080fd5b505afa15801561108f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b39190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff16156110e1575061111c565b60016011600083815260200190815260200160002060006101000a81548160ff02191690831515021790555061111633612db2565b5061112f565b80806111279061495c565b91505061101e565b505050565b600061113e610db1565b821061117f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611176906145e9565b60405180910390fd5b6009828154811061119357611192614a92565b5b90600052602060002001549050919050565b600080600090506000738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401611200919061427c565b60206040518083038186803b15801561121857600080fd5b505afa15801561122c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112509190613d3f565b905060005b8181101561133c5760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5988846040518363ffffffff1660e01b815260040161129a9291906142e3565b60206040518083038186803b1580156112b257600080fd5b505afa1580156112c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ea9190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff16156113185750611329565b600185611325919061472e565b9450505b80806113349061495c565b915050611255565b50829350505050919050565b611350612869565b73ffffffffffffffffffffffffffffffffffffffff1661136e611a38565b73ffffffffffffffffffffffffffffffffffffffff16146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90614529565b60405180910390fd5b600c60029054906101000a900460ff1615611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90614349565b60405180910390fd5b806010908051906020019061142a92919061387e565b5050565b600e5481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d4906144c9565b60405180910390fd5b80915050919050565b600d5481565b600c60019054906101000a900460ff1661153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153290614469565b60405180910390fd5b600080738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611590919061427c565b60206040518083038186803b1580156115a857600080fd5b505afa1580156115bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e09190613d3f565b905060005b8181101561170f5760038414156115fb5761170f565b60008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b81526004016116389291906142e3565b60206040518083038186803b15801561165057600080fd5b505afa158015611664573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116889190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff16156116b657506116fc565b60016011600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506116eb33612db2565b6001856116f8919061472e565b9450505b80806117079061495c565b9150506115e5565b50505050565b60108054611722906148f9565b80601f016020809104026020016040519081016040528092919081815260200182805461174e906148f9565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b505050505081565b6117ab612869565b73ffffffffffffffffffffffffffffffffffffffff166117c9611a38565b73ffffffffffffffffffffffffffffffffffffffff161461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614529565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a4906144a9565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118fc612869565b73ffffffffffffffffffffffffffffffffffffffff1661191a611a38565b73ffffffffffffffffffffffffffffffffffffffff1614611970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196790614529565b60405180910390fd5b61197a6000612dd8565b565b611984612869565b73ffffffffffffffffffffffffffffffffffffffff166119a2611a38565b73ffffffffffffffffffffffffffffffffffffffff16146119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90614529565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611a3657600080fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60019054906101000a900460ff16611ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa790614469565b60405180910390fd5b600080738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b05919061427c565b60206040518083038186803b158015611b1d57600080fd5b505afa158015611b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b559190613d3f565b905060005b81811015611c84576005841415611b7057611c84565b60008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401611bad9291906142e3565b60206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfd9190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff1615611c2b5750611c71565b60016011600083815260200190815260200160002060006101000a81548160ff021916908315150217905550611c6033612db2565b600185611c6d919061472e565b9450505b8080611c7c9061495c565b915050611b5a565b50505050565b606060028054611c99906148f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc5906148f9565b8015611d125780601f10611ce757610100808354040283529160200191611d12565b820191906000526020600020905b815481529060010190602001808311611cf557829003601f168201915b5050505050905090565b611d24612869565b73ffffffffffffffffffffffffffffffffffffffff16611d42611a38565b73ffffffffffffffffffffffffffffffffffffffff1614611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614529565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff16611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb90614609565b60405180910390fd5b60008111611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e906145a9565b60405180910390fd5b600e54811115611e5757600e5490505b611004600f5482611e68919061472e565b1115611e8157600f54611004611e7e919061480f565b90505b6000611e8c826124f1565b905080341015611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890614569565b60405180910390fd5b60005b82811015611f1257611ee533612db2565b6001600f6000828254611ef8919061472e565b925050819055508080611f0a9061495c565b915050611ed4565b5060008134611f21919061480f565b90506000811115611fa45760003373ffffffffffffffffffffffffffffffffffffffff1682604051611f5290614267565b60006040518083038185875af1925050503d8060008114611f8f576040519150601f19603f3d011682016040523d82523d6000602084013e611f94565b606091505b5050905080611fa257600080fd5b505b505050565b611fb1612869565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561201f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201690614429565b60405180910390fd5b806006600061202c612869565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120d9612869565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161211e919061430c565b60405180910390a35050565b738f5a0ea6a20c7221cd865bd5c96f3b18614f736481565b61215361214d612869565b83612a78565b612192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612189906145c9565b60405180910390fd5b61219e84848484612e9c565b50505050565b6121ac612869565b73ffffffffffffffffffffffffffffffffffffffff166121ca611a38565b73ffffffffffffffffffffffffffffffffffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790614529565b60405180910390fd5b80600e8190555050565b6060600082118015612243575061223f610db1565b8211155b612282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227990614369565b60405180910390fd5b601061228d83612ef8565b60405160200161229e929190614243565b6040516020818303038152906040529050919050565b600c60029054906101000a900460ff1681565b600c60019054906101000a900460ff16612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d90614469565b60405180910390fd5b6000738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161236a919061427c565b60206040518083038186803b15801561238257600080fd5b505afa158015612396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ba9190613d3f565b905060005b818110156124cc5760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b81526004016124049291906142e3565b60206040518083038186803b15801561241c57600080fd5b505afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124549190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff161561248257506124b9565b60016011600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506124b733612db2565b505b80806124c49061495c565b9150506123bf565b505050565b60116020528060005260406000206000915054906101000a900460ff1681565b600061100482111561250257600080fd5b600d548261251091906147b5565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125b3612869565b73ffffffffffffffffffffffffffffffffffffffff166125d1611a38565b73ffffffffffffffffffffffffffffffffffffffff1614612627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261e90614529565b60405180910390fd5b60005b8181101561264e5761263b33612db2565b80806126469061495c565b91505061262a565b5050565b61265a612869565b73ffffffffffffffffffffffffffffffffffffffff16612678611a38565b73ffffffffffffffffffffffffffffffffffffffff16146126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590614529565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561273e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612735906143c9565b60405180910390fd5b61274781612dd8565b50565b612752612869565b73ffffffffffffffffffffffffffffffffffffffff16612770611a38565b73ffffffffffffffffffffffffffffffffffffffff16146127c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bd90614529565b60405180910390fd5b80600d8190555050565b6127d8612869565b73ffffffffffffffffffffffffffffffffffffffff166127f6611a38565b73ffffffffffffffffffffffffffffffffffffffff161461284c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284390614529565b60405180910390fd5b6001600c60026101000a81548160ff021916908315150217905550565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061293c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061294c575061294b82613059565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a3283611434565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a8382612953565b612ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab990614449565b60405180910390fd5b6000612acd83611434565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b3c57508373ffffffffffffffffffffffffffffffffffffffff16612b2484610c0e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b4d5750612b4c8185612517565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b7682611434565b73ffffffffffffffffffffffffffffffffffffffff1614612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc390614549565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3390614409565b60405180910390fd5b612c478383836130c3565b612c526000826129bf565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca2919061480f565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cf9919061472e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612dbc600b6131d7565b6000612dc8600b6131ed565b9050612dd482826131fb565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ea7848484612b56565b612eb3848484846133c9565b612ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee9906143a9565b60405180910390fd5b50505050565b60606000821415612f40576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613054565b600082905060005b60008214612f72578080612f5b9061495c565b915050600a82612f6b9190614784565b9150612f48565b60008167ffffffffffffffff811115612f8e57612f8d614ac1565b5b6040519080825280601f01601f191660200182016040528015612fc05781602001600182028036833780820191505090505b5090505b6000851461304d57600182612fd9919061480f565b9150600a85612fe891906149a5565b6030612ff4919061472e565b60f81b81838151811061300a57613009614a92565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130469190614784565b9450612fc4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6130ce838383613560565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131115761310c81613565565b613150565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461314f5761314e83826135ae565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131935761318e8161371b565b6131d2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131d1576131d082826137ec565b5b5b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561326b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613262906144e9565b60405180910390fd5b61327481612953565b156132b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ab906143e9565b60405180910390fd5b6132c0600083836130c3565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613310919061472e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006133ea8473ffffffffffffffffffffffffffffffffffffffff1661386b565b15613553578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613413612869565b8786866040518563ffffffff1660e01b81526004016134359493929190614297565b602060405180830381600087803b15801561344f57600080fd5b505af192505050801561348057506040513d601f19601f8201168201806040525081019061347d9190613c9c565b60015b613503573d80600081146134b0576040519150601f19603f3d011682016040523d82523d6000602084013e6134b5565b606091505b506000815114156134fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f2906143a9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613558565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135bb8461183c565b6135c5919061480f565b90506000600860008481526020019081526020016000205490508181146136aa576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061372f919061480f565b90506000600a600084815260200190815260200160002054905060006009838154811061375f5761375e614a92565b5b90600052602060002001549050806009838154811061378157613780614a92565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806137d0576137cf614a63565b5b6001900381819060005260206000200160009055905550505050565b60006137f78361183c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461388a906148f9565b90600052602060002090601f0160209004810192826138ac57600085556138f3565b82601f106138c557805160ff19168380011785556138f3565b828001600101855582156138f3579182015b828111156138f25782518255916020019190600101906138d7565b5b5090506139009190613904565b5090565b5b8082111561391d576000816000905550600101613905565b5090565b600061393461392f84614669565b614644565b9050828152602081018484840111156139505761394f614af5565b5b61395b8482856148b7565b509392505050565b60006139766139718461469a565b614644565b90508281526020810184848401111561399257613991614af5565b5b61399d8482856148b7565b509392505050565b6000813590506139b4816150b5565b92915050565b6000813590506139c9816150cc565b92915050565b6000813590506139de816150e3565b92915050565b6000815190506139f3816150e3565b92915050565b600082601f830112613a0e57613a0d614af0565b5b8135613a1e848260208601613921565b91505092915050565b600082601f830112613a3c57613a3b614af0565b5b8135613a4c848260208601613963565b91505092915050565b600081359050613a64816150fa565b92915050565b600081519050613a79816150fa565b92915050565b600060208284031215613a9557613a94614aff565b5b6000613aa3848285016139a5565b91505092915050565b60008060408385031215613ac357613ac2614aff565b5b6000613ad1858286016139a5565b9250506020613ae2858286016139a5565b9150509250929050565b600080600060608486031215613b0557613b04614aff565b5b6000613b13868287016139a5565b9350506020613b24868287016139a5565b9250506040613b3586828701613a55565b9150509250925092565b60008060008060808587031215613b5957613b58614aff565b5b6000613b67878288016139a5565b9450506020613b78878288016139a5565b9350506040613b8987828801613a55565b925050606085013567ffffffffffffffff811115613baa57613ba9614afa565b5b613bb6878288016139f9565b91505092959194509250565b60008060408385031215613bd957613bd8614aff565b5b6000613be7858286016139a5565b9250506020613bf8858286016139ba565b9150509250929050565b60008060408385031215613c1957613c18614aff565b5b6000613c27858286016139a5565b9250506020613c3885828601613a55565b9150509250929050565b600060208284031215613c5857613c57614aff565b5b6000613c66848285016139ba565b91505092915050565b600060208284031215613c8557613c84614aff565b5b6000613c93848285016139cf565b91505092915050565b600060208284031215613cb257613cb1614aff565b5b6000613cc0848285016139e4565b91505092915050565b600060208284031215613cdf57613cde614aff565b5b600082013567ffffffffffffffff811115613cfd57613cfc614afa565b5b613d0984828501613a27565b91505092915050565b600060208284031215613d2857613d27614aff565b5b6000613d3684828501613a55565b91505092915050565b600060208284031215613d5557613d54614aff565b5b6000613d6384828501613a6a565b91505092915050565b60008060408385031215613d8357613d82614aff565b5b6000613d9185828601613a55565b9250506020613da2858286016139a5565b9150509250929050565b613db581614843565b82525050565b613dc481614855565b82525050565b6000613dd5826146e0565b613ddf81856146f6565b9350613def8185602086016148c6565b613df881614b04565b840191505092915050565b6000613e0e826146eb565b613e188185614712565b9350613e288185602086016148c6565b613e3181614b04565b840191505092915050565b6000613e47826146eb565b613e518185614723565b9350613e618185602086016148c6565b80840191505092915050565b60008154613e7a816148f9565b613e848186614723565b94506001821660008114613e9f5760018114613eb057613ee3565b60ff19831686528186019350613ee3565b613eb9856146cb565b60005b83811015613edb57815481890152600182019150602081019050613ebc565b838801955050505b50505092915050565b6000613ef9601883614712565b9150613f0482614b15565b602082019050919050565b6000613f1c601f83614712565b9150613f2782614b3e565b602082019050919050565b6000613f3f602b83614712565b9150613f4a82614b67565b604082019050919050565b6000613f62603283614712565b9150613f6d82614bb6565b604082019050919050565b6000613f85602683614712565b9150613f9082614c05565b604082019050919050565b6000613fa8601c83614712565b9150613fb382614c54565b602082019050919050565b6000613fcb602483614712565b9150613fd682614c7d565b604082019050919050565b6000613fee601983614712565b9150613ff982614ccc565b602082019050919050565b6000614011602c83614712565b915061401c82614cf5565b604082019050919050565b6000614034601883614712565b915061403f82614d44565b602082019050919050565b6000614057603883614712565b915061406282614d6d565b604082019050919050565b600061407a602a83614712565b915061408582614dbc565b604082019050919050565b600061409d602983614712565b91506140a882614e0b565b604082019050919050565b60006140c0602083614712565b91506140cb82614e5a565b602082019050919050565b60006140e3602c83614712565b91506140ee82614e83565b604082019050919050565b6000614106602083614712565b915061411182614ed2565b602082019050919050565b6000614129602983614712565b915061413482614efb565b604082019050919050565b600061414c601383614712565b915061415782614f4a565b602082019050919050565b600061416f602183614712565b915061417a82614f73565b604082019050919050565b6000614192601b83614712565b915061419d82614fc2565b602082019050919050565b60006141b5600083614707565b91506141c082614feb565b600082019050919050565b60006141d8603183614712565b91506141e382614fee565b604082019050919050565b60006141fb602c83614712565b91506142068261503d565b604082019050919050565b600061421e601c83614712565b91506142298261508c565b602082019050919050565b61423d816148ad565b82525050565b600061424f8285613e6d565b915061425b8284613e3c565b91508190509392505050565b6000614272826141a8565b9150819050919050565b60006020820190506142916000830184613dac565b92915050565b60006080820190506142ac6000830187613dac565b6142b96020830186613dac565b6142c66040830185614234565b81810360608301526142d88184613dca565b905095945050505050565b60006040820190506142f86000830185613dac565b6143056020830184614234565b9392505050565b60006020820190506143216000830184613dbb565b92915050565b600060208201905081810360008301526143418184613e03565b905092915050565b6000602082019050818103600083015261436281613eec565b9050919050565b6000602082019050818103600083015261438281613f0f565b9050919050565b600060208201905081810360008301526143a281613f32565b9050919050565b600060208201905081810360008301526143c281613f55565b9050919050565b600060208201905081810360008301526143e281613f78565b9050919050565b6000602082019050818103600083015261440281613f9b565b9050919050565b6000602082019050818103600083015261442281613fbe565b9050919050565b6000602082019050818103600083015261444281613fe1565b9050919050565b6000602082019050818103600083015261446281614004565b9050919050565b6000602082019050818103600083015261448281614027565b9050919050565b600060208201905081810360008301526144a28161404a565b9050919050565b600060208201905081810360008301526144c28161406d565b9050919050565b600060208201905081810360008301526144e281614090565b9050919050565b60006020820190508181036000830152614502816140b3565b9050919050565b60006020820190508181036000830152614522816140d6565b9050919050565b60006020820190508181036000830152614542816140f9565b9050919050565b600060208201905081810360008301526145628161411c565b9050919050565b600060208201905081810360008301526145828161413f565b9050919050565b600060208201905081810360008301526145a281614162565b9050919050565b600060208201905081810360008301526145c281614185565b9050919050565b600060208201905081810360008301526145e2816141cb565b9050919050565b60006020820190508181036000830152614602816141ee565b9050919050565b6000602082019050818103600083015261462281614211565b9050919050565b600060208201905061463e6000830184614234565b92915050565b600061464e61465f565b905061465a828261492b565b919050565b6000604051905090565b600067ffffffffffffffff82111561468457614683614ac1565b5b61468d82614b04565b9050602081019050919050565b600067ffffffffffffffff8211156146b5576146b4614ac1565b5b6146be82614b04565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614739826148ad565b9150614744836148ad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614779576147786149d6565b5b828201905092915050565b600061478f826148ad565b915061479a836148ad565b9250826147aa576147a9614a05565b5b828204905092915050565b60006147c0826148ad565b91506147cb836148ad565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614804576148036149d6565b5b828202905092915050565b600061481a826148ad565b9150614825836148ad565b925082821015614838576148376149d6565b5b828203905092915050565b600061484e8261488d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148e45780820151818401526020810190506148c9565b838111156148f3576000848401525b50505050565b6000600282049050600182168061491157607f821691505b6020821081141561492557614924614a34565b5b50919050565b61493482614b04565b810181811067ffffffffffffffff8211171561495357614952614ac1565b5b80604052505050565b6000614967826148ad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561499a576149996149d6565b5b600182019050919050565b60006149b0826148ad565b91506149bb836148ad565b9250826149cb576149ca614a05565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f436f6e747261637420686173206265656e206c6f636b65640000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f436c61696d7320617265206e6f74206f70656e2061746d2e0000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e74697479206d757374206265206174206c6561737420310000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5075626c6963206d696e74206973206e6f74206f70656e2061746d2e00000000600082015250565b6150be81614843565b81146150c957600080fd5b50565b6150d581614855565b81146150e057600080fd5b50565b6150ec81614861565b81146150f757600080fd5b50565b615103816148ad565b811461510e57600080fd5b5056fea26469706673582212206de09c34a404596e0b0648b5ed13be51621e23f86fbe46697344de7d753f344e64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061027c5760003560e01c80636fdca5e01161014f578063b88d4fde116100c1578063e75722301161007a578063e757223014610938578063e985e9c514610975578063f19e75d4146109b2578063f2fde38b146109db578063f4a0a52814610a04578063f83d08ba14610a2d5761027c565b8063b88d4fde1461082a578063c7cd997f14610853578063c87b56dd1461087c578063cf309012146108b9578063d1058e59146108e4578063dbe7e3bd146108fb5761027c565b80638f419fa7116101135780638f419fa71461074f57806395d89b4114610766578063987fa94f14610791578063a0712d68146107ba578063a22cb465146107d6578063b7b88175146107ff5761027c565b80636fdca5e01461069d57806370a08231146106c6578063715018a614610703578063853828b61461071a5780638da5cb5b146107245761027c565b806334976b9b116101f357806355f804b3116101ac57806355f804b31461059f5780635a2bcc18146105c85780636352211e146105f35780636817c76c146106305780636b6af26d1461065b5780636c0360eb146106725761027c565b806334976b9b1461048f57806342842e0e146104ba5780634b8bcb58146104e35780634f1e9d3c1461050e5780634f6ccce714610525578063505bd3da146105625761027c565b80630f7828ac116102455780630f7828ac1461036b57806318160ddd1461039657806323b872dd146103c157806324bbd049146103ea57806329ed3f74146104155780632f745c59146104525761027c565b8062f714ce1461028157806301ffc9a71461029d57806306fdde03146102da578063081812fc14610305578063095ea7b314610342575b600080fd5b61029b60048036038101906102969190613d6c565b610a44565b005b3480156102a957600080fd5b506102c460048036038101906102bf9190613c6f565b610b02565b6040516102d1919061430c565b60405180910390f35b3480156102e657600080fd5b506102ef610b7c565b6040516102fc9190614327565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190613d12565b610c0e565b604051610339919061427c565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613c02565b610c93565b005b34801561037757600080fd5b50610380610dab565b60405161038d9190614629565b60405180910390f35b3480156103a257600080fd5b506103ab610db1565b6040516103b89190614629565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613aec565b610dbe565b005b3480156103f657600080fd5b506103ff610e1e565b60405161040c919061430c565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613d12565b610e31565b6040516104499190614629565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190613c02565b610e48565b6040516104869190614629565b60405180910390f35b34801561049b57600080fd5b506104a4610eed565b6040516104b19190614629565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190613aec565b610ef3565b005b3480156104ef57600080fd5b506104f8610f13565b604051610505919061430c565b60405180910390f35b34801561051a57600080fd5b50610523610f26565b005b34801561053157600080fd5b5061054c60048036038101906105479190613d12565b611134565b6040516105599190614629565b60405180910390f35b34801561056e57600080fd5b5061058960048036038101906105849190613a7f565b6111a5565b6040516105969190614629565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613cc9565b611348565b005b3480156105d457600080fd5b506105dd61142e565b6040516105ea9190614629565b60405180910390f35b3480156105ff57600080fd5b5061061a60048036038101906106159190613d12565b611434565b604051610627919061427c565b60405180910390f35b34801561063c57600080fd5b506106456114e6565b6040516106529190614629565b60405180910390f35b34801561066757600080fd5b506106706114ec565b005b34801561067e57600080fd5b50610687611715565b6040516106949190614327565b60405180910390f35b3480156106a957600080fd5b506106c460048036038101906106bf9190613c42565b6117a3565b005b3480156106d257600080fd5b506106ed60048036038101906106e89190613a7f565b61183c565b6040516106fa9190614629565b60405180910390f35b34801561070f57600080fd5b506107186118f4565b005b61072261197c565b005b34801561073057600080fd5b50610739611a38565b604051610746919061427c565b60405180910390f35b34801561075b57600080fd5b50610764611a61565b005b34801561077257600080fd5b5061077b611c8a565b6040516107889190614327565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b39190613c42565b611d1c565b005b6107d460048036038101906107cf9190613d12565b611db5565b005b3480156107e257600080fd5b506107fd60048036038101906107f89190613bc2565b611fa9565b005b34801561080b57600080fd5b5061081461212a565b604051610821919061427c565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190613b3f565b612142565b005b34801561085f57600080fd5b5061087a60048036038101906108759190613d12565b6121a4565b005b34801561088857600080fd5b506108a3600480360381019061089e9190613d12565b61222a565b6040516108b09190614327565b60405180910390f35b3480156108c557600080fd5b506108ce6122b4565b6040516108db919061430c565b60405180910390f35b3480156108f057600080fd5b506108f96122c7565b005b34801561090757600080fd5b50610922600480360381019061091d9190613d12565b6124d1565b60405161092f919061430c565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190613d12565b6124f1565b60405161096c9190614629565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190613aac565b612517565b6040516109a9919061430c565b60405180910390f35b3480156109be57600080fd5b506109d960048036038101906109d49190613d12565b6125ab565b005b3480156109e757600080fd5b50610a0260048036038101906109fd9190613a7f565b612652565b005b348015610a1057600080fd5b50610a2b6004803603810190610a269190613d12565b61274a565b005b348015610a3957600080fd5b50610a426127d0565b005b610a4c612869565b73ffffffffffffffffffffffffffffffffffffffff16610a6a611a38565b73ffffffffffffffffffffffffffffffffffffffff1614610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab790614529565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050610afe57600080fd5b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b755750610b7482612871565b5b9050919050565b606060018054610b8b906148f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb7906148f9565b8015610c045780601f10610bd957610100808354040283529160200191610c04565b820191906000526020600020905b815481529060010190602001808311610be757829003601f168201915b5050505050905090565b6000610c1982612953565b610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90614509565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c9e82611434565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614589565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d2e612869565b73ffffffffffffffffffffffffffffffffffffffff161480610d5d5750610d5c81610d57612869565b612517565b5b610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390614489565b60405180910390fd5b610da683836129bf565b505050565b61100481565b6000600980549050905090565b610dcf610dc9612869565b82612a78565b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e05906145c9565b60405180910390fd5b610e19838383612b56565b505050565b600c60009054906101000a900460ff1681565b6000600d5482610e419190614784565b9050919050565b6000610e538361183c565b8210610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b90614389565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b610f0e83838360405180602001604052806000815250612142565b505050565b600c60019054906101000a900460ff1681565b600c60019054906101000a900460ff16610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90614469565b60405180910390fd5b6000738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610fc9919061427c565b60206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110199190613d3f565b905060005b8181101561112f5760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b81526004016110639291906142e3565b60206040518083038186803b15801561107b57600080fd5b505afa15801561108f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b39190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff16156110e1575061111c565b60016011600083815260200190815260200160002060006101000a81548160ff02191690831515021790555061111633612db2565b5061112f565b80806111279061495c565b91505061101e565b505050565b600061113e610db1565b821061117f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611176906145e9565b60405180910390fd5b6009828154811061119357611192614a92565b5b90600052602060002001549050919050565b600080600090506000738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401611200919061427c565b60206040518083038186803b15801561121857600080fd5b505afa15801561122c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112509190613d3f565b905060005b8181101561133c5760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5988846040518363ffffffff1660e01b815260040161129a9291906142e3565b60206040518083038186803b1580156112b257600080fd5b505afa1580156112c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ea9190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff16156113185750611329565b600185611325919061472e565b9450505b80806113349061495c565b915050611255565b50829350505050919050565b611350612869565b73ffffffffffffffffffffffffffffffffffffffff1661136e611a38565b73ffffffffffffffffffffffffffffffffffffffff16146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90614529565b60405180910390fd5b600c60029054906101000a900460ff1615611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90614349565b60405180910390fd5b806010908051906020019061142a92919061387e565b5050565b600e5481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d4906144c9565b60405180910390fd5b80915050919050565b600d5481565b600c60019054906101000a900460ff1661153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153290614469565b60405180910390fd5b600080738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611590919061427c565b60206040518083038186803b1580156115a857600080fd5b505afa1580156115bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e09190613d3f565b905060005b8181101561170f5760038414156115fb5761170f565b60008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b81526004016116389291906142e3565b60206040518083038186803b15801561165057600080fd5b505afa158015611664573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116889190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff16156116b657506116fc565b60016011600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506116eb33612db2565b6001856116f8919061472e565b9450505b80806117079061495c565b9150506115e5565b50505050565b60108054611722906148f9565b80601f016020809104026020016040519081016040528092919081815260200182805461174e906148f9565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b505050505081565b6117ab612869565b73ffffffffffffffffffffffffffffffffffffffff166117c9611a38565b73ffffffffffffffffffffffffffffffffffffffff161461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614529565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a4906144a9565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118fc612869565b73ffffffffffffffffffffffffffffffffffffffff1661191a611a38565b73ffffffffffffffffffffffffffffffffffffffff1614611970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196790614529565b60405180910390fd5b61197a6000612dd8565b565b611984612869565b73ffffffffffffffffffffffffffffffffffffffff166119a2611a38565b73ffffffffffffffffffffffffffffffffffffffff16146119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90614529565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611a3657600080fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60019054906101000a900460ff16611ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa790614469565b60405180910390fd5b600080738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b05919061427c565b60206040518083038186803b158015611b1d57600080fd5b505afa158015611b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b559190613d3f565b905060005b81811015611c84576005841415611b7057611c84565b60008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401611bad9291906142e3565b60206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfd9190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff1615611c2b5750611c71565b60016011600083815260200190815260200160002060006101000a81548160ff021916908315150217905550611c6033612db2565b600185611c6d919061472e565b9450505b8080611c7c9061495c565b915050611b5a565b50505050565b606060028054611c99906148f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc5906148f9565b8015611d125780601f10611ce757610100808354040283529160200191611d12565b820191906000526020600020905b815481529060010190602001808311611cf557829003601f168201915b5050505050905090565b611d24612869565b73ffffffffffffffffffffffffffffffffffffffff16611d42611a38565b73ffffffffffffffffffffffffffffffffffffffff1614611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614529565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b600c60009054906101000a900460ff16611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb90614609565b60405180910390fd5b60008111611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e906145a9565b60405180910390fd5b600e54811115611e5757600e5490505b611004600f5482611e68919061472e565b1115611e8157600f54611004611e7e919061480f565b90505b6000611e8c826124f1565b905080341015611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890614569565b60405180910390fd5b60005b82811015611f1257611ee533612db2565b6001600f6000828254611ef8919061472e565b925050819055508080611f0a9061495c565b915050611ed4565b5060008134611f21919061480f565b90506000811115611fa45760003373ffffffffffffffffffffffffffffffffffffffff1682604051611f5290614267565b60006040518083038185875af1925050503d8060008114611f8f576040519150601f19603f3d011682016040523d82523d6000602084013e611f94565b606091505b5050905080611fa257600080fd5b505b505050565b611fb1612869565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561201f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201690614429565b60405180910390fd5b806006600061202c612869565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120d9612869565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161211e919061430c565b60405180910390a35050565b738f5a0ea6a20c7221cd865bd5c96f3b18614f736481565b61215361214d612869565b83612a78565b612192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612189906145c9565b60405180910390fd5b61219e84848484612e9c565b50505050565b6121ac612869565b73ffffffffffffffffffffffffffffffffffffffff166121ca611a38565b73ffffffffffffffffffffffffffffffffffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790614529565b60405180910390fd5b80600e8190555050565b6060600082118015612243575061223f610db1565b8211155b612282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227990614369565b60405180910390fd5b601061228d83612ef8565b60405160200161229e929190614243565b6040516020818303038152906040529050919050565b600c60029054906101000a900460ff1681565b600c60019054906101000a900460ff16612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d90614469565b60405180910390fd5b6000738f5a0ea6a20c7221cd865bd5c96f3b18614f7364905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161236a919061427c565b60206040518083038186803b15801561238257600080fd5b505afa158015612396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ba9190613d3f565b905060005b818110156124cc5760008373ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b81526004016124049291906142e3565b60206040518083038186803b15801561241c57600080fd5b505afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124549190613d3f565b90506011600082815260200190815260200160002060009054906101000a900460ff161561248257506124b9565b60016011600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506124b733612db2565b505b80806124c49061495c565b9150506123bf565b505050565b60116020528060005260406000206000915054906101000a900460ff1681565b600061100482111561250257600080fd5b600d548261251091906147b5565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125b3612869565b73ffffffffffffffffffffffffffffffffffffffff166125d1611a38565b73ffffffffffffffffffffffffffffffffffffffff1614612627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261e90614529565b60405180910390fd5b60005b8181101561264e5761263b33612db2565b80806126469061495c565b91505061262a565b5050565b61265a612869565b73ffffffffffffffffffffffffffffffffffffffff16612678611a38565b73ffffffffffffffffffffffffffffffffffffffff16146126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590614529565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561273e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612735906143c9565b60405180910390fd5b61274781612dd8565b50565b612752612869565b73ffffffffffffffffffffffffffffffffffffffff16612770611a38565b73ffffffffffffffffffffffffffffffffffffffff16146127c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bd90614529565b60405180910390fd5b80600d8190555050565b6127d8612869565b73ffffffffffffffffffffffffffffffffffffffff166127f6611a38565b73ffffffffffffffffffffffffffffffffffffffff161461284c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284390614529565b60405180910390fd5b6001600c60026101000a81548160ff021916908315150217905550565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061293c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061294c575061294b82613059565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a3283611434565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a8382612953565b612ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab990614449565b60405180910390fd5b6000612acd83611434565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b3c57508373ffffffffffffffffffffffffffffffffffffffff16612b2484610c0e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b4d5750612b4c8185612517565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b7682611434565b73ffffffffffffffffffffffffffffffffffffffff1614612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc390614549565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3390614409565b60405180910390fd5b612c478383836130c3565b612c526000826129bf565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca2919061480f565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cf9919061472e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612dbc600b6131d7565b6000612dc8600b6131ed565b9050612dd482826131fb565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ea7848484612b56565b612eb3848484846133c9565b612ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee9906143a9565b60405180910390fd5b50505050565b60606000821415612f40576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613054565b600082905060005b60008214612f72578080612f5b9061495c565b915050600a82612f6b9190614784565b9150612f48565b60008167ffffffffffffffff811115612f8e57612f8d614ac1565b5b6040519080825280601f01601f191660200182016040528015612fc05781602001600182028036833780820191505090505b5090505b6000851461304d57600182612fd9919061480f565b9150600a85612fe891906149a5565b6030612ff4919061472e565b60f81b81838151811061300a57613009614a92565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130469190614784565b9450612fc4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6130ce838383613560565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131115761310c81613565565b613150565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461314f5761314e83826135ae565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131935761318e8161371b565b6131d2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131d1576131d082826137ec565b5b5b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561326b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613262906144e9565b60405180910390fd5b61327481612953565b156132b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ab906143e9565b60405180910390fd5b6132c0600083836130c3565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613310919061472e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006133ea8473ffffffffffffffffffffffffffffffffffffffff1661386b565b15613553578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613413612869565b8786866040518563ffffffff1660e01b81526004016134359493929190614297565b602060405180830381600087803b15801561344f57600080fd5b505af192505050801561348057506040513d601f19601f8201168201806040525081019061347d9190613c9c565b60015b613503573d80600081146134b0576040519150601f19603f3d011682016040523d82523d6000602084013e6134b5565b606091505b506000815114156134fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f2906143a9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613558565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135bb8461183c565b6135c5919061480f565b90506000600860008481526020019081526020016000205490508181146136aa576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061372f919061480f565b90506000600a600084815260200190815260200160002054905060006009838154811061375f5761375e614a92565b5b90600052602060002001549050806009838154811061378157613780614a92565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806137d0576137cf614a63565b5b6001900381819060005260206000200160009055905550505050565b60006137f78361183c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461388a906148f9565b90600052602060002090601f0160209004810192826138ac57600085556138f3565b82601f106138c557805160ff19168380011785556138f3565b828001600101855582156138f3579182015b828111156138f25782518255916020019190600101906138d7565b5b5090506139009190613904565b5090565b5b8082111561391d576000816000905550600101613905565b5090565b600061393461392f84614669565b614644565b9050828152602081018484840111156139505761394f614af5565b5b61395b8482856148b7565b509392505050565b60006139766139718461469a565b614644565b90508281526020810184848401111561399257613991614af5565b5b61399d8482856148b7565b509392505050565b6000813590506139b4816150b5565b92915050565b6000813590506139c9816150cc565b92915050565b6000813590506139de816150e3565b92915050565b6000815190506139f3816150e3565b92915050565b600082601f830112613a0e57613a0d614af0565b5b8135613a1e848260208601613921565b91505092915050565b600082601f830112613a3c57613a3b614af0565b5b8135613a4c848260208601613963565b91505092915050565b600081359050613a64816150fa565b92915050565b600081519050613a79816150fa565b92915050565b600060208284031215613a9557613a94614aff565b5b6000613aa3848285016139a5565b91505092915050565b60008060408385031215613ac357613ac2614aff565b5b6000613ad1858286016139a5565b9250506020613ae2858286016139a5565b9150509250929050565b600080600060608486031215613b0557613b04614aff565b5b6000613b13868287016139a5565b9350506020613b24868287016139a5565b9250506040613b3586828701613a55565b9150509250925092565b60008060008060808587031215613b5957613b58614aff565b5b6000613b67878288016139a5565b9450506020613b78878288016139a5565b9350506040613b8987828801613a55565b925050606085013567ffffffffffffffff811115613baa57613ba9614afa565b5b613bb6878288016139f9565b91505092959194509250565b60008060408385031215613bd957613bd8614aff565b5b6000613be7858286016139a5565b9250506020613bf8858286016139ba565b9150509250929050565b60008060408385031215613c1957613c18614aff565b5b6000613c27858286016139a5565b9250506020613c3885828601613a55565b9150509250929050565b600060208284031215613c5857613c57614aff565b5b6000613c66848285016139ba565b91505092915050565b600060208284031215613c8557613c84614aff565b5b6000613c93848285016139cf565b91505092915050565b600060208284031215613cb257613cb1614aff565b5b6000613cc0848285016139e4565b91505092915050565b600060208284031215613cdf57613cde614aff565b5b600082013567ffffffffffffffff811115613cfd57613cfc614afa565b5b613d0984828501613a27565b91505092915050565b600060208284031215613d2857613d27614aff565b5b6000613d3684828501613a55565b91505092915050565b600060208284031215613d5557613d54614aff565b5b6000613d6384828501613a6a565b91505092915050565b60008060408385031215613d8357613d82614aff565b5b6000613d9185828601613a55565b9250506020613da2858286016139a5565b9150509250929050565b613db581614843565b82525050565b613dc481614855565b82525050565b6000613dd5826146e0565b613ddf81856146f6565b9350613def8185602086016148c6565b613df881614b04565b840191505092915050565b6000613e0e826146eb565b613e188185614712565b9350613e288185602086016148c6565b613e3181614b04565b840191505092915050565b6000613e47826146eb565b613e518185614723565b9350613e618185602086016148c6565b80840191505092915050565b60008154613e7a816148f9565b613e848186614723565b94506001821660008114613e9f5760018114613eb057613ee3565b60ff19831686528186019350613ee3565b613eb9856146cb565b60005b83811015613edb57815481890152600182019150602081019050613ebc565b838801955050505b50505092915050565b6000613ef9601883614712565b9150613f0482614b15565b602082019050919050565b6000613f1c601f83614712565b9150613f2782614b3e565b602082019050919050565b6000613f3f602b83614712565b9150613f4a82614b67565b604082019050919050565b6000613f62603283614712565b9150613f6d82614bb6565b604082019050919050565b6000613f85602683614712565b9150613f9082614c05565b604082019050919050565b6000613fa8601c83614712565b9150613fb382614c54565b602082019050919050565b6000613fcb602483614712565b9150613fd682614c7d565b604082019050919050565b6000613fee601983614712565b9150613ff982614ccc565b602082019050919050565b6000614011602c83614712565b915061401c82614cf5565b604082019050919050565b6000614034601883614712565b915061403f82614d44565b602082019050919050565b6000614057603883614712565b915061406282614d6d565b604082019050919050565b600061407a602a83614712565b915061408582614dbc565b604082019050919050565b600061409d602983614712565b91506140a882614e0b565b604082019050919050565b60006140c0602083614712565b91506140cb82614e5a565b602082019050919050565b60006140e3602c83614712565b91506140ee82614e83565b604082019050919050565b6000614106602083614712565b915061411182614ed2565b602082019050919050565b6000614129602983614712565b915061413482614efb565b604082019050919050565b600061414c601383614712565b915061415782614f4a565b602082019050919050565b600061416f602183614712565b915061417a82614f73565b604082019050919050565b6000614192601b83614712565b915061419d82614fc2565b602082019050919050565b60006141b5600083614707565b91506141c082614feb565b600082019050919050565b60006141d8603183614712565b91506141e382614fee565b604082019050919050565b60006141fb602c83614712565b91506142068261503d565b604082019050919050565b600061421e601c83614712565b91506142298261508c565b602082019050919050565b61423d816148ad565b82525050565b600061424f8285613e6d565b915061425b8284613e3c565b91508190509392505050565b6000614272826141a8565b9150819050919050565b60006020820190506142916000830184613dac565b92915050565b60006080820190506142ac6000830187613dac565b6142b96020830186613dac565b6142c66040830185614234565b81810360608301526142d88184613dca565b905095945050505050565b60006040820190506142f86000830185613dac565b6143056020830184614234565b9392505050565b60006020820190506143216000830184613dbb565b92915050565b600060208201905081810360008301526143418184613e03565b905092915050565b6000602082019050818103600083015261436281613eec565b9050919050565b6000602082019050818103600083015261438281613f0f565b9050919050565b600060208201905081810360008301526143a281613f32565b9050919050565b600060208201905081810360008301526143c281613f55565b9050919050565b600060208201905081810360008301526143e281613f78565b9050919050565b6000602082019050818103600083015261440281613f9b565b9050919050565b6000602082019050818103600083015261442281613fbe565b9050919050565b6000602082019050818103600083015261444281613fe1565b9050919050565b6000602082019050818103600083015261446281614004565b9050919050565b6000602082019050818103600083015261448281614027565b9050919050565b600060208201905081810360008301526144a28161404a565b9050919050565b600060208201905081810360008301526144c28161406d565b9050919050565b600060208201905081810360008301526144e281614090565b9050919050565b60006020820190508181036000830152614502816140b3565b9050919050565b60006020820190508181036000830152614522816140d6565b9050919050565b60006020820190508181036000830152614542816140f9565b9050919050565b600060208201905081810360008301526145628161411c565b9050919050565b600060208201905081810360008301526145828161413f565b9050919050565b600060208201905081810360008301526145a281614162565b9050919050565b600060208201905081810360008301526145c281614185565b9050919050565b600060208201905081810360008301526145e2816141cb565b9050919050565b60006020820190508181036000830152614602816141ee565b9050919050565b6000602082019050818103600083015261462281614211565b9050919050565b600060208201905061463e6000830184614234565b92915050565b600061464e61465f565b905061465a828261492b565b919050565b6000604051905090565b600067ffffffffffffffff82111561468457614683614ac1565b5b61468d82614b04565b9050602081019050919050565b600067ffffffffffffffff8211156146b5576146b4614ac1565b5b6146be82614b04565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614739826148ad565b9150614744836148ad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614779576147786149d6565b5b828201905092915050565b600061478f826148ad565b915061479a836148ad565b9250826147aa576147a9614a05565b5b828204905092915050565b60006147c0826148ad565b91506147cb836148ad565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614804576148036149d6565b5b828202905092915050565b600061481a826148ad565b9150614825836148ad565b925082821015614838576148376149d6565b5b828203905092915050565b600061484e8261488d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148e45780820151818401526020810190506148c9565b838111156148f3576000848401525b50505050565b6000600282049050600182168061491157607f821691505b6020821081141561492557614924614a34565b5b50919050565b61493482614b04565b810181811067ffffffffffffffff8211171561495357614952614ac1565b5b80604052505050565b6000614967826148ad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561499a576149996149d6565b5b600182019050919050565b60006149b0826148ad565b91506149bb836148ad565b9250826149cb576149ca614a05565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f436f6e747261637420686173206265656e206c6f636b65640000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f436c61696d7320617265206e6f74206f70656e2061746d2e0000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e74697479206d757374206265206174206c6561737420310000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5075626c6963206d696e74206973206e6f74206f70656e2061746d2e00000000600082015250565b6150be81614843565b81146150c957600080fd5b50565b6150d581614855565b81146150e057600080fd5b50565b6150ec81614861565b81146150f757600080fd5b50565b615103816148ad565b811461510e57600080fd5b5056fea26469706673582212206de09c34a404596e0b0648b5ed13be51621e23f86fbe46697344de7d753f344e64736f6c63430008070033

Deployed Bytecode Sourcemap

49072:6758:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55359:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42850:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21606:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23165:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22688:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49322:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43490:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24055:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49590:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53924:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43158:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49775:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24465:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49625:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51094:533;;;;;;;;;;;;;:::i;:::-;;43680:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53433:483;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55162:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49739:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21300:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49695:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51635:631;;;;;;;;;;;;;:::i;:::-;;49807:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54971:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21030:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37276:94;;;;;;;;;;;;;:::i;:::-;;55500:125;;;:::i;:::-;;36625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52274:630;;;;;;;;;;;;;:::i;:::-;;21775:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55064:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50118:968;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23458:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49471:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24721:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54767:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54218:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49660:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52912:513;;;;;;;;;;;;;:::i;:::-;;49848:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54050:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23824:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54596:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37525:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54871:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55284:67;;;;;;;;;;;;;:::i;:::-;;55359:133;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55461:4:::1;55453:18;;:26;55472:6;55453:26;;;;;;;;;;;;;;;;;;;;;;;55445:35;;;::::0;::::1;;55359:133:::0;;:::o;42850:224::-;42952:4;42991:35;42976:50;;;:11;:50;;;;:90;;;;43030:36;43054:11;43030:23;:36::i;:::-;42976:90;42969:97;;42850:224;;;:::o;21606:100::-;21660:13;21693:5;21686:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21606:100;:::o;23165:221::-;23241:7;23269:16;23277:7;23269;:16::i;:::-;23261:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23354:15;:24;23370:7;23354:24;;;;;;;;;;;;;;;;;;;;;23347:31;;23165:221;;;:::o;22688:411::-;22769:13;22785:23;22800:7;22785:14;:23::i;:::-;22769:39;;22833:5;22827:11;;:2;:11;;;;22819:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22927:5;22911:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22936:37;22953:5;22960:12;:10;:12::i;:::-;22936:16;:37::i;:::-;22911:62;22889:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23070:21;23079:2;23083:7;23070:8;:21::i;:::-;22758:341;22688:411;;:::o;49322:45::-;49363:4;49322:45;:::o;43490:113::-;43551:7;43578:10;:17;;;;43571:24;;43490:113;:::o;24055:339::-;24250:41;24269:12;:10;:12::i;:::-;24283:7;24250:18;:41::i;:::-;24242:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24358:28;24368:4;24374:2;24378:7;24358:9;:28::i;:::-;24055:339;;;:::o;49590:28::-;;;;;;;;;;;;;:::o;53924:118::-;53990:7;54025:9;;54017:5;:17;;;;:::i;:::-;54010:24;;53924:118;;;:::o;43158:256::-;43255:7;43291:23;43308:5;43291:16;:23::i;:::-;43283:5;:31;43275:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43380:12;:19;43393:5;43380:19;;;;;;;;;;;;;;;:26;43400:5;43380:26;;;;;;;;;;;;43373:33;;43158:256;;;;:::o;49775:25::-;;;;:::o;24465:185::-;24603:39;24620:4;24626:2;24630:7;24603:39;;;;;;;;;;;;:16;:39::i;:::-;24465:185;;;:::o;49625:28::-;;;;;;;;;;;;;:::o;51094:533::-;51140:9;;;;;;;;;;;51132:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51189:22;49517:42;51189:62;;51262:16;51281:5;:15;;;51297:10;51281:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51262:46;;51324:9;51319:301;51343:8;51339:1;:12;51319:301;;;51373:15;51391:5;:25;;;51417:10;51429:1;51391:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51373:58;;51450:7;:16;51458:7;51450:16;;;;;;;;;;;;;;;;;;;;;51446:65;;;51487:8;;;51446:65;51544:4;51525:7;:16;51533:7;51525:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;51563:25;51577:10;51563:13;:25::i;:::-;51603:5;;;51319:301;51353:3;;;;;:::i;:::-;;;;51319:301;;;;51121:506;;51094:533::o;43680:233::-;43755:7;43791:30;:28;:30::i;:::-;43783:5;:38;43775:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43888:10;43899:5;43888:17;;;;;;;;:::i;:::-;;;;;;;;;;43881:24;;43680:233;;;:::o;53433:483::-;53490:7;53510:13;53526:1;53510:17;;53538:22;49517:42;53538:62;;53611:16;53630:5;:15;;;53646:5;53630:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53611:41;;53668:9;53663:223;53687:8;53683:1;:12;53663:223;;;53717:15;53735:5;:25;;;53761:5;53768:1;53735:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53717:53;;53789:7;:16;53797:7;53789:16;;;;;;;;;;;;;;;;;;;;;53785:65;;;53826:8;;;53785:65;53873:1;53864:10;;;;;:::i;:::-;;;53702:184;53663:223;53697:3;;;;;:::i;:::-;;;;53663:223;;;;53903:5;53896:12;;;;;53433:483;;;:::o;55162:114::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49937:6:::1;;;;;;;;;;;49936:7;49928:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;55258:10:::2;55248:7;:20;;;;;;;;;;;;:::i;:::-;;55162:114:::0;:::o;49739:29::-;;;;:::o;21300:239::-;21372:7;21392:13;21408:7;:16;21416:7;21408:16;;;;;;;;;;;;;;;;;;;;;21392:32;;21460:1;21443:19;;:5;:19;;;;21435:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21526:5;21519:12;;;21300:239;;;:::o;49695:37::-;;;;:::o;51635:631::-;51683:9;;;;;;;;;;;51675:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51732:11;51758:22;49517:42;51758:62;;51831:16;51850:5;:15;;;51866:10;51850:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51831:46;;51893:9;51888:371;51912:8;51908:1;:12;51888:371;;;51952:1;51945:3;:8;51942:53;;;51974:5;;51942:53;52009:15;52027:5;:25;;;52053:10;52065:1;52027:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52009:58;;52086:7;:16;52094:7;52086:16;;;;;;;;;;;;;;;;;;;;;52082:65;;;52123:8;;;52082:65;52180:4;52161:7;:16;52169:7;52161:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;52199:25;52213:10;52199:13;:25::i;:::-;52246:1;52239:8;;;;;:::i;:::-;;;51927:332;51888:371;51922:3;;;;;:::i;:::-;;;;51888:371;;;;51664:602;;;51635:631::o;49807:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54971:85::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55042:6:::1;55031:8;;:17;;;;;;;;;;;;;;;;;;54971:85:::0;:::o;21030:208::-;21102:7;21147:1;21130:19;;:5;:19;;;;21122:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21214:9;:16;21224:5;21214:16;;;;;;;;;;;;;;;;21207:23;;21030:208;;;:::o;37276:94::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37341:21:::1;37359:1;37341:9;:21::i;:::-;37276:94::o:0;55500:125::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55577:10:::1;55569:24;;:47;55594:21;55569:47;;;;;;;;;;;;;;;;;;;;;;;55561:56;;;::::0;::::1;;55500:125::o:0;36625:87::-;36671:7;36698:6;;;;;;;;;;;36691:13;;36625:87;:::o;52274:630::-;52321:9;;;;;;;;;;;52313:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;52370:11;52396:22;49517:42;52396:62;;52469:16;52488:5;:15;;;52504:10;52488:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52469:46;;52531:9;52526:371;52550:8;52546:1;:12;52526:371;;;52590:1;52583:3;:8;52580:53;;;52612:5;;52580:53;52647:15;52665:5;:25;;;52691:10;52703:1;52665:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52647:58;;52724:7;:16;52732:7;52724:16;;;;;;;;;;;;;;;;;;;;;52720:65;;;52761:8;;;52720:65;52818:4;52799:7;:16;52807:7;52799:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;52837:25;52851:10;52837:13;:25::i;:::-;52884:1;52877:8;;;;;:::i;:::-;;;52565:332;52526:371;52560:3;;;;;:::i;:::-;;;;52526:371;;;;52302:602;;;52274:630::o;21775:104::-;21831:13;21864:7;21857:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21775:104;:::o;55064:90::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55140:6:::1;55128:9;;:18;;;;;;;;;;;;;;;;;;55064:90:::0;:::o;50118:968::-;50184:8;;;;;;;;;;;50176:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50255:1;50244:8;:12;50236:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50339:10;;50328:8;:21;50324:75;;;50377:10;;50366:21;;50324:75;49363:4;50476:6;;50465:8;:17;;;;:::i;:::-;:34;50461:101;;;50544:6;;49363:4;50527:23;;;;:::i;:::-;50516:34;;50461:101;50574:13;50590:18;50599:8;50590;:18::i;:::-;50574:34;;50672:5;50659:9;:18;;50651:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;50719:9;50714:117;50738:8;50734:1;:12;50714:117;;;50768:25;50782:10;50768:13;:25::i;:::-;50818:1;50808:6;;:11;;;;;;;:::i;:::-;;;;;;;;50748:3;;;;;:::i;:::-;;;;50714:117;;;;50896:17;50928:5;50916:9;:17;;;;:::i;:::-;50896:37;;50962:1;50950:9;:13;50946:133;;;50981:12;50999:10;:15;;51022:9;50999:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50980:56;;;51059:7;51051:16;;;;;;50965:114;50946:133;50165:921;;50118:968;:::o;23458:295::-;23573:12;:10;:12::i;:::-;23561:24;;:8;:24;;;;23553:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23673:8;23628:18;:32;23647:12;:10;:12::i;:::-;23628:32;;;;;;;;;;;;;;;:42;23661:8;23628:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23726:8;23697:48;;23712:12;:10;:12::i;:::-;23697:48;;;23736:8;23697:48;;;;;;:::i;:::-;;;;;;;;23458:295;;:::o;49471:88::-;49517:42;49471:88;:::o;24721:328::-;24896:41;24915:12;:10;:12::i;:::-;24929:7;24896:18;:41::i;:::-;24888:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25002:39;25016:4;25022:2;25026:7;25035:5;25002:13;:39::i;:::-;24721:328;;;;:::o;54767:96::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54849:6:::1;54836:10;:19;;;;54767:96:::0;:::o;54218:348::-;54336:13;54399:1;54389:7;:11;:39;;;;;54415:13;:11;:13::i;:::-;54404:7;:24;;54389:39;54367:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;54529:7;54538:18;:7;:16;:18::i;:::-;54512:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54498:60;;54218:348;;;:::o;49660:26::-;;;;;;;;;;;;;:::o;52912:513::-;52958:9;;;;;;;;;;;52950:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;53007:22;49517:42;53007:62;;53080:16;53099:5;:15;;;53115:10;53099:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53080:46;;53142:9;53137:281;53161:8;53157:1;:12;53137:281;;;53191:15;53209:5;:25;;;53235:10;53247:1;53209:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53191:58;;53268:7;:16;53276:7;53268:16;;;;;;;;;;;;;;;;;;;;;53264:65;;;53305:8;;;53264:65;53362:4;53343:7;:16;53351:7;53343:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;53381:25;53395:10;53381:13;:25::i;:::-;53176:242;53137:281;53171:3;;;;;:::i;:::-;;;;53137:281;;;;52939:486;;52912:513::o;49848:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;54050:160::-;54107:7;49363:4;54135:8;:26;;54127:35;;;;;;54192:9;;54180:8;:22;;;;:::i;:::-;54173:29;;54050:160;;;:::o;23824:164::-;23921:4;23945:18;:25;23964:5;23945:25;;;;;;;;;;;;;;;:35;23971:8;23945:35;;;;;;;;;;;;;;;;;;;;;;;;;23938:42;;23824:164;;;;:::o;54596:163::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54666:9:::1;54661:91;54685:8;54681:1;:12;54661:91;;;54715:25;54729:10;54715:13;:25::i;:::-;54695:3;;;;;:::i;:::-;;;;54661:91;;;;54596:163:::0;:::o;37525:192::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37634:1:::1;37614:22;;:8;:22;;;;37606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37690:19;37700:8;37690:9;:19::i;:::-;37525:192:::0;:::o;54871:92::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54950:5:::1;54938:9;:17;;;;54871:92:::0;:::o;55284:67::-;36856:12;:10;:12::i;:::-;36845:23;;:7;:5;:7::i;:::-;:23;;;36837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55339:4:::1;55330:6;;:13;;;;;;;;;;;;;;;;;;55284:67::o:0;16085:98::-;16138:7;16165:10;16158:17;;16085:98;:::o;20661:305::-;20763:4;20815:25;20800:40;;;:11;:40;;;;:105;;;;20872:33;20857:48;;;:11;:48;;;;20800:105;:158;;;;20922:36;20946:11;20922:23;:36::i;:::-;20800:158;20780:178;;20661:305;;;:::o;26559:127::-;26624:4;26676:1;26648:30;;:7;:16;26656:7;26648:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26641:37;;26559:127;;;:::o;30541:174::-;30643:2;30616:15;:24;30632:7;30616:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30699:7;30695:2;30661:46;;30670:23;30685:7;30670:14;:23::i;:::-;30661:46;;;;;;;;;;;;30541:174;;:::o;26853:348::-;26946:4;26971:16;26979:7;26971;:16::i;:::-;26963:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27047:13;27063:23;27078:7;27063:14;:23::i;:::-;27047:39;;27116:5;27105:16;;:7;:16;;;:51;;;;27149:7;27125:31;;:20;27137:7;27125:11;:20::i;:::-;:31;;;27105:51;:87;;;;27160:32;27177:5;27184:7;27160:16;:32::i;:::-;27105:87;27097:96;;;26853:348;;;;:::o;29845:578::-;30004:4;29977:31;;:23;29992:7;29977:14;:23::i;:::-;:31;;;29969:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30087:1;30073:16;;:2;:16;;;;30065:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30143:39;30164:4;30170:2;30174:7;30143:20;:39::i;:::-;30247:29;30264:1;30268:7;30247:8;:29::i;:::-;30308:1;30289:9;:15;30299:4;30289:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30337:1;30320:9;:13;30330:2;30320:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30368:2;30349:7;:16;30357:7;30349:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30407:7;30403:2;30388:27;;30397:4;30388:27;;;;;;;;;;;;29845:578;;;:::o;55657:170::-;55714:21;:9;:19;:21::i;:::-;55746:17;55766:19;:9;:17;:19::i;:::-;55746:39;;55796:23;55802:5;55809:9;55796:5;:23::i;:::-;55703:124;55657:170;:::o;37725:173::-;37781:16;37800:6;;;;;;;;;;;37781:25;;37826:8;37817:6;;:17;;;;;;;;;;;;;;;;;;37881:8;37850:40;;37871:8;37850:40;;;;;;;;;;;;37770:128;37725:173;:::o;25931:315::-;26088:28;26098:4;26104:2;26108:7;26088:9;:28::i;:::-;26135:48;26158:4;26164:2;26168:7;26177:5;26135:22;:48::i;:::-;26127:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25931:315;;;;:::o;16614:723::-;16670:13;16900:1;16891:5;:10;16887:53;;;16918:10;;;;;;;;;;;;;;;;;;;;;16887:53;16950:12;16965:5;16950:20;;16981:14;17006:78;17021:1;17013:4;:9;17006:78;;17039:8;;;;;:::i;:::-;;;;17070:2;17062:10;;;;;:::i;:::-;;;17006:78;;;17094:19;17126:6;17116:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17094:39;;17144:154;17160:1;17151:5;:10;17144:154;;17188:1;17178:11;;;;;:::i;:::-;;;17255:2;17247:5;:10;;;;:::i;:::-;17234:2;:24;;;;:::i;:::-;17221:39;;17204:6;17211;17204:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17284:2;17275:11;;;;;:::i;:::-;;;17144:154;;;17322:6;17308:21;;;;;16614:723;;;;:::o;19173:157::-;19258:4;19297:25;19282:40;;;:11;:40;;;;19275:47;;19173:157;;;:::o;44526:589::-;44670:45;44697:4;44703:2;44707:7;44670:26;:45::i;:::-;44748:1;44732:18;;:4;:18;;;44728:187;;;44767:40;44799:7;44767:31;:40::i;:::-;44728:187;;;44837:2;44829:10;;:4;:10;;;44825:90;;44856:47;44889:4;44895:7;44856:32;:47::i;:::-;44825:90;44728:187;44943:1;44929:16;;:2;:16;;;44925:183;;;44962:45;44999:7;44962:36;:45::i;:::-;44925:183;;;45035:4;45029:10;;:2;:10;;;45025:83;;45056:40;45084:2;45088:7;45056:27;:40::i;:::-;45025:83;44925:183;44526:589;;;:::o;38848:127::-;38955:1;38937:7;:14;;;:19;;;;;;;;;;;38848:127;:::o;38726:114::-;38791:7;38818;:14;;;38811:21;;38726:114;;;:::o;28537:382::-;28631:1;28617:16;;:2;:16;;;;28609:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28690:16;28698:7;28690;:16::i;:::-;28689:17;28681:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28752:45;28781:1;28785:2;28789:7;28752:20;:45::i;:::-;28827:1;28810:9;:13;28820:2;28810:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28858:2;28839:7;:16;28847:7;28839:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28903:7;28899:2;28878:33;;28895:1;28878:33;;;;;;;;;;;;28537:382;;:::o;31280:799::-;31435:4;31456:15;:2;:13;;;:15::i;:::-;31452:620;;;31508:2;31492:36;;;31529:12;:10;:12::i;:::-;31543:4;31549:7;31558:5;31492:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31488:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31751:1;31734:6;:13;:18;31730:272;;;31777:60;;;;;;;;;;:::i;:::-;;;;;;;;31730:272;31952:6;31946:13;31937:6;31933:2;31929:15;31922:38;31488:529;31625:41;;;31615:51;;;:6;:51;;;;31608:58;;;;;31452:620;32056:4;32049:11;;31280:799;;;;;;;:::o;32651:126::-;;;;:::o;45838:164::-;45942:10;:17;;;;45915:15;:24;45931:7;45915:24;;;;;;;;;;;:44;;;;45970:10;45986:7;45970:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45838:164;:::o;46629:988::-;46895:22;46945:1;46920:22;46937:4;46920:16;:22::i;:::-;:26;;;;:::i;:::-;46895:51;;46957:18;46978:17;:26;46996:7;46978:26;;;;;;;;;;;;46957:47;;47125:14;47111:10;:28;47107:328;;47156:19;47178:12;:18;47191:4;47178:18;;;;;;;;;;;;;;;:34;47197:14;47178:34;;;;;;;;;;;;47156:56;;47262:11;47229:12;:18;47242:4;47229:18;;;;;;;;;;;;;;;:30;47248:10;47229:30;;;;;;;;;;;:44;;;;47379:10;47346:17;:30;47364:11;47346:30;;;;;;;;;;;:43;;;;47141:294;47107:328;47531:17;:26;47549:7;47531:26;;;;;;;;;;;47524:33;;;47575:12;:18;47588:4;47575:18;;;;;;;;;;;;;;;:34;47594:14;47575:34;;;;;;;;;;;47568:41;;;46710:907;;46629:988;;:::o;47912:1079::-;48165:22;48210:1;48190:10;:17;;;;:21;;;;:::i;:::-;48165:46;;48222:18;48243:15;:24;48259:7;48243:24;;;;;;;;;;;;48222:45;;48594:19;48616:10;48627:14;48616:26;;;;;;;;:::i;:::-;;;;;;;;;;48594:48;;48680:11;48655:10;48666;48655:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48791:10;48760:15;:28;48776:11;48760:28;;;;;;;;;;;:41;;;;48932:15;:24;48948:7;48932:24;;;;;;;;;;;48925:31;;;48967:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47983:1008;;;47912:1079;:::o;45416:221::-;45501:14;45518:20;45535:2;45518:16;:20::i;:::-;45501:37;;45576:7;45549:12;:16;45562:2;45549:16;;;;;;;;;;;;;;;:24;45566:6;45549:24;;;;;;;;;;;:34;;;;45623:6;45594:17;:26;45612:7;45594:26;;;;;;;;;;;:35;;;;45490:147;45416:221;;:::o;8125:387::-;8185:4;8393:12;8460:7;8448:20;8440:28;;8503:1;8496:4;:8;8489:15;;;8125:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:143::-;2334:5;2365:6;2359:13;2350:22;;2381:33;2408:5;2381:33;:::i;:::-;2277:143;;;;:::o;2426:329::-;2485:6;2534:2;2522:9;2513:7;2509:23;2505:32;2502:119;;;2540:79;;:::i;:::-;2502:119;2660:1;2685:53;2730:7;2721:6;2710:9;2706:22;2685:53;:::i;:::-;2675:63;;2631:117;2426:329;;;;:::o;2761:474::-;2829:6;2837;2886:2;2874:9;2865:7;2861:23;2857:32;2854:119;;;2892:79;;:::i;:::-;2854:119;3012:1;3037:53;3082:7;3073:6;3062:9;3058:22;3037:53;:::i;:::-;3027:63;;2983:117;3139:2;3165:53;3210:7;3201:6;3190:9;3186:22;3165:53;:::i;:::-;3155:63;;3110:118;2761:474;;;;;:::o;3241:619::-;3318:6;3326;3334;3383:2;3371:9;3362:7;3358:23;3354:32;3351:119;;;3389:79;;:::i;:::-;3351:119;3509:1;3534:53;3579:7;3570:6;3559:9;3555:22;3534:53;:::i;:::-;3524:63;;3480:117;3636:2;3662:53;3707:7;3698:6;3687:9;3683:22;3662:53;:::i;:::-;3652:63;;3607:118;3764:2;3790:53;3835:7;3826:6;3815:9;3811:22;3790:53;:::i;:::-;3780:63;;3735:118;3241:619;;;;;:::o;3866:943::-;3961:6;3969;3977;3985;4034:3;4022:9;4013:7;4009:23;4005:33;4002:120;;;4041:79;;:::i;:::-;4002:120;4161:1;4186:53;4231:7;4222:6;4211:9;4207:22;4186:53;:::i;:::-;4176:63;;4132:117;4288:2;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4259:118;4416:2;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4387:118;4572:2;4561:9;4557:18;4544:32;4603:18;4595:6;4592:30;4589:117;;;4625:79;;:::i;:::-;4589:117;4730:62;4784:7;4775:6;4764:9;4760:22;4730:62;:::i;:::-;4720:72;;4515:287;3866:943;;;;;;;:::o;4815:468::-;4880:6;4888;4937:2;4925:9;4916:7;4912:23;4908:32;4905:119;;;4943:79;;:::i;:::-;4905:119;5063:1;5088:53;5133:7;5124:6;5113:9;5109:22;5088:53;:::i;:::-;5078:63;;5034:117;5190:2;5216:50;5258:7;5249:6;5238:9;5234:22;5216:50;:::i;:::-;5206:60;;5161:115;4815:468;;;;;:::o;5289:474::-;5357:6;5365;5414:2;5402:9;5393:7;5389:23;5385:32;5382:119;;;5420:79;;:::i;:::-;5382:119;5540:1;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5511:117;5667:2;5693:53;5738:7;5729:6;5718:9;5714:22;5693:53;:::i;:::-;5683:63;;5638:118;5289:474;;;;;:::o;5769:323::-;5825:6;5874:2;5862:9;5853:7;5849:23;5845:32;5842:119;;;5880:79;;:::i;:::-;5842:119;6000:1;6025:50;6067:7;6058:6;6047:9;6043:22;6025:50;:::i;:::-;6015:60;;5971:114;5769:323;;;;:::o;6098:327::-;6156:6;6205:2;6193:9;6184:7;6180:23;6176:32;6173:119;;;6211:79;;:::i;:::-;6173:119;6331:1;6356:52;6400:7;6391:6;6380:9;6376:22;6356:52;:::i;:::-;6346:62;;6302:116;6098:327;;;;:::o;6431:349::-;6500:6;6549:2;6537:9;6528:7;6524:23;6520:32;6517:119;;;6555:79;;:::i;:::-;6517:119;6675:1;6700:63;6755:7;6746:6;6735:9;6731:22;6700:63;:::i;:::-;6690:73;;6646:127;6431:349;;;;:::o;6786:509::-;6855:6;6904:2;6892:9;6883:7;6879:23;6875:32;6872:119;;;6910:79;;:::i;:::-;6872:119;7058:1;7047:9;7043:17;7030:31;7088:18;7080:6;7077:30;7074:117;;;7110:79;;:::i;:::-;7074:117;7215:63;7270:7;7261:6;7250:9;7246:22;7215:63;:::i;:::-;7205:73;;7001:287;6786:509;;;;:::o;7301:329::-;7360:6;7409:2;7397:9;7388:7;7384:23;7380:32;7377:119;;;7415:79;;:::i;:::-;7377:119;7535:1;7560:53;7605:7;7596:6;7585:9;7581:22;7560:53;:::i;:::-;7550:63;;7506:117;7301:329;;;;:::o;7636:351::-;7706:6;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7881:1;7906:64;7962:7;7953:6;7942:9;7938:22;7906:64;:::i;:::-;7896:74;;7852:128;7636:351;;;;:::o;7993:474::-;8061:6;8069;8118:2;8106:9;8097:7;8093:23;8089:32;8086:119;;;8124:79;;:::i;:::-;8086:119;8244:1;8269:53;8314:7;8305:6;8294:9;8290:22;8269:53;:::i;:::-;8259:63;;8215:117;8371:2;8397:53;8442:7;8433:6;8422:9;8418:22;8397:53;:::i;:::-;8387:63;;8342:118;7993:474;;;;;:::o;8473:118::-;8560:24;8578:5;8560:24;:::i;:::-;8555:3;8548:37;8473:118;;:::o;8597:109::-;8678:21;8693:5;8678:21;:::i;:::-;8673:3;8666:34;8597:109;;:::o;8712:360::-;8798:3;8826:38;8858:5;8826:38;:::i;:::-;8880:70;8943:6;8938:3;8880:70;:::i;:::-;8873:77;;8959:52;9004:6;8999:3;8992:4;8985:5;8981:16;8959:52;:::i;:::-;9036:29;9058:6;9036:29;:::i;:::-;9031:3;9027:39;9020:46;;8802:270;8712:360;;;;:::o;9078:364::-;9166:3;9194:39;9227:5;9194:39;:::i;:::-;9249:71;9313:6;9308:3;9249:71;:::i;:::-;9242:78;;9329:52;9374:6;9369:3;9362:4;9355:5;9351:16;9329:52;:::i;:::-;9406:29;9428:6;9406:29;:::i;:::-;9401:3;9397:39;9390:46;;9170:272;9078:364;;;;:::o;9448:377::-;9554:3;9582:39;9615:5;9582:39;:::i;:::-;9637:89;9719:6;9714:3;9637:89;:::i;:::-;9630:96;;9735:52;9780:6;9775:3;9768:4;9761:5;9757:16;9735:52;:::i;:::-;9812:6;9807:3;9803:16;9796:23;;9558:267;9448:377;;;;:::o;9855:845::-;9958:3;9995:5;9989:12;10024:36;10050:9;10024:36;:::i;:::-;10076:89;10158:6;10153:3;10076:89;:::i;:::-;10069:96;;10196:1;10185:9;10181:17;10212:1;10207:137;;;;10358:1;10353:341;;;;10174:520;;10207:137;10291:4;10287:9;10276;10272:25;10267:3;10260:38;10327:6;10322:3;10318:16;10311:23;;10207:137;;10353:341;10420:38;10452:5;10420:38;:::i;:::-;10480:1;10494:154;10508:6;10505:1;10502:13;10494:154;;;10582:7;10576:14;10572:1;10567:3;10563:11;10556:35;10632:1;10623:7;10619:15;10608:26;;10530:4;10527:1;10523:12;10518:17;;10494:154;;;10677:6;10672:3;10668:16;10661:23;;10360:334;;10174:520;;9962:738;;9855:845;;;;:::o;10706:366::-;10848:3;10869:67;10933:2;10928:3;10869:67;:::i;:::-;10862:74;;10945:93;11034:3;10945:93;:::i;:::-;11063:2;11058:3;11054:12;11047:19;;10706:366;;;:::o;11078:::-;11220:3;11241:67;11305:2;11300:3;11241:67;:::i;:::-;11234:74;;11317:93;11406:3;11317:93;:::i;:::-;11435:2;11430:3;11426:12;11419:19;;11078:366;;;:::o;11450:::-;11592:3;11613:67;11677:2;11672:3;11613:67;:::i;:::-;11606:74;;11689:93;11778:3;11689:93;:::i;:::-;11807:2;11802:3;11798:12;11791:19;;11450:366;;;:::o;11822:::-;11964:3;11985:67;12049:2;12044:3;11985:67;:::i;:::-;11978:74;;12061:93;12150:3;12061:93;:::i;:::-;12179:2;12174:3;12170:12;12163:19;;11822:366;;;:::o;12194:::-;12336:3;12357:67;12421:2;12416:3;12357:67;:::i;:::-;12350:74;;12433:93;12522:3;12433:93;:::i;:::-;12551:2;12546:3;12542:12;12535:19;;12194:366;;;:::o;12566:::-;12708:3;12729:67;12793:2;12788:3;12729:67;:::i;:::-;12722:74;;12805:93;12894:3;12805:93;:::i;:::-;12923:2;12918:3;12914:12;12907:19;;12566:366;;;:::o;12938:::-;13080:3;13101:67;13165:2;13160:3;13101:67;:::i;:::-;13094:74;;13177:93;13266:3;13177:93;:::i;:::-;13295:2;13290:3;13286:12;13279:19;;12938:366;;;:::o;13310:::-;13452:3;13473:67;13537:2;13532:3;13473:67;:::i;:::-;13466:74;;13549:93;13638:3;13549:93;:::i;:::-;13667:2;13662:3;13658:12;13651:19;;13310:366;;;:::o;13682:::-;13824:3;13845:67;13909:2;13904:3;13845:67;:::i;:::-;13838:74;;13921:93;14010:3;13921:93;:::i;:::-;14039:2;14034:3;14030:12;14023:19;;13682:366;;;:::o;14054:::-;14196:3;14217:67;14281:2;14276:3;14217:67;:::i;:::-;14210:74;;14293:93;14382:3;14293:93;:::i;:::-;14411:2;14406:3;14402:12;14395:19;;14054:366;;;:::o;14426:::-;14568:3;14589:67;14653:2;14648:3;14589:67;:::i;:::-;14582:74;;14665:93;14754:3;14665:93;:::i;:::-;14783:2;14778:3;14774:12;14767:19;;14426:366;;;:::o;14798:::-;14940:3;14961:67;15025:2;15020:3;14961:67;:::i;:::-;14954:74;;15037:93;15126:3;15037:93;:::i;:::-;15155:2;15150:3;15146:12;15139:19;;14798:366;;;:::o;15170:::-;15312:3;15333:67;15397:2;15392:3;15333:67;:::i;:::-;15326:74;;15409:93;15498:3;15409:93;:::i;:::-;15527:2;15522:3;15518:12;15511:19;;15170:366;;;:::o;15542:::-;15684:3;15705:67;15769:2;15764:3;15705:67;:::i;:::-;15698:74;;15781:93;15870:3;15781:93;:::i;:::-;15899:2;15894:3;15890:12;15883:19;;15542:366;;;:::o;15914:::-;16056:3;16077:67;16141:2;16136:3;16077:67;:::i;:::-;16070:74;;16153:93;16242:3;16153:93;:::i;:::-;16271:2;16266:3;16262:12;16255:19;;15914:366;;;:::o;16286:::-;16428:3;16449:67;16513:2;16508:3;16449:67;:::i;:::-;16442:74;;16525:93;16614:3;16525:93;:::i;:::-;16643:2;16638:3;16634:12;16627:19;;16286:366;;;:::o;16658:::-;16800:3;16821:67;16885:2;16880:3;16821:67;:::i;:::-;16814:74;;16897:93;16986:3;16897:93;:::i;:::-;17015:2;17010:3;17006:12;16999:19;;16658:366;;;:::o;17030:::-;17172:3;17193:67;17257:2;17252:3;17193:67;:::i;:::-;17186:74;;17269:93;17358:3;17269:93;:::i;:::-;17387:2;17382:3;17378:12;17371:19;;17030:366;;;:::o;17402:::-;17544:3;17565:67;17629:2;17624:3;17565:67;:::i;:::-;17558:74;;17641:93;17730:3;17641:93;:::i;:::-;17759:2;17754:3;17750:12;17743:19;;17402:366;;;:::o;17774:::-;17916:3;17937:67;18001:2;17996:3;17937:67;:::i;:::-;17930:74;;18013:93;18102:3;18013:93;:::i;:::-;18131:2;18126:3;18122:12;18115:19;;17774:366;;;:::o;18146:398::-;18305:3;18326:83;18407:1;18402:3;18326:83;:::i;:::-;18319:90;;18418:93;18507:3;18418:93;:::i;:::-;18536:1;18531:3;18527:11;18520:18;;18146:398;;;:::o;18550:366::-;18692:3;18713:67;18777:2;18772:3;18713:67;:::i;:::-;18706:74;;18789:93;18878:3;18789:93;:::i;:::-;18907:2;18902:3;18898:12;18891:19;;18550:366;;;:::o;18922:::-;19064:3;19085:67;19149:2;19144:3;19085:67;:::i;:::-;19078:74;;19161:93;19250:3;19161:93;:::i;:::-;19279:2;19274:3;19270:12;19263:19;;18922:366;;;:::o;19294:::-;19436:3;19457:67;19521:2;19516:3;19457:67;:::i;:::-;19450:74;;19533:93;19622:3;19533:93;:::i;:::-;19651:2;19646:3;19642:12;19635:19;;19294:366;;;:::o;19666:118::-;19753:24;19771:5;19753:24;:::i;:::-;19748:3;19741:37;19666:118;;:::o;19790:429::-;19967:3;19989:92;20077:3;20068:6;19989:92;:::i;:::-;19982:99;;20098:95;20189:3;20180:6;20098:95;:::i;:::-;20091:102;;20210:3;20203:10;;19790:429;;;;;:::o;20225:379::-;20409:3;20431:147;20574:3;20431:147;:::i;:::-;20424:154;;20595:3;20588:10;;20225:379;;;:::o;20610:222::-;20703:4;20741:2;20730:9;20726:18;20718:26;;20754:71;20822:1;20811:9;20807:17;20798:6;20754:71;:::i;:::-;20610:222;;;;:::o;20838:640::-;21033:4;21071:3;21060:9;21056:19;21048:27;;21085:71;21153:1;21142:9;21138:17;21129:6;21085:71;:::i;:::-;21166:72;21234:2;21223:9;21219:18;21210:6;21166:72;:::i;:::-;21248;21316:2;21305:9;21301:18;21292:6;21248:72;:::i;:::-;21367:9;21361:4;21357:20;21352:2;21341:9;21337:18;21330:48;21395:76;21466:4;21457:6;21395:76;:::i;:::-;21387:84;;20838:640;;;;;;;:::o;21484:332::-;21605:4;21643:2;21632:9;21628:18;21620:26;;21656:71;21724:1;21713:9;21709:17;21700:6;21656:71;:::i;:::-;21737:72;21805:2;21794:9;21790:18;21781:6;21737:72;:::i;:::-;21484:332;;;;;:::o;21822:210::-;21909:4;21947:2;21936:9;21932:18;21924:26;;21960:65;22022:1;22011:9;22007:17;21998:6;21960:65;:::i;:::-;21822:210;;;;:::o;22038:313::-;22151:4;22189:2;22178:9;22174:18;22166:26;;22238:9;22232:4;22228:20;22224:1;22213:9;22209:17;22202:47;22266:78;22339:4;22330:6;22266:78;:::i;:::-;22258:86;;22038:313;;;;:::o;22357:419::-;22523:4;22561:2;22550:9;22546:18;22538:26;;22610:9;22604:4;22600:20;22596:1;22585:9;22581:17;22574:47;22638:131;22764:4;22638:131;:::i;:::-;22630:139;;22357:419;;;:::o;22782:::-;22948:4;22986:2;22975:9;22971:18;22963:26;;23035:9;23029:4;23025:20;23021:1;23010:9;23006:17;22999:47;23063:131;23189:4;23063:131;:::i;:::-;23055:139;;22782:419;;;:::o;23207:::-;23373:4;23411:2;23400:9;23396:18;23388:26;;23460:9;23454:4;23450:20;23446:1;23435:9;23431:17;23424:47;23488:131;23614:4;23488:131;:::i;:::-;23480:139;;23207:419;;;:::o;23632:::-;23798:4;23836:2;23825:9;23821:18;23813:26;;23885:9;23879:4;23875:20;23871:1;23860:9;23856:17;23849:47;23913:131;24039:4;23913:131;:::i;:::-;23905:139;;23632:419;;;:::o;24057:::-;24223:4;24261:2;24250:9;24246:18;24238:26;;24310:9;24304:4;24300:20;24296:1;24285:9;24281:17;24274:47;24338:131;24464:4;24338:131;:::i;:::-;24330:139;;24057:419;;;:::o;24482:::-;24648:4;24686:2;24675:9;24671:18;24663:26;;24735:9;24729:4;24725:20;24721:1;24710:9;24706:17;24699:47;24763:131;24889:4;24763:131;:::i;:::-;24755:139;;24482:419;;;:::o;24907:::-;25073:4;25111:2;25100:9;25096:18;25088:26;;25160:9;25154:4;25150:20;25146:1;25135:9;25131:17;25124:47;25188:131;25314:4;25188:131;:::i;:::-;25180:139;;24907:419;;;:::o;25332:::-;25498:4;25536:2;25525:9;25521:18;25513:26;;25585:9;25579:4;25575:20;25571:1;25560:9;25556:17;25549:47;25613:131;25739:4;25613:131;:::i;:::-;25605:139;;25332:419;;;:::o;25757:::-;25923:4;25961:2;25950:9;25946:18;25938:26;;26010:9;26004:4;26000:20;25996:1;25985:9;25981:17;25974:47;26038:131;26164:4;26038:131;:::i;:::-;26030:139;;25757:419;;;:::o;26182:::-;26348:4;26386:2;26375:9;26371:18;26363:26;;26435:9;26429:4;26425:20;26421:1;26410:9;26406:17;26399:47;26463:131;26589:4;26463:131;:::i;:::-;26455:139;;26182:419;;;:::o;26607:::-;26773:4;26811:2;26800:9;26796:18;26788:26;;26860:9;26854:4;26850:20;26846:1;26835:9;26831:17;26824:47;26888:131;27014:4;26888:131;:::i;:::-;26880:139;;26607:419;;;:::o;27032:::-;27198:4;27236:2;27225:9;27221:18;27213:26;;27285:9;27279:4;27275:20;27271:1;27260:9;27256:17;27249:47;27313:131;27439:4;27313:131;:::i;:::-;27305:139;;27032:419;;;:::o;27457:::-;27623:4;27661:2;27650:9;27646:18;27638:26;;27710:9;27704:4;27700:20;27696:1;27685:9;27681:17;27674:47;27738:131;27864:4;27738:131;:::i;:::-;27730:139;;27457:419;;;:::o;27882:::-;28048:4;28086:2;28075:9;28071:18;28063:26;;28135:9;28129:4;28125:20;28121:1;28110:9;28106:17;28099:47;28163:131;28289:4;28163:131;:::i;:::-;28155:139;;27882:419;;;:::o;28307:::-;28473:4;28511:2;28500:9;28496:18;28488:26;;28560:9;28554:4;28550:20;28546:1;28535:9;28531:17;28524:47;28588:131;28714:4;28588:131;:::i;:::-;28580:139;;28307:419;;;:::o;28732:::-;28898:4;28936:2;28925:9;28921:18;28913:26;;28985:9;28979:4;28975:20;28971:1;28960:9;28956:17;28949:47;29013:131;29139:4;29013:131;:::i;:::-;29005:139;;28732:419;;;:::o;29157:::-;29323:4;29361:2;29350:9;29346:18;29338:26;;29410:9;29404:4;29400:20;29396:1;29385:9;29381:17;29374:47;29438:131;29564:4;29438:131;:::i;:::-;29430:139;;29157:419;;;:::o;29582:::-;29748:4;29786:2;29775:9;29771:18;29763:26;;29835:9;29829:4;29825:20;29821:1;29810:9;29806:17;29799:47;29863:131;29989:4;29863:131;:::i;:::-;29855:139;;29582:419;;;:::o;30007:::-;30173:4;30211:2;30200:9;30196:18;30188:26;;30260:9;30254:4;30250:20;30246:1;30235:9;30231:17;30224:47;30288:131;30414:4;30288:131;:::i;:::-;30280:139;;30007:419;;;:::o;30432:::-;30598:4;30636:2;30625:9;30621:18;30613:26;;30685:9;30679:4;30675:20;30671:1;30660:9;30656:17;30649:47;30713:131;30839:4;30713:131;:::i;:::-;30705:139;;30432:419;;;:::o;30857:::-;31023:4;31061:2;31050:9;31046:18;31038:26;;31110:9;31104:4;31100:20;31096:1;31085:9;31081:17;31074:47;31138:131;31264:4;31138:131;:::i;:::-;31130:139;;30857:419;;;:::o;31282:::-;31448:4;31486:2;31475:9;31471:18;31463:26;;31535:9;31529:4;31525:20;31521:1;31510:9;31506:17;31499:47;31563:131;31689:4;31563:131;:::i;:::-;31555:139;;31282:419;;;:::o;31707:::-;31873:4;31911:2;31900:9;31896:18;31888:26;;31960:9;31954:4;31950:20;31946:1;31935:9;31931:17;31924:47;31988:131;32114:4;31988:131;:::i;:::-;31980:139;;31707:419;;;:::o;32132:222::-;32225:4;32263:2;32252:9;32248:18;32240:26;;32276:71;32344:1;32333:9;32329:17;32320:6;32276:71;:::i;:::-;32132:222;;;;:::o;32360:129::-;32394:6;32421:20;;:::i;:::-;32411:30;;32450:33;32478:4;32470:6;32450:33;:::i;:::-;32360:129;;;:::o;32495:75::-;32528:6;32561:2;32555:9;32545:19;;32495:75;:::o;32576:307::-;32637:4;32727:18;32719:6;32716:30;32713:56;;;32749:18;;:::i;:::-;32713:56;32787:29;32809:6;32787:29;:::i;:::-;32779:37;;32871:4;32865;32861:15;32853:23;;32576:307;;;:::o;32889:308::-;32951:4;33041:18;33033:6;33030:30;33027:56;;;33063:18;;:::i;:::-;33027:56;33101:29;33123:6;33101:29;:::i;:::-;33093:37;;33185:4;33179;33175:15;33167:23;;32889:308;;;:::o;33203:141::-;33252:4;33275:3;33267:11;;33298:3;33295:1;33288:14;33332:4;33329:1;33319:18;33311:26;;33203:141;;;:::o;33350:98::-;33401:6;33435:5;33429:12;33419:22;;33350:98;;;:::o;33454:99::-;33506:6;33540:5;33534:12;33524:22;;33454:99;;;:::o;33559:168::-;33642:11;33676:6;33671:3;33664:19;33716:4;33711:3;33707:14;33692:29;;33559:168;;;;:::o;33733:147::-;33834:11;33871:3;33856:18;;33733:147;;;;:::o;33886:169::-;33970:11;34004:6;33999:3;33992:19;34044:4;34039:3;34035:14;34020:29;;33886:169;;;;:::o;34061:148::-;34163:11;34200:3;34185:18;;34061:148;;;;:::o;34215:305::-;34255:3;34274:20;34292:1;34274:20;:::i;:::-;34269:25;;34308:20;34326:1;34308:20;:::i;:::-;34303:25;;34462:1;34394:66;34390:74;34387:1;34384:81;34381:107;;;34468:18;;:::i;:::-;34381:107;34512:1;34509;34505:9;34498:16;;34215:305;;;;:::o;34526:185::-;34566:1;34583:20;34601:1;34583:20;:::i;:::-;34578:25;;34617:20;34635:1;34617:20;:::i;:::-;34612:25;;34656:1;34646:35;;34661:18;;:::i;:::-;34646:35;34703:1;34700;34696:9;34691:14;;34526:185;;;;:::o;34717:348::-;34757:7;34780:20;34798:1;34780:20;:::i;:::-;34775:25;;34814:20;34832:1;34814:20;:::i;:::-;34809:25;;35002:1;34934:66;34930:74;34927:1;34924:81;34919:1;34912:9;34905:17;34901:105;34898:131;;;35009:18;;:::i;:::-;34898:131;35057:1;35054;35050:9;35039:20;;34717:348;;;;:::o;35071:191::-;35111:4;35131:20;35149:1;35131:20;:::i;:::-;35126:25;;35165:20;35183:1;35165:20;:::i;:::-;35160:25;;35204:1;35201;35198:8;35195:34;;;35209:18;;:::i;:::-;35195:34;35254:1;35251;35247:9;35239:17;;35071:191;;;;:::o;35268:96::-;35305:7;35334:24;35352:5;35334:24;:::i;:::-;35323:35;;35268:96;;;:::o;35370:90::-;35404:7;35447:5;35440:13;35433:21;35422:32;;35370:90;;;:::o;35466:149::-;35502:7;35542:66;35535:5;35531:78;35520:89;;35466:149;;;:::o;35621:126::-;35658:7;35698:42;35691:5;35687:54;35676:65;;35621:126;;;:::o;35753:77::-;35790:7;35819:5;35808:16;;35753:77;;;:::o;35836:154::-;35920:6;35915:3;35910;35897:30;35982:1;35973:6;35968:3;35964:16;35957:27;35836:154;;;:::o;35996:307::-;36064:1;36074:113;36088:6;36085:1;36082:13;36074:113;;;36173:1;36168:3;36164:11;36158:18;36154:1;36149:3;36145:11;36138:39;36110:2;36107:1;36103:10;36098:15;;36074:113;;;36205:6;36202:1;36199:13;36196:101;;;36285:1;36276:6;36271:3;36267:16;36260:27;36196:101;36045:258;35996:307;;;:::o;36309:320::-;36353:6;36390:1;36384:4;36380:12;36370:22;;36437:1;36431:4;36427:12;36458:18;36448:81;;36514:4;36506:6;36502:17;36492:27;;36448:81;36576:2;36568:6;36565:14;36545:18;36542:38;36539:84;;;36595:18;;:::i;:::-;36539:84;36360:269;36309:320;;;:::o;36635:281::-;36718:27;36740:4;36718:27;:::i;:::-;36710:6;36706:40;36848:6;36836:10;36833:22;36812:18;36800:10;36797:34;36794:62;36791:88;;;36859:18;;:::i;:::-;36791:88;36899:10;36895:2;36888:22;36678:238;36635:281;;:::o;36922:233::-;36961:3;36984:24;37002:5;36984:24;:::i;:::-;36975:33;;37030:66;37023:5;37020:77;37017:103;;;37100:18;;:::i;:::-;37017:103;37147:1;37140:5;37136:13;37129:20;;36922:233;;;:::o;37161:176::-;37193:1;37210:20;37228:1;37210:20;:::i;:::-;37205:25;;37244:20;37262:1;37244:20;:::i;:::-;37239:25;;37283:1;37273:35;;37288:18;;:::i;:::-;37273:35;37329:1;37326;37322:9;37317:14;;37161:176;;;;:::o;37343:180::-;37391:77;37388:1;37381:88;37488:4;37485:1;37478:15;37512:4;37509:1;37502:15;37529:180;37577:77;37574:1;37567:88;37674:4;37671:1;37664:15;37698:4;37695:1;37688:15;37715:180;37763:77;37760:1;37753:88;37860:4;37857:1;37850:15;37884:4;37881:1;37874:15;37901:180;37949:77;37946:1;37939:88;38046:4;38043:1;38036:15;38070:4;38067:1;38060:15;38087:180;38135:77;38132:1;38125:88;38232:4;38229:1;38222:15;38256:4;38253:1;38246:15;38273:180;38321:77;38318:1;38311:88;38418:4;38415:1;38408:15;38442:4;38439:1;38432:15;38459:117;38568:1;38565;38558:12;38582:117;38691:1;38688;38681:12;38705:117;38814:1;38811;38804:12;38828:117;38937:1;38934;38927:12;38951:102;38992:6;39043:2;39039:7;39034:2;39027:5;39023:14;39019:28;39009:38;;38951:102;;;:::o;39059:174::-;39199:26;39195:1;39187:6;39183:14;39176:50;39059:174;:::o;39239:181::-;39379:33;39375:1;39367:6;39363:14;39356:57;39239:181;:::o;39426:230::-;39566:34;39562:1;39554:6;39550:14;39543:58;39635:13;39630:2;39622:6;39618:15;39611:38;39426:230;:::o;39662:237::-;39802:34;39798:1;39790:6;39786:14;39779:58;39871:20;39866:2;39858:6;39854:15;39847:45;39662:237;:::o;39905:225::-;40045:34;40041:1;40033:6;40029:14;40022:58;40114:8;40109:2;40101:6;40097:15;40090:33;39905:225;:::o;40136:178::-;40276:30;40272:1;40264:6;40260:14;40253:54;40136:178;:::o;40320:223::-;40460:34;40456:1;40448:6;40444:14;40437:58;40529:6;40524:2;40516:6;40512:15;40505:31;40320:223;:::o;40549:175::-;40689:27;40685:1;40677:6;40673:14;40666:51;40549:175;:::o;40730:231::-;40870:34;40866:1;40858:6;40854:14;40847:58;40939:14;40934:2;40926:6;40922:15;40915:39;40730:231;:::o;40967:174::-;41107:26;41103:1;41095:6;41091:14;41084:50;40967:174;:::o;41147:243::-;41287:34;41283:1;41275:6;41271:14;41264:58;41356:26;41351:2;41343:6;41339:15;41332:51;41147:243;:::o;41396:229::-;41536:34;41532:1;41524:6;41520:14;41513:58;41605:12;41600:2;41592:6;41588:15;41581:37;41396:229;:::o;41631:228::-;41771:34;41767:1;41759:6;41755:14;41748:58;41840:11;41835:2;41827:6;41823:15;41816:36;41631:228;:::o;41865:182::-;42005:34;42001:1;41993:6;41989:14;41982:58;41865:182;:::o;42053:231::-;42193:34;42189:1;42181:6;42177:14;42170:58;42262:14;42257:2;42249:6;42245:15;42238:39;42053:231;:::o;42290:182::-;42430:34;42426:1;42418:6;42414:14;42407:58;42290:182;:::o;42478:228::-;42618:34;42614:1;42606:6;42602:14;42595:58;42687:11;42682:2;42674:6;42670:15;42663:36;42478:228;:::o;42712:169::-;42852:21;42848:1;42840:6;42836:14;42829:45;42712:169;:::o;42887:220::-;43027:34;43023:1;43015:6;43011:14;43004:58;43096:3;43091:2;43083:6;43079:15;43072:28;42887:220;:::o;43113:177::-;43253:29;43249:1;43241:6;43237:14;43230:53;43113:177;:::o;43296:114::-;;:::o;43416:236::-;43556:34;43552:1;43544:6;43540:14;43533:58;43625:19;43620:2;43612:6;43608:15;43601:44;43416:236;:::o;43658:231::-;43798:34;43794:1;43786:6;43782:14;43775:58;43867:14;43862:2;43854:6;43850:15;43843:39;43658:231;:::o;43895:178::-;44035:30;44031:1;44023:6;44019:14;44012:54;43895:178;:::o;44079:122::-;44152:24;44170:5;44152:24;:::i;:::-;44145:5;44142:35;44132:63;;44191:1;44188;44181:12;44132:63;44079:122;:::o;44207:116::-;44277:21;44292:5;44277:21;:::i;:::-;44270:5;44267:32;44257:60;;44313:1;44310;44303:12;44257:60;44207:116;:::o;44329:120::-;44401:23;44418:5;44401:23;:::i;:::-;44394:5;44391:34;44381:62;;44439:1;44436;44429:12;44381:62;44329:120;:::o;44455:122::-;44528:24;44546:5;44528:24;:::i;:::-;44521:5;44518:35;44508:63;;44567:1;44564;44557:12;44508:63;44455:122;:::o

Swarm Source

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