ETH Price: $3,457.08 (-1.83%)
Gas: 3 Gwei

Token

BentoBox (BENTOBOXNFT)
 

Overview

Max Total Supply

556 BENTOBOXNFT

Holders

201

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 BENTOBOXNFT
0x9784a3B26FAB7dfACdcB019B19fEaaE3373a5CE5
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:
BentoBox

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-04
*/

/**
 *Submitted for verification at Etherscan.io on 2021-10-04
*/

// Sources flattened with hardhat v2.6.4 https://hardhat.org

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

// SPDX-License-Identifier: MIT

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]





/**
 * @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]





/**
 * @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]





/**
 * @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]





/**
 * @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]





/**
 * @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]





/**
 * @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]





/**
 * @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]











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





/**
 * @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]






/**
 * @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 @openzeppelin/contracts/security/[email protected]





/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


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





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





// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File contracts/BB.sol








abstract contract INCR {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function tokenOfOwnerByIndex(address owner, uint256 index) public virtual view returns (uint256);
  function balanceOf(address owner) external virtual view returns (uint256 balance);
}

contract BentoBox is ERC721, ERC721Enumerable, Pausable, Ownable {
    
    using SafeMath for uint256;
    
    // A reference to the incrementum contract.
    INCR private incr = INCR(0xE2c435798da5F1E91C9c79156F39e42516689638);

    // The baseURI of the collection that points to the metadata storage.
    string public baseURI;
    
    // Is the Claim period active? The claim period is for the Incrementum holders
    // to mint their free BentoBox.
    bool public isClaimPeriodActive;
    
    // Is the Sale period active? The sale period lets you mint a BentoBox for 
    // the sale price.
    bool public isSalePeriodActive;
    
    // The total supply of claimable BentoBoxes.
    uint256 public maxClaimable;
    
    // The provenance hash. Lets you verify the following:
    // - The artwork linked via the metadata is legit.
    // - There is a limit on the total supply of the collection.
    string public provenance;
    
    // How many BentoBoxes can you mint in a single transaction?
    uint256 public maxBentoBoxPurchase;
    
    // The price of a single BentoBox.
    uint256 public bentoBoxPrice;
    
    // The total number of unclaimed BentoBoxes.
    uint256 private totalUnclaimed;
    
    // The total number of BentoBoxes that can exist.
    uint256 public totalBentoBoxSupply;
    
    
    constructor() ERC721("BentoBox", "BENTOBOXNFT") {
        baseURI = "https://raw.githubusercontent.com/recklesslabs/bentobox/main/";
        isClaimPeriodActive = false;
        isSalePeriodActive = false;
        maxClaimable = 4000;
        maxBentoBoxPurchase = 20;
        bentoBoxPrice = 50000000000000000; // 0.05 ETH
        totalBentoBoxSupply = 8000;
    }
    
    // - - - - - - - - - - - - G E T T E R S - - - - - - - - - - - - - - - - - - - - -

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

    function isMinted(uint256 tokenId) external view returns (bool) {
        return _exists(tokenId);
    }
    
    // - - - - - - - - - - - - S E T T E R S - - - - - - - - - - - - - - - - - - - - -
    
    function setTotalUnclaimed(uint256 n) public onlyOwner {
        totalUnclaimed = n;
    }
    
    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }
    
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        provenance = provenanceHash;
    }
    
    function flipClaimPeriodState() public onlyOwner {
        isClaimPeriodActive = !isClaimPeriodActive;
    }
    
    function flipSalePeriodState() public onlyOwner {
        isSalePeriodActive = !isSalePeriodActive;
    }
    
    // - - - - - - - - - - - - - P A U S I N G - - - - - - - - - - - - - - - - - - 


    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    // - - - - - - - - - - - - - O W N E R - - - - - - - - - - - - - - - - - - 

    function safeMint(address to, uint256 tokenId) public onlyOwner {
        _safeMint(to, tokenId);
    }
    
    function reserveFromSale(uint howMany, uint fromWhere) public onlyOwner {        
        for (uint i = 0; i < howMany; i++) {
            _safeMint(msg.sender, fromWhere + i);
        }
    }
    
    // - - - - - - - - - - - - - C L A I M I N G / M I N T I N G - - - - - - - - - - - - - - - - - - 
    
    
    function mintBentoBoxes(uint numberOfTokens) public payable {
        require(isSalePeriodActive, "Sale must be active to mint BentoBoxes");
        require(numberOfTokens <= maxBentoBoxPurchase, "Can only mint 20 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= totalBentoBoxSupply + totalUnclaimed, "Purchase would exceed max supply of BentoBoxes");
        require(bentoBoxPrice.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply() + totalUnclaimed;
            if (totalSupply() < totalBentoBoxSupply + totalUnclaimed) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }
    
    function claimOne(uint256 incrementumTokenId) public {
        require(isClaimPeriodActive, "Claim period must be active to claim a BentoBox");
        require(totalSupply() < maxClaimable, "Purchase would exceed max supply of Claimable BentoBoxes");
        require(incrementumTokenId < maxClaimable, "Requested tokenId exceeds upper bound");
        require(incr.ownerOf(incrementumTokenId) == msg.sender, "Must own the Incrementum for requested tokenId to claim a BentoBox");
    
        _safeMint(msg.sender, incrementumTokenId);
    }
    
    function claimN(uint256 startingIndex, uint256 totalToClaim) public {
        require(totalToClaim <= 50, "Cannot claim more than 50 at once. Reason: You might run out of gas. DM @derb to claim.");
        require(isClaimPeriodActive, "Claim period must be active to claim BentoBoxes");
        require(totalToClaim > 0, "Must mint at least one BentoBox");
        uint balance = incr.balanceOf(msg.sender);
        require(balance > 0, "Must hold at least one Incrementum to mint a BentoBox");
        require(balance >= startingIndex + totalToClaim, "Must hold at least as many Incrementums as the number of BentoBox you intend to claim");

        for(uint i = 0; i < balance && i < totalToClaim; i++) {
            require(totalSupply() < maxClaimable, "Cannot exceed max supply of claimable BentoBoxes");
            uint tokenId = incr.tokenOfOwnerByIndex(msg.sender, i + startingIndex);
            if (!_exists(tokenId)) {
                _safeMint(msg.sender, tokenId);
            } else {
                require(false, "Cannot mint an already claimed BentoBox");
            }
        }
    }

    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    

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

    // The following functions are overrides required by Solidity.

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

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":"bentoBoxPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startingIndex","type":"uint256"},{"internalType":"uint256","name":"totalToClaim","type":"uint256"}],"name":"claimN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"incrementumTokenId","type":"uint256"}],"name":"claimOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipClaimPeriodState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSalePeriodState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"isClaimPeriodActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSalePeriodActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBentoBoxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBentoBoxes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"howMany","type":"uint256"},{"internalType":"uint256","name":"fromWhere","type":"uint256"}],"name":"reserveFromSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMint","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"setTotalUnclaimed","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":"totalBentoBoxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273e2c435798da5f1e91c9c79156f39e42516689638600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600881526020017f42656e746f426f780000000000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f42454e544f424f584e46540000000000000000000000000000000000000000008152508160009080519060200190620000eb929190620002a6565b50806001908051906020019062000104929190620002a6565b5050506000600a60006101000a81548160ff0219169083151502179055506200014262000136620001d860201b60201c565b620001e060201b60201c565b6040518060600160405280603d8152602001620056fe603d9139600c908051906020019062000173929190620002a6565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff021916908315150217905550610fa0600e81905550601460108190555066b1a2bc2ec50000601181905550611f40601381905550620003bb565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002b49062000356565b90600052602060002090601f016020900481019282620002d8576000855562000324565b82601f10620002f357805160ff191683800117855562000324565b8280016001018555821562000324579182015b828111156200032357825182559160200191906001019062000306565b5b50905062000333919062000337565b5090565b5b808211156200035257600081600090555060010162000338565b5090565b600060028204905060018216806200036f57607f821691505b602082108114156200038657620003856200038c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61533380620003cb6000396000f3fe6080604052600436106102465760003560e01c806355f804b31161013957806395d89b41116100b6578063c40f50de1161007a578063c40f50de1461081f578063c87b56dd1461084a578063d037324e14610887578063e985e9c5146108b2578063f03f80c3146108ef578063f2fde38b1461091a57610246565b806395d89b41146107625780639c812eae1461078d578063a1448194146107a4578063a22cb465146107cd578063b88d4fde146107f657610246565b806370a08231116100fd57806370a08231146106a1578063715018a6146106de57806374ea186d146106f55780638456cb59146107205780638da5cb5b1461073757610246565b806355f804b3146105bc5780635c975abb146105e55780636352211e14610610578063662331261461064d5780636c0360eb1461067657610246565b80632224770d116101c75780633f4ba83a1161018b5780633f4ba83a146104fa57806342842e0e146105115780634c01072b1461053a5780634f6ccce714610563578063558f1118146105a057610246565b80632224770d1461041557806323b872dd1461042c5780632f745c591461045557806333c41a90146104925780633ca0c16d146104cf57610246565b8063104d060a1161020e578063104d060a14610344578063109695231461036d57806313d4fea51461039657806318160ddd146103bf5780631bb10558146103ea57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630f7309e814610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906139f8565b610943565b60405161027f91906149d1565b60405180910390f35b34801561029457600080fd5b5061029d610955565b6040516102aa91906149ec565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a8b565b6109e7565b6040516102e79190614941565b60405180910390f35b3480156102fc57600080fd5b50610317600480360381019061031291906139bc565b610a6c565b005b34801561032557600080fd5b5061032e610b84565b60405161033b91906149ec565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190613add565b610c12565b005b34801561037957600080fd5b50610394600480360381019061038f9190613a4a565b610fbd565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190613add565b611053565b005b3480156103cb57600080fd5b506103d4611107565b6040516103e19190614e6e565b60405180910390f35b3480156103f657600080fd5b506103ff611114565b60405161040c9190614e6e565b60405180910390f35b34801561042157600080fd5b5061042a61111a565b005b34801561043857600080fd5b50610453600480360381019061044e91906138b6565b6111c2565b005b34801561046157600080fd5b5061047c600480360381019061047791906139bc565b611222565b6040516104899190614e6e565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613a8b565b6112c7565b6040516104c691906149d1565b60405180910390f35b3480156104db57600080fd5b506104e46112d9565b6040516104f19190614e6e565b60405180910390f35b34801561050657600080fd5b5061050f6112df565b005b34801561051d57600080fd5b50610538600480360381019061053391906138b6565b611365565b005b34801561054657600080fd5b50610561600480360381019061055c9190613a8b565b611385565b005b34801561056f57600080fd5b5061058a60048036038101906105859190613a8b565b61140b565b6040516105979190614e6e565b60405180910390f35b6105ba60048036038101906105b59190613a8b565b6114a2565b005b3480156105c857600080fd5b506105e360048036038101906105de9190613a4a565b61165d565b005b3480156105f157600080fd5b506105fa6116f3565b60405161060791906149d1565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190613a8b565b61170a565b6040516106449190614941565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190613a8b565b6117bc565b005b34801561068257600080fd5b5061068b6119bf565b60405161069891906149ec565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190613828565b611a4d565b6040516106d59190614e6e565b60405180910390f35b3480156106ea57600080fd5b506106f3611b05565b005b34801561070157600080fd5b5061070a611b8d565b60405161071791906149d1565b60405180910390f35b34801561072c57600080fd5b50610735611ba0565b005b34801561074357600080fd5b5061074c611c26565b6040516107599190614941565b60405180910390f35b34801561076e57600080fd5b50610777611c50565b60405161078491906149ec565b60405180910390f35b34801561079957600080fd5b506107a2611ce2565b005b3480156107b057600080fd5b506107cb60048036038101906107c691906139bc565b611d8a565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613980565b611e14565b005b34801561080257600080fd5b5061081d60048036038101906108189190613905565b611f95565b005b34801561082b57600080fd5b50610834611ff7565b6040516108419190614e6e565b60405180910390f35b34801561085657600080fd5b50610871600480360381019061086c9190613a8b565b611ffd565b60405161087e91906149ec565b60405180910390f35b34801561089357600080fd5b5061089c6120a4565b6040516108a991906149d1565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d4919061387a565b6120b7565b6040516108e691906149d1565b60405180910390f35b3480156108fb57600080fd5b5061090461214b565b6040516109119190614e6e565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c9190613828565b612151565b005b600061094e82612249565b9050919050565b60606000805461096490615128565b80601f016020809104026020016040519081016040528092919081815260200182805461099090615128565b80156109dd5780601f106109b2576101008083540402835291602001916109dd565b820191906000526020600020905b8154815290600101906020018083116109c057829003601f168201915b5050505050905090565b60006109f2826122c3565b610a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2890614c8e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a778261170a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90614d2e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0761232f565b73ffffffffffffffffffffffffffffffffffffffff161480610b365750610b3581610b3061232f565b6120b7565b5b610b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6c90614bee565b60405180910390fd5b610b7f8383612337565b505050565b600f8054610b9190615128565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90615128565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b505050505081565b6032811115610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90614c6e565b60405180910390fd5b600d60009054906101000a900460ff16610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c90614aae565b60405180910390fd5b60008111610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf90614d0e565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610d459190614941565b60206040518083038186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190613ab4565b905060008111610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190614a0e565b60405180910390fd5b8183610de69190614f5d565b811015610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90614dee565b60405180910390fd5b60005b8181108015610e3957508281105b15610fb757600e54610e49611107565b10610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090614b8e565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59338785610ed69190614f5d565b6040518363ffffffff1660e01b8152600401610ef39291906149a8565b60206040518083038186803b158015610f0b57600080fd5b505afa158015610f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f439190613ab4565b9050610f4e816122c3565b610f6157610f5c33826123f0565b610fa3565b6000610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9990614d4e565b60405180910390fd5b5b508080610faf9061515a565b915050610e2b565b50505050565b610fc561232f565b73ffffffffffffffffffffffffffffffffffffffff16610fe3611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090614cae565b60405180910390fd5b80600f908051906020019061104f929190613622565b5050565b61105b61232f565b73ffffffffffffffffffffffffffffffffffffffff16611079611c26565b73ffffffffffffffffffffffffffffffffffffffff16146110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690614cae565b60405180910390fd5b60005b82811015611102576110ef3382846110ea9190614f5d565b6123f0565b80806110fa9061515a565b9150506110d2565b505050565b6000600880549050905090565b60135481565b61112261232f565b73ffffffffffffffffffffffffffffffffffffffff16611140611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614cae565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6111d36111cd61232f565b8261240e565b611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990614d6e565b60405180910390fd5b61121d8383836124ec565b505050565b600061122d83611a4d565b821061126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590614a4e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006112d2826122c3565b9050919050565b60105481565b6112e761232f565b73ffffffffffffffffffffffffffffffffffffffff16611305611c26565b73ffffffffffffffffffffffffffffffffffffffff161461135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135290614cae565b60405180910390fd5b611363612748565b565b61138083838360405180602001604052806000815250611f95565b505050565b61138d61232f565b73ffffffffffffffffffffffffffffffffffffffff166113ab611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890614cae565b60405180910390fd5b8060128190555050565b6000611415611107565b8210611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d90614d8e565b60405180910390fd5b60088281548110611490577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d60019054906101000a900460ff166114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890614dce565b60405180910390fd5b601054811115611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d90614b6e565b60405180910390fd5b6012546013546115469190614f5d565b61156082611552611107565b6127ea90919063ffffffff16565b11156115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890614e4e565b60405180910390fd5b346115b78260115461280090919063ffffffff16565b11156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90614b2e565b60405180910390fd5b60005b81811015611659576000601254611610611107565b61161a9190614f5d565b905060125460135461162c9190614f5d565b611634611107565b10156116455761164433826123f0565b5b5080806116519061515a565b9150506115fb565b5050565b61166561232f565b73ffffffffffffffffffffffffffffffffffffffff16611683611c26565b73ffffffffffffffffffffffffffffffffffffffff16146116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d090614cae565b60405180910390fd5b80600c90805190602001906116ef929190613622565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90614c2e565b60405180910390fd5b80915050919050565b600d60009054906101000a900460ff1661180b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180290614e2e565b60405180910390fd5b600e54611816611107565b10611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d90614dae565b60405180910390fd5b600e54811061189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190614bae565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161190c9190614e6e565b60206040518083038186803b15801561192457600080fd5b505afa158015611938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195c9190613851565b73ffffffffffffffffffffffffffffffffffffffff16146119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614e0e565b60405180910390fd5b6119bc33826123f0565b50565b600c80546119cc90615128565b80601f01602080910402602001604051908101604052809291908181526020018280546119f890615128565b8015611a455780601f10611a1a57610100808354040283529160200191611a45565b820191906000526020600020905b815481529060010190602001808311611a2857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab590614c0e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b0d61232f565b73ffffffffffffffffffffffffffffffffffffffff16611b2b611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890614cae565b60405180910390fd5b611b8b6000612816565b565b600d60009054906101000a900460ff1681565b611ba861232f565b73ffffffffffffffffffffffffffffffffffffffff16611bc6611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1390614cae565b60405180910390fd5b611c246128dc565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611c5f90615128565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8b90615128565b8015611cd85780601f10611cad57610100808354040283529160200191611cd8565b820191906000526020600020905b815481529060010190602001808311611cbb57829003601f168201915b5050505050905090565b611cea61232f565b73ffffffffffffffffffffffffffffffffffffffff16611d08611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5590614cae565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b611d9261232f565b73ffffffffffffffffffffffffffffffffffffffff16611db0611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd90614cae565b60405180910390fd5b611e1082826123f0565b5050565b611e1c61232f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8190614b0e565b60405180910390fd5b8060056000611e9761232f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f4461232f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f8991906149d1565b60405180910390a35050565b611fa6611fa061232f565b8361240e565b611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90614d6e565b60405180910390fd5b611ff18484848461297f565b50505050565b60115481565b6060612008826122c3565b612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614cee565b60405180910390fd5b60006120516129db565b90506000815111612071576040518060200160405280600081525061209c565b8061207b84612a6d565b60405160200161208c92919061491d565b6040516020818303038152906040525b915050919050565b600d60019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b61215961232f565b73ffffffffffffffffffffffffffffffffffffffff16612177611c26565b73ffffffffffffffffffffffffffffffffffffffff16146121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c490614cae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561223d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223490614a8e565b60405180910390fd5b61224681612816565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122bc57506122bb82612c1a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123aa8361170a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61240a828260405180602001604052806000815250612cfc565b5050565b6000612419826122c3565b612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f90614b4e565b60405180910390fd5b60006124638361170a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124d257508373ffffffffffffffffffffffffffffffffffffffff166124ba846109e7565b73ffffffffffffffffffffffffffffffffffffffff16145b806124e357506124e281856120b7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661250c8261170a565b73ffffffffffffffffffffffffffffffffffffffff1614612562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255990614cce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c990614aee565b60405180910390fd5b6125dd838383612d57565b6125e8600082612337565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612638919061503e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461268f9190614f5d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6127506116f3565b61278f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278690614a2e565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6127d361232f565b6040516127e09190614941565b60405180910390a1565b600081836127f89190614f5d565b905092915050565b6000818361280e9190614fe4565b905092915050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128e46116f3565b15612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b90614bce565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861296861232f565b6040516129759190614941565b60405180910390a1565b61298a8484846124ec565b61299684848484612daf565b6129d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc90614a6e565b60405180910390fd5b50505050565b6060600c80546129ea90615128565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1690615128565b8015612a635780601f10612a3857610100808354040283529160200191612a63565b820191906000526020600020905b815481529060010190602001808311612a4657829003601f168201915b5050505050905090565b60606000821415612ab5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c15565b600082905060005b60008214612ae7578080612ad09061515a565b915050600a82612ae09190614fb3565b9150612abd565b60008167ffffffffffffffff811115612b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b5b5781602001600182028036833780820191505090505b5090505b60008514612c0e57600182612b74919061503e565b9150600a85612b8391906151a3565b6030612b8f9190614f5d565b60f81b818381518110612bcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c079190614fb3565b9450612b5f565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ce557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cf55750612cf482612f46565b5b9050919050565b612d068383612fb0565b612d136000848484612daf565b612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4990614a6e565b60405180910390fd5b505050565b612d5f6116f3565b15612d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9690614bce565b60405180910390fd5b612daa83838361317e565b505050565b6000612dd08473ffffffffffffffffffffffffffffffffffffffff16613292565b15612f39578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df961232f565b8786866040518563ffffffff1660e01b8152600401612e1b949392919061495c565b602060405180830381600087803b158015612e3557600080fd5b505af1925050508015612e6657506040513d601f19601f82011682018060405250810190612e639190613a21565b60015b612ee9573d8060008114612e96576040519150601f19603f3d011682016040523d82523d6000602084013e612e9b565b606091505b50600081511415612ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed890614a6e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f3e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301790614c4e565b60405180910390fd5b613029816122c3565b15613069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306090614ace565b60405180910390fd5b61307560008383612d57565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130c59190614f5d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6131898383836132a5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131cc576131c7816132aa565b61320b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461320a5761320983826132f3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561324e5761324981613460565b61328d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461328c5761328b82826135a3565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161330084611a4d565b61330a919061503e565b90506000600760008481526020019081526020016000205490508181146133ef576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613474919061503e565b90506000600960008481526020019081526020016000205490506000600883815481106134ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613512577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613587577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135ae83611a4d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461362e90615128565b90600052602060002090601f0160209004810192826136505760008555613697565b82601f1061366957805160ff1916838001178555613697565b82800160010185558215613697579182015b8281111561369657825182559160200191906001019061367b565b5b5090506136a491906136a8565b5090565b5b808211156136c15760008160009055506001016136a9565b5090565b60006136d86136d384614eba565b614e89565b9050828152602081018484840111156136f057600080fd5b6136fb8482856150e6565b509392505050565b600061371661371184614eea565b614e89565b90508281526020810184848401111561372e57600080fd5b6137398482856150e6565b509392505050565b600081359050613750816152a1565b92915050565b600081519050613765816152a1565b92915050565b60008135905061377a816152b8565b92915050565b60008135905061378f816152cf565b92915050565b6000815190506137a4816152cf565b92915050565b600082601f8301126137bb57600080fd5b81356137cb8482602086016136c5565b91505092915050565b600082601f8301126137e557600080fd5b81356137f5848260208601613703565b91505092915050565b60008135905061380d816152e6565b92915050565b600081519050613822816152e6565b92915050565b60006020828403121561383a57600080fd5b600061384884828501613741565b91505092915050565b60006020828403121561386357600080fd5b600061387184828501613756565b91505092915050565b6000806040838503121561388d57600080fd5b600061389b85828601613741565b92505060206138ac85828601613741565b9150509250929050565b6000806000606084860312156138cb57600080fd5b60006138d986828701613741565b93505060206138ea86828701613741565b92505060406138fb868287016137fe565b9150509250925092565b6000806000806080858703121561391b57600080fd5b600061392987828801613741565b945050602061393a87828801613741565b935050604061394b878288016137fe565b925050606085013567ffffffffffffffff81111561396857600080fd5b613974878288016137aa565b91505092959194509250565b6000806040838503121561399357600080fd5b60006139a185828601613741565b92505060206139b28582860161376b565b9150509250929050565b600080604083850312156139cf57600080fd5b60006139dd85828601613741565b92505060206139ee858286016137fe565b9150509250929050565b600060208284031215613a0a57600080fd5b6000613a1884828501613780565b91505092915050565b600060208284031215613a3357600080fd5b6000613a4184828501613795565b91505092915050565b600060208284031215613a5c57600080fd5b600082013567ffffffffffffffff811115613a7657600080fd5b613a82848285016137d4565b91505092915050565b600060208284031215613a9d57600080fd5b6000613aab848285016137fe565b91505092915050565b600060208284031215613ac657600080fd5b6000613ad484828501613813565b91505092915050565b60008060408385031215613af057600080fd5b6000613afe858286016137fe565b9250506020613b0f858286016137fe565b9150509250929050565b613b2281615072565b82525050565b613b3181615084565b82525050565b6000613b4282614f1a565b613b4c8185614f30565b9350613b5c8185602086016150f5565b613b6581615290565b840191505092915050565b6000613b7b82614f25565b613b858185614f41565b9350613b958185602086016150f5565b613b9e81615290565b840191505092915050565b6000613bb482614f25565b613bbe8185614f52565b9350613bce8185602086016150f5565b80840191505092915050565b6000613be7603583614f41565b91507f4d75737420686f6c64206174206c65617374206f6e6520496e6372656d656e7460008301527f756d20746f206d696e7420612042656e746f426f7800000000000000000000006020830152604082019050919050565b6000613c4d601483614f41565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613c8d602b83614f41565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613cf3603283614f41565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d59602683614f41565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dbf602f83614f41565b91507f436c61696d20706572696f64206d7573742062652061637469766520746f206360008301527f6c61696d2042656e746f426f78657300000000000000000000000000000000006020830152604082019050919050565b6000613e25601c83614f41565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e65602483614f41565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ecb601983614f41565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f0b601f83614f41565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613f4b602c83614f41565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613fb1602183614f41565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614017603083614f41565b91507f43616e6e6f7420657863656564206d617820737570706c79206f6620636c616960008301527f6d61626c652042656e746f426f786573000000000000000000000000000000006020830152604082019050919050565b600061407d602583614f41565b91507f52657175657374656420746f6b656e496420657863656564732075707065722060008301527f626f756e640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140e3601083614f41565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000614123603883614f41565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614189602a83614f41565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ef602983614f41565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614255602083614f41565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614295605783614f41565b91507f43616e6e6f7420636c61696d206d6f7265207468616e203530206174206f6e6360008301527f652e20526561736f6e3a20596f75206d696768742072756e206f7574206f662060208301527f6761732e20444d20406465726220746f20636c61696d2e0000000000000000006040830152606082019050919050565b6000614321602c83614f41565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614387602083614f41565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006143c7602983614f41565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061442d602f83614f41565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614493601f83614f41565b91507f4d757374206d696e74206174206c65617374206f6e652042656e746f426f78006000830152602082019050919050565b60006144d3602183614f41565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614539602783614f41565b91507f43616e6e6f74206d696e7420616e20616c726561647920636c61696d6564204260008301527f656e746f426f78000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061459f603183614f41565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614605602c83614f41565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061466b603883614f41565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620436c61696d61626c652042656e746f426f78657300000000000000006020830152604082019050919050565b60006146d1602683614f41565b91507f53616c65206d7573742062652061637469766520746f206d696e742042656e7460008301527f6f426f78657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614737605583614f41565b91507f4d75737420686f6c64206174206c65617374206173206d616e7920496e63726560008301527f6d656e74756d7320617320746865206e756d626572206f662042656e746f426f60208301527f7820796f7520696e74656e6420746f20636c61696d00000000000000000000006040830152606082019050919050565b60006147c3604283614f41565b91507f4d757374206f776e2074686520496e6372656d656e74756d20666f722072657160008301527f75657374656420746f6b656e496420746f20636c61696d20612042656e746f4260208301527f6f780000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b600061484f602f83614f41565b91507f436c61696d20706572696f64206d7573742062652061637469766520746f206360008301527f6c61696d20612042656e746f426f7800000000000000000000000000000000006020830152604082019050919050565b60006148b5602e83614f41565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662042656e746f426f7865730000000000000000000000000000000000006020830152604082019050919050565b614917816150dc565b82525050565b60006149298285613ba9565b91506149358284613ba9565b91508190509392505050565b60006020820190506149566000830184613b19565b92915050565b60006080820190506149716000830187613b19565b61497e6020830186613b19565b61498b604083018561490e565b818103606083015261499d8184613b37565b905095945050505050565b60006040820190506149bd6000830185613b19565b6149ca602083018461490e565b9392505050565b60006020820190506149e66000830184613b28565b92915050565b60006020820190508181036000830152614a068184613b70565b905092915050565b60006020820190508181036000830152614a2781613bda565b9050919050565b60006020820190508181036000830152614a4781613c40565b9050919050565b60006020820190508181036000830152614a6781613c80565b9050919050565b60006020820190508181036000830152614a8781613ce6565b9050919050565b60006020820190508181036000830152614aa781613d4c565b9050919050565b60006020820190508181036000830152614ac781613db2565b9050919050565b60006020820190508181036000830152614ae781613e18565b9050919050565b60006020820190508181036000830152614b0781613e58565b9050919050565b60006020820190508181036000830152614b2781613ebe565b9050919050565b60006020820190508181036000830152614b4781613efe565b9050919050565b60006020820190508181036000830152614b6781613f3e565b9050919050565b60006020820190508181036000830152614b8781613fa4565b9050919050565b60006020820190508181036000830152614ba78161400a565b9050919050565b60006020820190508181036000830152614bc781614070565b9050919050565b60006020820190508181036000830152614be7816140d6565b9050919050565b60006020820190508181036000830152614c0781614116565b9050919050565b60006020820190508181036000830152614c278161417c565b9050919050565b60006020820190508181036000830152614c47816141e2565b9050919050565b60006020820190508181036000830152614c6781614248565b9050919050565b60006020820190508181036000830152614c8781614288565b9050919050565b60006020820190508181036000830152614ca781614314565b9050919050565b60006020820190508181036000830152614cc78161437a565b9050919050565b60006020820190508181036000830152614ce7816143ba565b9050919050565b60006020820190508181036000830152614d0781614420565b9050919050565b60006020820190508181036000830152614d2781614486565b9050919050565b60006020820190508181036000830152614d47816144c6565b9050919050565b60006020820190508181036000830152614d678161452c565b9050919050565b60006020820190508181036000830152614d8781614592565b9050919050565b60006020820190508181036000830152614da7816145f8565b9050919050565b60006020820190508181036000830152614dc78161465e565b9050919050565b60006020820190508181036000830152614de7816146c4565b9050919050565b60006020820190508181036000830152614e078161472a565b9050919050565b60006020820190508181036000830152614e27816147b6565b9050919050565b60006020820190508181036000830152614e4781614842565b9050919050565b60006020820190508181036000830152614e67816148a8565b9050919050565b6000602082019050614e83600083018461490e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614eb057614eaf615261565b5b8060405250919050565b600067ffffffffffffffff821115614ed557614ed4615261565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f0557614f04615261565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f68826150dc565b9150614f73836150dc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fa857614fa76151d4565b5b828201905092915050565b6000614fbe826150dc565b9150614fc9836150dc565b925082614fd957614fd8615203565b5b828204905092915050565b6000614fef826150dc565b9150614ffa836150dc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615033576150326151d4565b5b828202905092915050565b6000615049826150dc565b9150615054836150dc565b925082821015615067576150666151d4565b5b828203905092915050565b600061507d826150bc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151135780820151818401526020810190506150f8565b83811115615122576000848401525b50505050565b6000600282049050600182168061514057607f821691505b6020821081141561515457615153615232565b5b50919050565b6000615165826150dc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615198576151976151d4565b5b600182019050919050565b60006151ae826150dc565b91506151b9836150dc565b9250826151c9576151c8615203565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6152aa81615072565b81146152b557600080fd5b50565b6152c181615084565b81146152cc57600080fd5b50565b6152d881615090565b81146152e357600080fd5b50565b6152ef816150dc565b81146152fa57600080fd5b5056fea264697066735822122046427162714a7eb8234095d6cb533ddad480ef238984c2222ddd5329fd50414e64736f6c6343000800003368747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f7265636b6c6573736c6162732f62656e746f626f782f6d61696e2f

Deployed Bytecode

0x6080604052600436106102465760003560e01c806355f804b31161013957806395d89b41116100b6578063c40f50de1161007a578063c40f50de1461081f578063c87b56dd1461084a578063d037324e14610887578063e985e9c5146108b2578063f03f80c3146108ef578063f2fde38b1461091a57610246565b806395d89b41146107625780639c812eae1461078d578063a1448194146107a4578063a22cb465146107cd578063b88d4fde146107f657610246565b806370a08231116100fd57806370a08231146106a1578063715018a6146106de57806374ea186d146106f55780638456cb59146107205780638da5cb5b1461073757610246565b806355f804b3146105bc5780635c975abb146105e55780636352211e14610610578063662331261461064d5780636c0360eb1461067657610246565b80632224770d116101c75780633f4ba83a1161018b5780633f4ba83a146104fa57806342842e0e146105115780634c01072b1461053a5780634f6ccce714610563578063558f1118146105a057610246565b80632224770d1461041557806323b872dd1461042c5780632f745c591461045557806333c41a90146104925780633ca0c16d146104cf57610246565b8063104d060a1161020e578063104d060a14610344578063109695231461036d57806313d4fea51461039657806318160ddd146103bf5780631bb10558146103ea57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630f7309e814610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906139f8565b610943565b60405161027f91906149d1565b60405180910390f35b34801561029457600080fd5b5061029d610955565b6040516102aa91906149ec565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a8b565b6109e7565b6040516102e79190614941565b60405180910390f35b3480156102fc57600080fd5b50610317600480360381019061031291906139bc565b610a6c565b005b34801561032557600080fd5b5061032e610b84565b60405161033b91906149ec565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190613add565b610c12565b005b34801561037957600080fd5b50610394600480360381019061038f9190613a4a565b610fbd565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190613add565b611053565b005b3480156103cb57600080fd5b506103d4611107565b6040516103e19190614e6e565b60405180910390f35b3480156103f657600080fd5b506103ff611114565b60405161040c9190614e6e565b60405180910390f35b34801561042157600080fd5b5061042a61111a565b005b34801561043857600080fd5b50610453600480360381019061044e91906138b6565b6111c2565b005b34801561046157600080fd5b5061047c600480360381019061047791906139bc565b611222565b6040516104899190614e6e565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613a8b565b6112c7565b6040516104c691906149d1565b60405180910390f35b3480156104db57600080fd5b506104e46112d9565b6040516104f19190614e6e565b60405180910390f35b34801561050657600080fd5b5061050f6112df565b005b34801561051d57600080fd5b50610538600480360381019061053391906138b6565b611365565b005b34801561054657600080fd5b50610561600480360381019061055c9190613a8b565b611385565b005b34801561056f57600080fd5b5061058a60048036038101906105859190613a8b565b61140b565b6040516105979190614e6e565b60405180910390f35b6105ba60048036038101906105b59190613a8b565b6114a2565b005b3480156105c857600080fd5b506105e360048036038101906105de9190613a4a565b61165d565b005b3480156105f157600080fd5b506105fa6116f3565b60405161060791906149d1565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190613a8b565b61170a565b6040516106449190614941565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190613a8b565b6117bc565b005b34801561068257600080fd5b5061068b6119bf565b60405161069891906149ec565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190613828565b611a4d565b6040516106d59190614e6e565b60405180910390f35b3480156106ea57600080fd5b506106f3611b05565b005b34801561070157600080fd5b5061070a611b8d565b60405161071791906149d1565b60405180910390f35b34801561072c57600080fd5b50610735611ba0565b005b34801561074357600080fd5b5061074c611c26565b6040516107599190614941565b60405180910390f35b34801561076e57600080fd5b50610777611c50565b60405161078491906149ec565b60405180910390f35b34801561079957600080fd5b506107a2611ce2565b005b3480156107b057600080fd5b506107cb60048036038101906107c691906139bc565b611d8a565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613980565b611e14565b005b34801561080257600080fd5b5061081d60048036038101906108189190613905565b611f95565b005b34801561082b57600080fd5b50610834611ff7565b6040516108419190614e6e565b60405180910390f35b34801561085657600080fd5b50610871600480360381019061086c9190613a8b565b611ffd565b60405161087e91906149ec565b60405180910390f35b34801561089357600080fd5b5061089c6120a4565b6040516108a991906149d1565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d4919061387a565b6120b7565b6040516108e691906149d1565b60405180910390f35b3480156108fb57600080fd5b5061090461214b565b6040516109119190614e6e565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c9190613828565b612151565b005b600061094e82612249565b9050919050565b60606000805461096490615128565b80601f016020809104026020016040519081016040528092919081815260200182805461099090615128565b80156109dd5780601f106109b2576101008083540402835291602001916109dd565b820191906000526020600020905b8154815290600101906020018083116109c057829003601f168201915b5050505050905090565b60006109f2826122c3565b610a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2890614c8e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a778261170a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90614d2e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0761232f565b73ffffffffffffffffffffffffffffffffffffffff161480610b365750610b3581610b3061232f565b6120b7565b5b610b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6c90614bee565b60405180910390fd5b610b7f8383612337565b505050565b600f8054610b9190615128565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90615128565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b505050505081565b6032811115610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90614c6e565b60405180910390fd5b600d60009054906101000a900460ff16610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c90614aae565b60405180910390fd5b60008111610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf90614d0e565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610d459190614941565b60206040518083038186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190613ab4565b905060008111610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190614a0e565b60405180910390fd5b8183610de69190614f5d565b811015610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90614dee565b60405180910390fd5b60005b8181108015610e3957508281105b15610fb757600e54610e49611107565b10610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090614b8e565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59338785610ed69190614f5d565b6040518363ffffffff1660e01b8152600401610ef39291906149a8565b60206040518083038186803b158015610f0b57600080fd5b505afa158015610f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f439190613ab4565b9050610f4e816122c3565b610f6157610f5c33826123f0565b610fa3565b6000610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9990614d4e565b60405180910390fd5b5b508080610faf9061515a565b915050610e2b565b50505050565b610fc561232f565b73ffffffffffffffffffffffffffffffffffffffff16610fe3611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090614cae565b60405180910390fd5b80600f908051906020019061104f929190613622565b5050565b61105b61232f565b73ffffffffffffffffffffffffffffffffffffffff16611079611c26565b73ffffffffffffffffffffffffffffffffffffffff16146110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690614cae565b60405180910390fd5b60005b82811015611102576110ef3382846110ea9190614f5d565b6123f0565b80806110fa9061515a565b9150506110d2565b505050565b6000600880549050905090565b60135481565b61112261232f565b73ffffffffffffffffffffffffffffffffffffffff16611140611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614cae565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6111d36111cd61232f565b8261240e565b611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990614d6e565b60405180910390fd5b61121d8383836124ec565b505050565b600061122d83611a4d565b821061126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590614a4e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006112d2826122c3565b9050919050565b60105481565b6112e761232f565b73ffffffffffffffffffffffffffffffffffffffff16611305611c26565b73ffffffffffffffffffffffffffffffffffffffff161461135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135290614cae565b60405180910390fd5b611363612748565b565b61138083838360405180602001604052806000815250611f95565b505050565b61138d61232f565b73ffffffffffffffffffffffffffffffffffffffff166113ab611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890614cae565b60405180910390fd5b8060128190555050565b6000611415611107565b8210611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d90614d8e565b60405180910390fd5b60088281548110611490577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d60019054906101000a900460ff166114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890614dce565b60405180910390fd5b601054811115611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d90614b6e565b60405180910390fd5b6012546013546115469190614f5d565b61156082611552611107565b6127ea90919063ffffffff16565b11156115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890614e4e565b60405180910390fd5b346115b78260115461280090919063ffffffff16565b11156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90614b2e565b60405180910390fd5b60005b81811015611659576000601254611610611107565b61161a9190614f5d565b905060125460135461162c9190614f5d565b611634611107565b10156116455761164433826123f0565b5b5080806116519061515a565b9150506115fb565b5050565b61166561232f565b73ffffffffffffffffffffffffffffffffffffffff16611683611c26565b73ffffffffffffffffffffffffffffffffffffffff16146116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d090614cae565b60405180910390fd5b80600c90805190602001906116ef929190613622565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90614c2e565b60405180910390fd5b80915050919050565b600d60009054906101000a900460ff1661180b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180290614e2e565b60405180910390fd5b600e54611816611107565b10611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d90614dae565b60405180910390fd5b600e54811061189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190614bae565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161190c9190614e6e565b60206040518083038186803b15801561192457600080fd5b505afa158015611938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195c9190613851565b73ffffffffffffffffffffffffffffffffffffffff16146119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614e0e565b60405180910390fd5b6119bc33826123f0565b50565b600c80546119cc90615128565b80601f01602080910402602001604051908101604052809291908181526020018280546119f890615128565b8015611a455780601f10611a1a57610100808354040283529160200191611a45565b820191906000526020600020905b815481529060010190602001808311611a2857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab590614c0e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b0d61232f565b73ffffffffffffffffffffffffffffffffffffffff16611b2b611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890614cae565b60405180910390fd5b611b8b6000612816565b565b600d60009054906101000a900460ff1681565b611ba861232f565b73ffffffffffffffffffffffffffffffffffffffff16611bc6611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1390614cae565b60405180910390fd5b611c246128dc565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611c5f90615128565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8b90615128565b8015611cd85780601f10611cad57610100808354040283529160200191611cd8565b820191906000526020600020905b815481529060010190602001808311611cbb57829003601f168201915b5050505050905090565b611cea61232f565b73ffffffffffffffffffffffffffffffffffffffff16611d08611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5590614cae565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b611d9261232f565b73ffffffffffffffffffffffffffffffffffffffff16611db0611c26565b73ffffffffffffffffffffffffffffffffffffffff1614611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd90614cae565b60405180910390fd5b611e1082826123f0565b5050565b611e1c61232f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8190614b0e565b60405180910390fd5b8060056000611e9761232f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f4461232f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f8991906149d1565b60405180910390a35050565b611fa6611fa061232f565b8361240e565b611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90614d6e565b60405180910390fd5b611ff18484848461297f565b50505050565b60115481565b6060612008826122c3565b612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614cee565b60405180910390fd5b60006120516129db565b90506000815111612071576040518060200160405280600081525061209c565b8061207b84612a6d565b60405160200161208c92919061491d565b6040516020818303038152906040525b915050919050565b600d60019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b61215961232f565b73ffffffffffffffffffffffffffffffffffffffff16612177611c26565b73ffffffffffffffffffffffffffffffffffffffff16146121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c490614cae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561223d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223490614a8e565b60405180910390fd5b61224681612816565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122bc57506122bb82612c1a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123aa8361170a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61240a828260405180602001604052806000815250612cfc565b5050565b6000612419826122c3565b612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f90614b4e565b60405180910390fd5b60006124638361170a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124d257508373ffffffffffffffffffffffffffffffffffffffff166124ba846109e7565b73ffffffffffffffffffffffffffffffffffffffff16145b806124e357506124e281856120b7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661250c8261170a565b73ffffffffffffffffffffffffffffffffffffffff1614612562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255990614cce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c990614aee565b60405180910390fd5b6125dd838383612d57565b6125e8600082612337565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612638919061503e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461268f9190614f5d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6127506116f3565b61278f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278690614a2e565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6127d361232f565b6040516127e09190614941565b60405180910390a1565b600081836127f89190614f5d565b905092915050565b6000818361280e9190614fe4565b905092915050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128e46116f3565b15612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b90614bce565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861296861232f565b6040516129759190614941565b60405180910390a1565b61298a8484846124ec565b61299684848484612daf565b6129d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc90614a6e565b60405180910390fd5b50505050565b6060600c80546129ea90615128565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1690615128565b8015612a635780601f10612a3857610100808354040283529160200191612a63565b820191906000526020600020905b815481529060010190602001808311612a4657829003601f168201915b5050505050905090565b60606000821415612ab5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c15565b600082905060005b60008214612ae7578080612ad09061515a565b915050600a82612ae09190614fb3565b9150612abd565b60008167ffffffffffffffff811115612b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b5b5781602001600182028036833780820191505090505b5090505b60008514612c0e57600182612b74919061503e565b9150600a85612b8391906151a3565b6030612b8f9190614f5d565b60f81b818381518110612bcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c079190614fb3565b9450612b5f565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ce557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cf55750612cf482612f46565b5b9050919050565b612d068383612fb0565b612d136000848484612daf565b612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4990614a6e565b60405180910390fd5b505050565b612d5f6116f3565b15612d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9690614bce565b60405180910390fd5b612daa83838361317e565b505050565b6000612dd08473ffffffffffffffffffffffffffffffffffffffff16613292565b15612f39578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df961232f565b8786866040518563ffffffff1660e01b8152600401612e1b949392919061495c565b602060405180830381600087803b158015612e3557600080fd5b505af1925050508015612e6657506040513d601f19601f82011682018060405250810190612e639190613a21565b60015b612ee9573d8060008114612e96576040519150601f19603f3d011682016040523d82523d6000602084013e612e9b565b606091505b50600081511415612ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed890614a6e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f3e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301790614c4e565b60405180910390fd5b613029816122c3565b15613069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306090614ace565b60405180910390fd5b61307560008383612d57565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130c59190614f5d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6131898383836132a5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131cc576131c7816132aa565b61320b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461320a5761320983826132f3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561324e5761324981613460565b61328d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461328c5761328b82826135a3565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161330084611a4d565b61330a919061503e565b90506000600760008481526020019081526020016000205490508181146133ef576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613474919061503e565b90506000600960008481526020019081526020016000205490506000600883815481106134ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613512577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613587577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135ae83611a4d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461362e90615128565b90600052602060002090601f0160209004810192826136505760008555613697565b82601f1061366957805160ff1916838001178555613697565b82800160010185558215613697579182015b8281111561369657825182559160200191906001019061367b565b5b5090506136a491906136a8565b5090565b5b808211156136c15760008160009055506001016136a9565b5090565b60006136d86136d384614eba565b614e89565b9050828152602081018484840111156136f057600080fd5b6136fb8482856150e6565b509392505050565b600061371661371184614eea565b614e89565b90508281526020810184848401111561372e57600080fd5b6137398482856150e6565b509392505050565b600081359050613750816152a1565b92915050565b600081519050613765816152a1565b92915050565b60008135905061377a816152b8565b92915050565b60008135905061378f816152cf565b92915050565b6000815190506137a4816152cf565b92915050565b600082601f8301126137bb57600080fd5b81356137cb8482602086016136c5565b91505092915050565b600082601f8301126137e557600080fd5b81356137f5848260208601613703565b91505092915050565b60008135905061380d816152e6565b92915050565b600081519050613822816152e6565b92915050565b60006020828403121561383a57600080fd5b600061384884828501613741565b91505092915050565b60006020828403121561386357600080fd5b600061387184828501613756565b91505092915050565b6000806040838503121561388d57600080fd5b600061389b85828601613741565b92505060206138ac85828601613741565b9150509250929050565b6000806000606084860312156138cb57600080fd5b60006138d986828701613741565b93505060206138ea86828701613741565b92505060406138fb868287016137fe565b9150509250925092565b6000806000806080858703121561391b57600080fd5b600061392987828801613741565b945050602061393a87828801613741565b935050604061394b878288016137fe565b925050606085013567ffffffffffffffff81111561396857600080fd5b613974878288016137aa565b91505092959194509250565b6000806040838503121561399357600080fd5b60006139a185828601613741565b92505060206139b28582860161376b565b9150509250929050565b600080604083850312156139cf57600080fd5b60006139dd85828601613741565b92505060206139ee858286016137fe565b9150509250929050565b600060208284031215613a0a57600080fd5b6000613a1884828501613780565b91505092915050565b600060208284031215613a3357600080fd5b6000613a4184828501613795565b91505092915050565b600060208284031215613a5c57600080fd5b600082013567ffffffffffffffff811115613a7657600080fd5b613a82848285016137d4565b91505092915050565b600060208284031215613a9d57600080fd5b6000613aab848285016137fe565b91505092915050565b600060208284031215613ac657600080fd5b6000613ad484828501613813565b91505092915050565b60008060408385031215613af057600080fd5b6000613afe858286016137fe565b9250506020613b0f858286016137fe565b9150509250929050565b613b2281615072565b82525050565b613b3181615084565b82525050565b6000613b4282614f1a565b613b4c8185614f30565b9350613b5c8185602086016150f5565b613b6581615290565b840191505092915050565b6000613b7b82614f25565b613b858185614f41565b9350613b958185602086016150f5565b613b9e81615290565b840191505092915050565b6000613bb482614f25565b613bbe8185614f52565b9350613bce8185602086016150f5565b80840191505092915050565b6000613be7603583614f41565b91507f4d75737420686f6c64206174206c65617374206f6e6520496e6372656d656e7460008301527f756d20746f206d696e7420612042656e746f426f7800000000000000000000006020830152604082019050919050565b6000613c4d601483614f41565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613c8d602b83614f41565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613cf3603283614f41565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d59602683614f41565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dbf602f83614f41565b91507f436c61696d20706572696f64206d7573742062652061637469766520746f206360008301527f6c61696d2042656e746f426f78657300000000000000000000000000000000006020830152604082019050919050565b6000613e25601c83614f41565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e65602483614f41565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ecb601983614f41565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f0b601f83614f41565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613f4b602c83614f41565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613fb1602183614f41565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614017603083614f41565b91507f43616e6e6f7420657863656564206d617820737570706c79206f6620636c616960008301527f6d61626c652042656e746f426f786573000000000000000000000000000000006020830152604082019050919050565b600061407d602583614f41565b91507f52657175657374656420746f6b656e496420657863656564732075707065722060008301527f626f756e640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140e3601083614f41565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000614123603883614f41565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614189602a83614f41565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ef602983614f41565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614255602083614f41565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614295605783614f41565b91507f43616e6e6f7420636c61696d206d6f7265207468616e203530206174206f6e6360008301527f652e20526561736f6e3a20596f75206d696768742072756e206f7574206f662060208301527f6761732e20444d20406465726220746f20636c61696d2e0000000000000000006040830152606082019050919050565b6000614321602c83614f41565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614387602083614f41565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006143c7602983614f41565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061442d602f83614f41565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614493601f83614f41565b91507f4d757374206d696e74206174206c65617374206f6e652042656e746f426f78006000830152602082019050919050565b60006144d3602183614f41565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614539602783614f41565b91507f43616e6e6f74206d696e7420616e20616c726561647920636c61696d6564204260008301527f656e746f426f78000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061459f603183614f41565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614605602c83614f41565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061466b603883614f41565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620436c61696d61626c652042656e746f426f78657300000000000000006020830152604082019050919050565b60006146d1602683614f41565b91507f53616c65206d7573742062652061637469766520746f206d696e742042656e7460008301527f6f426f78657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614737605583614f41565b91507f4d75737420686f6c64206174206c65617374206173206d616e7920496e63726560008301527f6d656e74756d7320617320746865206e756d626572206f662042656e746f426f60208301527f7820796f7520696e74656e6420746f20636c61696d00000000000000000000006040830152606082019050919050565b60006147c3604283614f41565b91507f4d757374206f776e2074686520496e6372656d656e74756d20666f722072657160008301527f75657374656420746f6b656e496420746f20636c61696d20612042656e746f4260208301527f6f780000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b600061484f602f83614f41565b91507f436c61696d20706572696f64206d7573742062652061637469766520746f206360008301527f6c61696d20612042656e746f426f7800000000000000000000000000000000006020830152604082019050919050565b60006148b5602e83614f41565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662042656e746f426f7865730000000000000000000000000000000000006020830152604082019050919050565b614917816150dc565b82525050565b60006149298285613ba9565b91506149358284613ba9565b91508190509392505050565b60006020820190506149566000830184613b19565b92915050565b60006080820190506149716000830187613b19565b61497e6020830186613b19565b61498b604083018561490e565b818103606083015261499d8184613b37565b905095945050505050565b60006040820190506149bd6000830185613b19565b6149ca602083018461490e565b9392505050565b60006020820190506149e66000830184613b28565b92915050565b60006020820190508181036000830152614a068184613b70565b905092915050565b60006020820190508181036000830152614a2781613bda565b9050919050565b60006020820190508181036000830152614a4781613c40565b9050919050565b60006020820190508181036000830152614a6781613c80565b9050919050565b60006020820190508181036000830152614a8781613ce6565b9050919050565b60006020820190508181036000830152614aa781613d4c565b9050919050565b60006020820190508181036000830152614ac781613db2565b9050919050565b60006020820190508181036000830152614ae781613e18565b9050919050565b60006020820190508181036000830152614b0781613e58565b9050919050565b60006020820190508181036000830152614b2781613ebe565b9050919050565b60006020820190508181036000830152614b4781613efe565b9050919050565b60006020820190508181036000830152614b6781613f3e565b9050919050565b60006020820190508181036000830152614b8781613fa4565b9050919050565b60006020820190508181036000830152614ba78161400a565b9050919050565b60006020820190508181036000830152614bc781614070565b9050919050565b60006020820190508181036000830152614be7816140d6565b9050919050565b60006020820190508181036000830152614c0781614116565b9050919050565b60006020820190508181036000830152614c278161417c565b9050919050565b60006020820190508181036000830152614c47816141e2565b9050919050565b60006020820190508181036000830152614c6781614248565b9050919050565b60006020820190508181036000830152614c8781614288565b9050919050565b60006020820190508181036000830152614ca781614314565b9050919050565b60006020820190508181036000830152614cc78161437a565b9050919050565b60006020820190508181036000830152614ce7816143ba565b9050919050565b60006020820190508181036000830152614d0781614420565b9050919050565b60006020820190508181036000830152614d2781614486565b9050919050565b60006020820190508181036000830152614d47816144c6565b9050919050565b60006020820190508181036000830152614d678161452c565b9050919050565b60006020820190508181036000830152614d8781614592565b9050919050565b60006020820190508181036000830152614da7816145f8565b9050919050565b60006020820190508181036000830152614dc78161465e565b9050919050565b60006020820190508181036000830152614de7816146c4565b9050919050565b60006020820190508181036000830152614e078161472a565b9050919050565b60006020820190508181036000830152614e27816147b6565b9050919050565b60006020820190508181036000830152614e4781614842565b9050919050565b60006020820190508181036000830152614e67816148a8565b9050919050565b6000602082019050614e83600083018461490e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614eb057614eaf615261565b5b8060405250919050565b600067ffffffffffffffff821115614ed557614ed4615261565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f0557614f04615261565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f68826150dc565b9150614f73836150dc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fa857614fa76151d4565b5b828201905092915050565b6000614fbe826150dc565b9150614fc9836150dc565b925082614fd957614fd8615203565b5b828204905092915050565b6000614fef826150dc565b9150614ffa836150dc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615033576150326151d4565b5b828202905092915050565b6000615049826150dc565b9150615054836150dc565b925082821015615067576150666151d4565b5b828203905092915050565b600061507d826150bc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151135780820151818401526020810190506150f8565b83811115615122576000848401525b50505050565b6000600282049050600182168061514057607f821691505b6020821081141561515457615153615232565b5b50919050565b6000615165826150dc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615198576151976151d4565b5b600182019050919050565b60006151ae826150dc565b91506151b9836150dc565b9250826151c9576151c8615203565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6152aa81615072565b81146152b557600080fd5b50565b6152c181615084565b81146152cc57600080fd5b50565b6152d881615090565b81146152e357600080fd5b50565b6152ef816150dc565b81146152fa57600080fd5b5056fea264697066735822122046427162714a7eb8234095d6cb533ddad480ef238984c2222ddd5329fd50414e64736f6c63430008000033

Deployed Bytecode Sourcemap

52631:6585:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59001:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21634:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23193:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22716:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53568:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57457:1121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54999:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55803:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35339:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53947:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55131:110;;;;;;;;;;;;;:::i;:::-;;24083:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35007:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54583:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53671:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55530:65;;;;;;;;;;;;;:::i;:::-;;24493:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54795:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35529:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56126:760;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54899:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41904:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21328:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56898:547;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52949:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21058:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44722:94;;;;;;;;;;;;;:::i;:::-;;53104:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55461:61;;;;;;;;;;;;;:::i;:::-;;44071:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21803:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55253:107;;;;;;;;;;;;;:::i;:::-;;55686:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23486:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24749:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53758:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21978:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53253:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23852:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53346:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44971:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59001:212;59140:4;59169:36;59193:11;59169:23;:36::i;:::-;59162:43;;59001:212;;;:::o;21634:100::-;21688:13;21721:5;21714:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21634:100;:::o;23193:221::-;23269:7;23297:16;23305:7;23297;:16::i;:::-;23289:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23382:15;:24;23398:7;23382:24;;;;;;;;;;;;;;;;;;;;;23375:31;;23193:221;;;:::o;22716:411::-;22797:13;22813:23;22828:7;22813:14;:23::i;:::-;22797:39;;22861:5;22855:11;;:2;:11;;;;22847:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22955:5;22939:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22964:37;22981:5;22988:12;:10;:12::i;:::-;22964:16;:37::i;:::-;22939:62;22917:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23098:21;23107:2;23111:7;23098:8;:21::i;:::-;22716:411;;;:::o;53568:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57457:1121::-;57560:2;57544:12;:18;;57536:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;57673:19;;;;;;;;;;;57665:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;57778:1;57763:12;:16;57755:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;57826:12;57841:4;;;;;;;;;;;:14;;;57856:10;57841:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57826:41;;57896:1;57886:7;:11;57878:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;58001:12;57985:13;:28;;;;:::i;:::-;57974:7;:39;;57966:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;58120:6;58116:455;58136:7;58132:1;:11;:31;;;;;58151:12;58147:1;:16;58132:31;58116:455;;;58209:12;;58193:13;:11;:13::i;:::-;:28;58185:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;58289:12;58304:4;;;;;;;;;;;:24;;;58329:10;58345:13;58341:1;:17;;;;:::i;:::-;58304:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58289:70;;58379:16;58387:7;58379;:16::i;:::-;58374:186;;58416:30;58426:10;58438:7;58416:9;:30::i;:::-;58374:186;;;58495:5;58487:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58374:186;58116:455;58165:3;;;;;:::i;:::-;;;;58116:455;;;;57457:1121;;;:::o;54999:120::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55097:14:::1;55084:10;:27;;;;;;;;;;;;:::i;:::-;;54999:120:::0;:::o;55803:196::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55899:6:::1;55894:98;55915:7;55911:1;:11;55894:98;;;55944:36;55954:10;55978:1;55966:9;:13;;;;:::i;:::-;55944:9;:36::i;:::-;55924:3;;;;;:::i;:::-;;;;55894:98;;;;55803:196:::0;;:::o;35339:113::-;35400:7;35427:10;:17;;;;35420:24;;35339:113;:::o;53947:34::-;;;;:::o;55131:110::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55214:19:::1;;;;;;;;;;;55213:20;55191:19;;:42;;;;;;;;;;;;;;;;;;55131:110::o:0;24083:339::-;24278:41;24297:12;:10;:12::i;:::-;24311:7;24278:18;:41::i;:::-;24270:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24386:28;24396:4;24402:2;24406:7;24386:9;:28::i;:::-;24083:339;;;:::o;35007:256::-;35104:7;35140:23;35157:5;35140:16;:23::i;:::-;35132:5;:31;35124:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35229:12;:19;35242:5;35229:19;;;;;;;;;;;;;;;:26;35249:5;35229:26;;;;;;;;;;;;35222:33;;35007:256;;;;:::o;54583:106::-;54641:4;54665:16;54673:7;54665;:16::i;:::-;54658:23;;54583:106;;;:::o;53671:34::-;;;;:::o;55530:65::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55577:10:::1;:8;:10::i;:::-;55530:65::o:0;24493:185::-;24631:39;24648:4;24654:2;24658:7;24631:39;;;;;;;;;;;;:16;:39::i;:::-;24493:185;;;:::o;54795:92::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54878:1:::1;54861:14;:18;;;;54795:92:::0;:::o;35529:233::-;35604:7;35640:30;:28;:30::i;:::-;35632:5;:38;35624:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35737:10;35748:5;35737:17;;;;;;;;;;;;;;;;;;;;;;;;35730:24;;35529:233;;;:::o;56126:760::-;56205:18;;;;;;;;;;;56197:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;56303:19;;56285:14;:37;;56277:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;56438:14;;56416:19;;:36;;;;:::i;:::-;56379:33;56397:14;56379:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:73;;56371:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;56559:9;56522:33;56540:14;56522:13;;:17;;:33;;;;:::i;:::-;:46;;56514:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;56629:6;56625:254;56645:14;56641:1;:18;56625:254;;;56681:14;56714;;56698:13;:11;:13::i;:::-;:30;;;;:::i;:::-;56681:47;;56785:14;;56763:19;;:36;;;;:::i;:::-;56747:13;:11;:13::i;:::-;:52;56743:125;;;56820:32;56830:10;56842:9;56820;:32::i;:::-;56743:125;56625:254;56661:3;;;;;:::i;:::-;;;;56625:254;;;;56126:760;:::o;54899:88::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54976:3:::1;54966:7;:13;;;;;;;;;;;;:::i;:::-;;54899:88:::0;:::o;41904:86::-;41951:4;41975:7;;;;;;;;;;;41968:14;;41904:86;:::o;21328:239::-;21400:7;21420:13;21436:7;:16;21444:7;21436:16;;;;;;;;;;;;;;;;;;;;;21420:32;;21488:1;21471:19;;:5;:19;;;;21463:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21554:5;21547:12;;;21328:239;;;:::o;56898:547::-;56970:19;;;;;;;;;;;56962:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;57076:12;;57060:13;:11;:13::i;:::-;:28;57052:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;57189:12;;57168:18;:33;57160:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57298:10;57262:46;;:4;;;;;;;;;;;:12;;;57275:18;57262:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;57254:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;57396:41;57406:10;57418:18;57396:9;:41::i;:::-;56898:547;:::o;52949:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21058:208::-;21130:7;21175:1;21158:19;;:5;:19;;;;21150:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21242:9;:16;21252:5;21242:16;;;;;;;;;;;;;;;;21235:23;;21058:208;;;:::o;44722:94::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44787:21:::1;44805:1;44787:9;:21::i;:::-;44722:94::o:0;53104:31::-;;;;;;;;;;;;;:::o;55461:61::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55506:8:::1;:6;:8::i;:::-;55461:61::o:0;44071:87::-;44117:7;44144:6;;;;;;;;;;;44137:13;;44071:87;:::o;21803:104::-;21859:13;21892:7;21885:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21803:104;:::o;55253:107::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55334:18:::1;;;;;;;;;;;55333:19;55312:18;;:40;;;;;;;;;;;;;;;;;;55253:107::o:0;55686:105::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55761:22:::1;55771:2;55775:7;55761:9;:22::i;:::-;55686:105:::0;;:::o;23486:295::-;23601:12;:10;:12::i;:::-;23589:24;;:8;:24;;;;23581:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23701:8;23656:18;:32;23675:12;:10;:12::i;:::-;23656:32;;;;;;;;;;;;;;;:42;23689:8;23656:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23754:8;23725:48;;23740:12;:10;:12::i;:::-;23725:48;;;23764:8;23725:48;;;;;;:::i;:::-;;;;;;;;23486:295;;:::o;24749:328::-;24924:41;24943:12;:10;:12::i;:::-;24957:7;24924:18;:41::i;:::-;24916:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25030:39;25044:4;25050:2;25054:7;25063:5;25030:13;:39::i;:::-;24749:328;;;;:::o;53758:28::-;;;;:::o;21978:334::-;22051:13;22085:16;22093:7;22085;:16::i;:::-;22077:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22166:21;22190:10;:8;:10::i;:::-;22166:34;;22242:1;22224:7;22218:21;:25;:86;;;;;;;;;;;;;;;;;22270:7;22279:18;:7;:16;:18::i;:::-;22253:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22218:86;22211:93;;;21978:334;;;:::o;53253:30::-;;;;;;;;;;;;;:::o;23852:164::-;23949:4;23973:18;:25;23992:5;23973:25;;;;;;;;;;;;;;;:35;23999:8;23973:35;;;;;;;;;;;;;;;;;;;;;;;;;23966:42;;23852:164;;;;:::o;53346:27::-;;;;:::o;44971:192::-;44302:12;:10;:12::i;:::-;44291:23;;:7;:5;:7::i;:::-;:23;;;44283:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45080:1:::1;45060:22;;:8;:22;;;;45052:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45136:19;45146:8;45136:9;:19::i;:::-;44971:192:::0;:::o;34699:224::-;34801:4;34840:35;34825:50;;;:11;:50;;;;:90;;;;34879:36;34903:11;34879:23;:36::i;:::-;34825:90;34818:97;;34699:224;;;:::o;26587:127::-;26652:4;26704:1;26676:30;;:7;:16;26684:7;26676:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26669:37;;26587:127;;;:::o;16160:98::-;16213:7;16240:10;16233:17;;16160:98;:::o;30569:174::-;30671:2;30644:15;:24;30660:7;30644:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30727:7;30723:2;30689:46;;30698:23;30713:7;30698:14;:23::i;:::-;30689:46;;;;;;;;;;;;30569:174;;:::o;27571:110::-;27647:26;27657:2;27661:7;27647:26;;;;;;;;;;;;:9;:26::i;:::-;27571:110;;:::o;26881:348::-;26974:4;26999:16;27007:7;26999;:16::i;:::-;26991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27075:13;27091:23;27106:7;27091:14;:23::i;:::-;27075:39;;27144:5;27133:16;;:7;:16;;;:51;;;;27177:7;27153:31;;:20;27165:7;27153:11;:20::i;:::-;:31;;;27133:51;:87;;;;27188:32;27205:5;27212:7;27188:16;:32::i;:::-;27133:87;27125:96;;;26881:348;;;;:::o;29873:578::-;30032:4;30005:31;;:23;30020:7;30005:14;:23::i;:::-;:31;;;29997:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30115:1;30101:16;;:2;:16;;;;30093:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30171:39;30192:4;30198:2;30202:7;30171:20;:39::i;:::-;30275:29;30292:1;30296:7;30275:8;:29::i;:::-;30336:1;30317:9;:15;30327:4;30317:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30365:1;30348:9;:13;30358:2;30348:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30396:2;30377:7;:16;30385:7;30377:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30435:7;30431:2;30416:27;;30425:4;30416:27;;;;;;;;;;;;29873:578;;;:::o;42963:120::-;42507:8;:6;:8::i;:::-;42499:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;43032:5:::1;43022:7;;:15;;;;;;;;;;;;;;;;;;43053:22;43062:12;:10;:12::i;:::-;43053:22;;;;;;:::i;:::-;;;;;;;;42963:120::o:0;48128:98::-;48186:7;48217:1;48213;:5;;;;:::i;:::-;48206:12;;48128:98;;;;:::o;48866:::-;48924:7;48955:1;48951;:5;;;;:::i;:::-;48944:12;;48866:98;;;;:::o;45171:173::-;45227:16;45246:6;;;;;;;;;;;45227:25;;45272:8;45263:6;;:17;;;;;;;;;;;;;;;;;;45327:8;45296:40;;45317:8;45296:40;;;;;;;;;;;;45171:173;;:::o;42704:118::-;42230:8;:6;:8::i;:::-;42229:9;42221:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;42774:4:::1;42764:7;;:14;;;;;;;;;;;;;;;;;;42794:20;42801:12;:10;:12::i;:::-;42794:20;;;;;;:::i;:::-;;;;;;;;42704:118::o:0;25959:315::-;26116:28;26126:4;26132:2;26136:7;26116:9;:28::i;:::-;26163:48;26186:4;26192:2;26196:7;26205:5;26163:22;:48::i;:::-;26155:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25959:315;;;;:::o;54475:100::-;54527:13;54560:7;54553:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54475:100;:::o;16670:723::-;16726:13;16956:1;16947:5;:10;16943:53;;;16974:10;;;;;;;;;;;;;;;;;;;;;16943:53;17006:12;17021:5;17006:20;;17037:14;17062:78;17077:1;17069:4;:9;17062:78;;17095:8;;;;;:::i;:::-;;;;17126:2;17118:10;;;;;:::i;:::-;;;17062:78;;;17150:19;17182:6;17172:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17150:39;;17200:154;17216:1;17207:5;:10;17200:154;;17244:1;17234:11;;;;;:::i;:::-;;;17311:2;17303:5;:10;;;;:::i;:::-;17290:2;:24;;;;:::i;:::-;17277:39;;17260:6;17267;17260:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17340:2;17331:11;;;;;:::i;:::-;;;17200:154;;;17378:6;17364:21;;;;;16670:723;;;;:::o;20689:305::-;20791:4;20843:25;20828:40;;;:11;:40;;;;:105;;;;20900:33;20885:48;;;:11;:48;;;;20828:105;:158;;;;20950:36;20974:11;20950:23;:36::i;:::-;20828:158;20808:178;;20689:305;;;:::o;27908:321::-;28038:18;28044:2;28048:7;28038:5;:18::i;:::-;28089:54;28120:1;28124:2;28128:7;28137:5;28089:22;:54::i;:::-;28067:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27908:321;;;:::o;58696:227::-;42230:8;:6;:8::i;:::-;42229:9;42221:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;58870:45:::1;58897:4;58903:2;58907:7;58870:26;:45::i;:::-;58696:227:::0;;;:::o;31308:799::-;31463:4;31484:15;:2;:13;;;:15::i;:::-;31480:620;;;31536:2;31520:36;;;31557:12;:10;:12::i;:::-;31571:4;31577:7;31586:5;31520:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31516:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31779:1;31762:6;:13;:18;31758:272;;;31805:60;;;;;;;;;;:::i;:::-;;;;;;;;31758:272;31980:6;31974:13;31965:6;31961:2;31957:15;31950:38;31516:529;31653:41;;;31643:51;;;:6;:51;;;;31636:58;;;;;31480:620;32084:4;32077:11;;31308:799;;;;;;;:::o;19210:157::-;19295:4;19334:25;19319:40;;;:11;:40;;;;19312:47;;19210:157;;;:::o;28565:382::-;28659:1;28645:16;;:2;:16;;;;28637:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28718:16;28726:7;28718;:16::i;:::-;28717:17;28709:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28780:45;28809:1;28813:2;28817:7;28780:20;:45::i;:::-;28855:1;28838:9;:13;28848:2;28838:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28886:2;28867:7;:16;28875:7;28867:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28931:7;28927:2;28906:33;;28923:1;28906:33;;;;;;;;;;;;28565:382;;:::o;36375:589::-;36519:45;36546:4;36552:2;36556:7;36519:26;:45::i;:::-;36597:1;36581:18;;:4;:18;;;36577:187;;;36616:40;36648:7;36616:31;:40::i;:::-;36577:187;;;36686:2;36678:10;;:4;:10;;;36674:90;;36705:47;36738:4;36744:7;36705:32;:47::i;:::-;36674:90;36577:187;36792:1;36778:16;;:2;:16;;;36774:183;;;36811:45;36848:7;36811:36;:45::i;:::-;36774:183;;;36884:4;36878:10;;:2;:10;;;36874:83;;36905:40;36933:2;36937:7;36905:27;:40::i;:::-;36874:83;36774:183;36375:589;;;:::o;8219:387::-;8279:4;8487:12;8554:7;8542:20;8534:28;;8597:1;8590:4;:8;8583:15;;;8219:387;;;:::o;32679:126::-;;;;:::o;37687:164::-;37791:10;:17;;;;37764:15;:24;37780:7;37764:24;;;;;;;;;;;:44;;;;37819:10;37835:7;37819:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37687:164;:::o;38478:988::-;38744:22;38794:1;38769:22;38786:4;38769:16;:22::i;:::-;:26;;;;:::i;:::-;38744:51;;38806:18;38827:17;:26;38845:7;38827:26;;;;;;;;;;;;38806:47;;38974:14;38960:10;:28;38956:328;;39005:19;39027:12;:18;39040:4;39027:18;;;;;;;;;;;;;;;:34;39046:14;39027:34;;;;;;;;;;;;39005:56;;39111:11;39078:12;:18;39091:4;39078:18;;;;;;;;;;;;;;;:30;39097:10;39078:30;;;;;;;;;;;:44;;;;39228:10;39195:17;:30;39213:11;39195:30;;;;;;;;;;;:43;;;;38956:328;;39380:17;:26;39398:7;39380:26;;;;;;;;;;;39373:33;;;39424:12;:18;39437:4;39424:18;;;;;;;;;;;;;;;:34;39443:14;39424:34;;;;;;;;;;;39417:41;;;38478:988;;;;:::o;39761:1079::-;40014:22;40059:1;40039:10;:17;;;;:21;;;;:::i;:::-;40014:46;;40071:18;40092:15;:24;40108:7;40092:24;;;;;;;;;;;;40071:45;;40443:19;40465:10;40476:14;40465:26;;;;;;;;;;;;;;;;;;;;;;;;40443:48;;40529:11;40504:10;40515;40504:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40640:10;40609:15;:28;40625:11;40609:28;;;;;;;;;;;:41;;;;40781:15;:24;40797:7;40781:24;;;;;;;;;;;40774:31;;;40816:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39761:1079;;;;:::o;37265:221::-;37350:14;37367:20;37384:2;37367:16;:20::i;:::-;37350:37;;37425:7;37398:12;:16;37411:2;37398:16;;;;;;;;;;;;;;;:24;37415:6;37398:24;;;;;;;;;;;:34;;;;37472:6;37443:17;:26;37461:7;37443:26;;;;;;;;;;;:35;;;;37265:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:143::-;;938:6;932:13;923:22;;954:33;981:5;954:33;:::i;:::-;913:80;;;;:::o;999:133::-;;1080:6;1067:20;1058:29;;1096:30;1120:5;1096:30;:::i;:::-;1048:84;;;;:::o;1138:137::-;;1221:6;1208:20;1199:29;;1237:32;1263:5;1237:32;:::i;:::-;1189:86;;;;:::o;1281:141::-;;1368:6;1362:13;1353:22;;1384:32;1410:5;1384:32;:::i;:::-;1343:79;;;;:::o;1441:271::-;;1545:3;1538:4;1530:6;1526:17;1522:27;1512:2;;1563:1;1560;1553:12;1512:2;1603:6;1590:20;1628:78;1702:3;1694:6;1687:4;1679:6;1675:17;1628:78;:::i;:::-;1619:87;;1502:210;;;;;:::o;1732:273::-;;1837:3;1830:4;1822:6;1818:17;1814:27;1804:2;;1855:1;1852;1845:12;1804:2;1895:6;1882:20;1920:79;1995:3;1987:6;1980:4;1972:6;1968:17;1920:79;:::i;:::-;1911:88;;1794:211;;;;;:::o;2011:139::-;;2095:6;2082:20;2073:29;;2111:33;2138:5;2111:33;:::i;:::-;2063:87;;;;:::o;2156:143::-;;2244:6;2238:13;2229:22;;2260:33;2287:5;2260:33;:::i;:::-;2219:80;;;;:::o;2305:262::-;;2413:2;2401:9;2392:7;2388:23;2384:32;2381:2;;;2429:1;2426;2419:12;2381:2;2472:1;2497:53;2542:7;2533:6;2522:9;2518:22;2497:53;:::i;:::-;2487:63;;2443:117;2371:196;;;;:::o;2573:284::-;;2692:2;2680:9;2671:7;2667:23;2663:32;2660:2;;;2708:1;2705;2698:12;2660:2;2751:1;2776:64;2832:7;2823:6;2812:9;2808:22;2776:64;:::i;:::-;2766:74;;2722:128;2650:207;;;;:::o;2863:407::-;;;2988:2;2976:9;2967:7;2963:23;2959:32;2956:2;;;3004:1;3001;2994:12;2956:2;3047:1;3072:53;3117:7;3108:6;3097:9;3093:22;3072:53;:::i;:::-;3062:63;;3018:117;3174:2;3200:53;3245:7;3236:6;3225:9;3221:22;3200:53;:::i;:::-;3190:63;;3145:118;2946:324;;;;;:::o;3276:552::-;;;;3418:2;3406:9;3397:7;3393:23;3389:32;3386:2;;;3434:1;3431;3424:12;3386:2;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3732:2;3758:53;3803:7;3794:6;3783:9;3779:22;3758:53;:::i;:::-;3748:63;;3703:118;3376:452;;;;;:::o;3834:809::-;;;;;4002:3;3990:9;3981:7;3977:23;3973:33;3970:2;;;4019:1;4016;4009:12;3970:2;4062:1;4087:53;4132:7;4123:6;4112:9;4108:22;4087:53;:::i;:::-;4077:63;;4033:117;4189:2;4215:53;4260:7;4251:6;4240:9;4236:22;4215:53;:::i;:::-;4205:63;;4160:118;4317:2;4343:53;4388:7;4379:6;4368:9;4364:22;4343:53;:::i;:::-;4333:63;;4288:118;4473:2;4462:9;4458:18;4445:32;4504:18;4496:6;4493:30;4490:2;;;4536:1;4533;4526:12;4490:2;4564:62;4618:7;4609:6;4598:9;4594:22;4564:62;:::i;:::-;4554:72;;4416:220;3960:683;;;;;;;:::o;4649:401::-;;;4771:2;4759:9;4750:7;4746:23;4742:32;4739:2;;;4787:1;4784;4777:12;4739:2;4830:1;4855:53;4900:7;4891:6;4880:9;4876:22;4855:53;:::i;:::-;4845:63;;4801:117;4957:2;4983:50;5025:7;5016:6;5005:9;5001:22;4983:50;:::i;:::-;4973:60;;4928:115;4729:321;;;;;:::o;5056:407::-;;;5181:2;5169:9;5160:7;5156:23;5152:32;5149:2;;;5197:1;5194;5187:12;5149:2;5240:1;5265:53;5310:7;5301:6;5290:9;5286:22;5265:53;:::i;:::-;5255:63;;5211:117;5367:2;5393:53;5438:7;5429:6;5418:9;5414:22;5393:53;:::i;:::-;5383:63;;5338:118;5139:324;;;;;:::o;5469:260::-;;5576:2;5564:9;5555:7;5551:23;5547:32;5544:2;;;5592:1;5589;5582:12;5544:2;5635:1;5660:52;5704:7;5695:6;5684:9;5680:22;5660:52;:::i;:::-;5650:62;;5606:116;5534:195;;;;:::o;5735:282::-;;5853:2;5841:9;5832:7;5828:23;5824:32;5821:2;;;5869:1;5866;5859:12;5821:2;5912:1;5937:63;5992:7;5983:6;5972:9;5968:22;5937:63;:::i;:::-;5927:73;;5883:127;5811:206;;;;:::o;6023:375::-;;6141:2;6129:9;6120:7;6116:23;6112:32;6109:2;;;6157:1;6154;6147:12;6109:2;6228:1;6217:9;6213:17;6200:31;6258:18;6250:6;6247:30;6244:2;;;6290:1;6287;6280:12;6244:2;6318:63;6373:7;6364:6;6353:9;6349:22;6318:63;:::i;:::-;6308:73;;6171:220;6099:299;;;;:::o;6404:262::-;;6512:2;6500:9;6491:7;6487:23;6483:32;6480:2;;;6528:1;6525;6518:12;6480:2;6571:1;6596:53;6641:7;6632:6;6621:9;6617:22;6596:53;:::i;:::-;6586:63;;6542:117;6470:196;;;;:::o;6672:284::-;;6791:2;6779:9;6770:7;6766:23;6762:32;6759:2;;;6807:1;6804;6797:12;6759:2;6850:1;6875:64;6931:7;6922:6;6911:9;6907:22;6875:64;:::i;:::-;6865:74;;6821:128;6749:207;;;;:::o;6962:407::-;;;7087:2;7075:9;7066:7;7062:23;7058:32;7055:2;;;7103:1;7100;7093:12;7055:2;7146:1;7171:53;7216:7;7207:6;7196:9;7192:22;7171:53;:::i;:::-;7161:63;;7117:117;7273:2;7299:53;7344:7;7335:6;7324:9;7320:22;7299:53;:::i;:::-;7289:63;;7244:118;7045:324;;;;;:::o;7375:118::-;7462:24;7480:5;7462:24;:::i;:::-;7457:3;7450:37;7440:53;;:::o;7499:109::-;7580:21;7595:5;7580:21;:::i;:::-;7575:3;7568:34;7558:50;;:::o;7614:360::-;;7728:38;7760:5;7728:38;:::i;:::-;7782:70;7845:6;7840:3;7782:70;:::i;:::-;7775:77;;7861:52;7906:6;7901:3;7894:4;7887:5;7883:16;7861:52;:::i;:::-;7938:29;7960:6;7938:29;:::i;:::-;7933:3;7929:39;7922:46;;7704:270;;;;;:::o;7980:364::-;;8096:39;8129:5;8096:39;:::i;:::-;8151:71;8215:6;8210:3;8151:71;:::i;:::-;8144:78;;8231:52;8276:6;8271:3;8264:4;8257:5;8253:16;8231:52;:::i;:::-;8308:29;8330:6;8308:29;:::i;:::-;8303:3;8299:39;8292:46;;8072:272;;;;;:::o;8350:377::-;;8484:39;8517:5;8484:39;:::i;:::-;8539:89;8621:6;8616:3;8539:89;:::i;:::-;8532:96;;8637:52;8682:6;8677:3;8670:4;8663:5;8659:16;8637:52;:::i;:::-;8714:6;8709:3;8705:16;8698:23;;8460:267;;;;;:::o;8733:385::-;;8896:67;8960:2;8955:3;8896:67;:::i;:::-;8889:74;;8993:34;8989:1;8984:3;8980:11;8973:55;9059:23;9054:2;9049:3;9045:12;9038:45;9109:2;9104:3;9100:12;9093:19;;8879:239;;;:::o;9124:318::-;;9287:67;9351:2;9346:3;9287:67;:::i;:::-;9280:74;;9384:22;9380:1;9375:3;9371:11;9364:43;9433:2;9428:3;9424:12;9417:19;;9270:172;;;:::o;9448:375::-;;9611:67;9675:2;9670:3;9611:67;:::i;:::-;9604:74;;9708:34;9704:1;9699:3;9695:11;9688:55;9774:13;9769:2;9764:3;9760:12;9753:35;9814:2;9809:3;9805:12;9798:19;;9594:229;;;:::o;9829:382::-;;9992:67;10056:2;10051:3;9992:67;:::i;:::-;9985:74;;10089:34;10085:1;10080:3;10076:11;10069:55;10155:20;10150:2;10145:3;10141:12;10134:42;10202:2;10197:3;10193:12;10186:19;;9975:236;;;:::o;10217:370::-;;10380:67;10444:2;10439:3;10380:67;:::i;:::-;10373:74;;10477:34;10473:1;10468:3;10464:11;10457:55;10543:8;10538:2;10533:3;10529:12;10522:30;10578:2;10573:3;10569:12;10562:19;;10363:224;;;:::o;10593:379::-;;10756:67;10820:2;10815:3;10756:67;:::i;:::-;10749:74;;10853:34;10849:1;10844:3;10840:11;10833:55;10919:17;10914:2;10909:3;10905:12;10898:39;10963:2;10958:3;10954:12;10947:19;;10739:233;;;:::o;10978:326::-;;11141:67;11205:2;11200:3;11141:67;:::i;:::-;11134:74;;11238:30;11234:1;11229:3;11225:11;11218:51;11295:2;11290:3;11286:12;11279:19;;11124:180;;;:::o;11310:368::-;;11473:67;11537:2;11532:3;11473:67;:::i;:::-;11466:74;;11570:34;11566:1;11561:3;11557:11;11550:55;11636:6;11631:2;11626:3;11622:12;11615:28;11669:2;11664:3;11660:12;11653:19;;11456:222;;;:::o;11684:323::-;;11847:67;11911:2;11906:3;11847:67;:::i;:::-;11840:74;;11944:27;11940:1;11935:3;11931:11;11924:48;11998:2;11993:3;11989:12;11982:19;;11830:177;;;:::o;12013:329::-;;12176:67;12240:2;12235:3;12176:67;:::i;:::-;12169:74;;12273:33;12269:1;12264:3;12260:11;12253:54;12333:2;12328:3;12324:12;12317:19;;12159:183;;;:::o;12348:376::-;;12511:67;12575:2;12570:3;12511:67;:::i;:::-;12504:74;;12608:34;12604:1;12599:3;12595:11;12588:55;12674:14;12669:2;12664:3;12660:12;12653:36;12715:2;12710:3;12706:12;12699:19;;12494:230;;;:::o;12730:365::-;;12893:67;12957:2;12952:3;12893:67;:::i;:::-;12886:74;;12990:34;12986:1;12981:3;12977:11;12970:55;13056:3;13051:2;13046:3;13042:12;13035:25;13086:2;13081:3;13077:12;13070:19;;12876:219;;;:::o;13101:380::-;;13264:67;13328:2;13323:3;13264:67;:::i;:::-;13257:74;;13361:34;13357:1;13352:3;13348:11;13341:55;13427:18;13422:2;13417:3;13413:12;13406:40;13472:2;13467:3;13463:12;13456:19;;13247:234;;;:::o;13487:369::-;;13650:67;13714:2;13709:3;13650:67;:::i;:::-;13643:74;;13747:34;13743:1;13738:3;13734:11;13727:55;13813:7;13808:2;13803:3;13799:12;13792:29;13847:2;13842:3;13838:12;13831:19;;13633:223;;;:::o;13862:314::-;;14025:67;14089:2;14084:3;14025:67;:::i;:::-;14018:74;;14122:18;14118:1;14113:3;14109:11;14102:39;14167:2;14162:3;14158:12;14151:19;;14008:168;;;:::o;14182:388::-;;14345:67;14409:2;14404:3;14345:67;:::i;:::-;14338:74;;14442:34;14438:1;14433:3;14429:11;14422:55;14508:26;14503:2;14498:3;14494:12;14487:48;14561:2;14556:3;14552:12;14545:19;;14328:242;;;:::o;14576:374::-;;14739:67;14803:2;14798:3;14739:67;:::i;:::-;14732:74;;14836:34;14832:1;14827:3;14823:11;14816:55;14902:12;14897:2;14892:3;14888:12;14881:34;14941:2;14936:3;14932:12;14925:19;;14722:228;;;:::o;14956:373::-;;15119:67;15183:2;15178:3;15119:67;:::i;:::-;15112:74;;15216:34;15212:1;15207:3;15203:11;15196:55;15282:11;15277:2;15272:3;15268:12;15261:33;15320:2;15315:3;15311:12;15304:19;;15102:227;;;:::o;15335:330::-;;15498:67;15562:2;15557:3;15498:67;:::i;:::-;15491:74;;15595:34;15591:1;15586:3;15582:11;15575:55;15656:2;15651:3;15647:12;15640:19;;15481:184;;;:::o;15671:453::-;;15834:67;15898:2;15893:3;15834:67;:::i;:::-;15827:74;;15931:34;15927:1;15922:3;15918:11;15911:55;15997:34;15992:2;15987:3;15983:12;15976:56;16063:25;16058:2;16053:3;16049:12;16042:47;16115:2;16110:3;16106:12;16099:19;;15817:307;;;:::o;16130:376::-;;16293:67;16357:2;16352:3;16293:67;:::i;:::-;16286:74;;16390:34;16386:1;16381:3;16377:11;16370:55;16456:14;16451:2;16446:3;16442:12;16435:36;16497:2;16492:3;16488:12;16481:19;;16276:230;;;:::o;16512:330::-;;16675:67;16739:2;16734:3;16675:67;:::i;:::-;16668:74;;16772:34;16768:1;16763:3;16759:11;16752:55;16833:2;16828:3;16824:12;16817:19;;16658:184;;;:::o;16848:373::-;;17011:67;17075:2;17070:3;17011:67;:::i;:::-;17004:74;;17108:34;17104:1;17099:3;17095:11;17088:55;17174:11;17169:2;17164:3;17160:12;17153:33;17212:2;17207:3;17203:12;17196:19;;16994:227;;;:::o;17227:379::-;;17390:67;17454:2;17449:3;17390:67;:::i;:::-;17383:74;;17487:34;17483:1;17478:3;17474:11;17467:55;17553:17;17548:2;17543:3;17539:12;17532:39;17597:2;17592:3;17588:12;17581:19;;17373:233;;;:::o;17612:329::-;;17775:67;17839:2;17834:3;17775:67;:::i;:::-;17768:74;;17872:33;17868:1;17863:3;17859:11;17852:54;17932:2;17927:3;17923:12;17916:19;;17758:183;;;:::o;17947:365::-;;18110:67;18174:2;18169:3;18110:67;:::i;:::-;18103:74;;18207:34;18203:1;18198:3;18194:11;18187:55;18273:3;18268:2;18263:3;18259:12;18252:25;18303:2;18298:3;18294:12;18287:19;;18093:219;;;:::o;18318:371::-;;18481:67;18545:2;18540:3;18481:67;:::i;:::-;18474:74;;18578:34;18574:1;18569:3;18565:11;18558:55;18644:9;18639:2;18634:3;18630:12;18623:31;18680:2;18675:3;18671:12;18664:19;;18464:225;;;:::o;18695:381::-;;18858:67;18922:2;18917:3;18858:67;:::i;:::-;18851:74;;18955:34;18951:1;18946:3;18942:11;18935:55;19021:19;19016:2;19011:3;19007:12;19000:41;19067:2;19062:3;19058:12;19051:19;;18841:235;;;:::o;19082:376::-;;19245:67;19309:2;19304:3;19245:67;:::i;:::-;19238:74;;19342:34;19338:1;19333:3;19329:11;19322:55;19408:14;19403:2;19398:3;19394:12;19387:36;19449:2;19444:3;19440:12;19433:19;;19228:230;;;:::o;19464:388::-;;19627:67;19691:2;19686:3;19627:67;:::i;:::-;19620:74;;19724:34;19720:1;19715:3;19711:11;19704:55;19790:26;19785:2;19780:3;19776:12;19769:48;19843:2;19838:3;19834:12;19827:19;;19610:242;;;:::o;19858:370::-;;20021:67;20085:2;20080:3;20021:67;:::i;:::-;20014:74;;20118:34;20114:1;20109:3;20105:11;20098:55;20184:8;20179:2;20174:3;20170:12;20163:30;20219:2;20214:3;20210:12;20203:19;;20004:224;;;:::o;20234:451::-;;20397:67;20461:2;20456:3;20397:67;:::i;:::-;20390:74;;20494:34;20490:1;20485:3;20481:11;20474:55;20560:34;20555:2;20550:3;20546:12;20539:56;20626:23;20621:2;20616:3;20612:12;20605:45;20676:2;20671:3;20667:12;20660:19;;20380:305;;;:::o;20691:432::-;;20854:67;20918:2;20913:3;20854:67;:::i;:::-;20847:74;;20951:34;20947:1;20942:3;20938:11;20931:55;21017:34;21012:2;21007:3;21003:12;20996:56;21083:4;21078:2;21073:3;21069:12;21062:26;21114:2;21109:3;21105:12;21098:19;;20837:286;;;:::o;21129:379::-;;21292:67;21356:2;21351:3;21292:67;:::i;:::-;21285:74;;21389:34;21385:1;21380:3;21376:11;21369:55;21455:17;21450:2;21445:3;21441:12;21434:39;21499:2;21494:3;21490:12;21483:19;;21275:233;;;:::o;21514:378::-;;21677:67;21741:2;21736:3;21677:67;:::i;:::-;21670:74;;21774:34;21770:1;21765:3;21761:11;21754:55;21840:16;21835:2;21830:3;21826:12;21819:38;21883:2;21878:3;21874:12;21867:19;;21660:232;;;:::o;21898:118::-;21985:24;22003:5;21985:24;:::i;:::-;21980:3;21973:37;21963:53;;:::o;22022:435::-;;22224:95;22315:3;22306:6;22224:95;:::i;:::-;22217:102;;22336:95;22427:3;22418:6;22336:95;:::i;:::-;22329:102;;22448:3;22441:10;;22206:251;;;;;:::o;22463:222::-;;22594:2;22583:9;22579:18;22571:26;;22607:71;22675:1;22664:9;22660:17;22651:6;22607:71;:::i;:::-;22561:124;;;;:::o;22691:640::-;;22924:3;22913:9;22909:19;22901:27;;22938:71;23006:1;22995:9;22991:17;22982:6;22938:71;:::i;:::-;23019:72;23087:2;23076:9;23072:18;23063:6;23019:72;:::i;:::-;23101;23169:2;23158:9;23154:18;23145:6;23101:72;:::i;:::-;23220:9;23214:4;23210:20;23205:2;23194:9;23190:18;23183:48;23248:76;23319:4;23310:6;23248:76;:::i;:::-;23240:84;;22891:440;;;;;;;:::o;23337:332::-;;23496:2;23485:9;23481:18;23473:26;;23509:71;23577:1;23566:9;23562:17;23553:6;23509:71;:::i;:::-;23590:72;23658:2;23647:9;23643:18;23634:6;23590:72;:::i;:::-;23463:206;;;;;:::o;23675:210::-;;23800:2;23789:9;23785:18;23777:26;;23813:65;23875:1;23864:9;23860:17;23851:6;23813:65;:::i;:::-;23767:118;;;;:::o;23891:313::-;;24042:2;24031:9;24027:18;24019:26;;24091:9;24085:4;24081:20;24077:1;24066:9;24062:17;24055:47;24119:78;24192:4;24183:6;24119:78;:::i;:::-;24111:86;;24009:195;;;;:::o;24210:419::-;;24414:2;24403:9;24399:18;24391:26;;24463:9;24457:4;24453:20;24449:1;24438:9;24434:17;24427:47;24491:131;24617:4;24491:131;:::i;:::-;24483:139;;24381:248;;;:::o;24635:419::-;;24839:2;24828:9;24824:18;24816:26;;24888:9;24882:4;24878:20;24874:1;24863:9;24859:17;24852:47;24916:131;25042:4;24916:131;:::i;:::-;24908:139;;24806:248;;;:::o;25060:419::-;;25264:2;25253:9;25249:18;25241:26;;25313:9;25307:4;25303:20;25299:1;25288:9;25284:17;25277:47;25341:131;25467:4;25341:131;:::i;:::-;25333:139;;25231:248;;;:::o;25485:419::-;;25689:2;25678:9;25674:18;25666:26;;25738:9;25732:4;25728:20;25724:1;25713:9;25709:17;25702:47;25766:131;25892:4;25766:131;:::i;:::-;25758:139;;25656:248;;;:::o;25910:419::-;;26114:2;26103:9;26099:18;26091:26;;26163:9;26157:4;26153:20;26149:1;26138:9;26134:17;26127:47;26191:131;26317:4;26191:131;:::i;:::-;26183:139;;26081:248;;;:::o;26335:419::-;;26539:2;26528:9;26524:18;26516:26;;26588:9;26582:4;26578:20;26574:1;26563:9;26559:17;26552:47;26616:131;26742:4;26616:131;:::i;:::-;26608:139;;26506:248;;;:::o;26760:419::-;;26964:2;26953:9;26949:18;26941:26;;27013:9;27007:4;27003:20;26999:1;26988:9;26984:17;26977:47;27041:131;27167:4;27041:131;:::i;:::-;27033:139;;26931:248;;;:::o;27185:419::-;;27389:2;27378:9;27374:18;27366:26;;27438:9;27432:4;27428:20;27424:1;27413:9;27409:17;27402:47;27466:131;27592:4;27466:131;:::i;:::-;27458:139;;27356:248;;;:::o;27610:419::-;;27814:2;27803:9;27799:18;27791:26;;27863:9;27857:4;27853:20;27849:1;27838:9;27834:17;27827:47;27891:131;28017:4;27891:131;:::i;:::-;27883:139;;27781:248;;;:::o;28035:419::-;;28239:2;28228:9;28224:18;28216:26;;28288:9;28282:4;28278:20;28274:1;28263:9;28259:17;28252:47;28316:131;28442:4;28316:131;:::i;:::-;28308:139;;28206:248;;;:::o;28460:419::-;;28664:2;28653:9;28649:18;28641:26;;28713:9;28707:4;28703:20;28699:1;28688:9;28684:17;28677:47;28741:131;28867:4;28741:131;:::i;:::-;28733:139;;28631:248;;;:::o;28885:419::-;;29089:2;29078:9;29074:18;29066:26;;29138:9;29132:4;29128:20;29124:1;29113:9;29109:17;29102:47;29166:131;29292:4;29166:131;:::i;:::-;29158:139;;29056:248;;;:::o;29310:419::-;;29514:2;29503:9;29499:18;29491:26;;29563:9;29557:4;29553:20;29549:1;29538:9;29534:17;29527:47;29591:131;29717:4;29591:131;:::i;:::-;29583:139;;29481:248;;;:::o;29735:419::-;;29939:2;29928:9;29924:18;29916:26;;29988:9;29982:4;29978:20;29974:1;29963:9;29959:17;29952:47;30016:131;30142:4;30016:131;:::i;:::-;30008:139;;29906:248;;;:::o;30160:419::-;;30364:2;30353:9;30349:18;30341:26;;30413:9;30407:4;30403:20;30399:1;30388:9;30384:17;30377:47;30441:131;30567:4;30441:131;:::i;:::-;30433:139;;30331:248;;;:::o;30585:419::-;;30789:2;30778:9;30774:18;30766:26;;30838:9;30832:4;30828:20;30824:1;30813:9;30809:17;30802:47;30866:131;30992:4;30866:131;:::i;:::-;30858:139;;30756:248;;;:::o;31010:419::-;;31214:2;31203:9;31199:18;31191:26;;31263:9;31257:4;31253:20;31249:1;31238:9;31234:17;31227:47;31291:131;31417:4;31291:131;:::i;:::-;31283:139;;31181:248;;;:::o;31435:419::-;;31639:2;31628:9;31624:18;31616:26;;31688:9;31682:4;31678:20;31674:1;31663:9;31659:17;31652:47;31716:131;31842:4;31716:131;:::i;:::-;31708:139;;31606:248;;;:::o;31860:419::-;;32064:2;32053:9;32049:18;32041:26;;32113:9;32107:4;32103:20;32099:1;32088:9;32084:17;32077:47;32141:131;32267:4;32141:131;:::i;:::-;32133:139;;32031:248;;;:::o;32285:419::-;;32489:2;32478:9;32474:18;32466:26;;32538:9;32532:4;32528:20;32524:1;32513:9;32509:17;32502:47;32566:131;32692:4;32566:131;:::i;:::-;32558:139;;32456:248;;;:::o;32710:419::-;;32914:2;32903:9;32899:18;32891:26;;32963:9;32957:4;32953:20;32949:1;32938:9;32934:17;32927:47;32991:131;33117:4;32991:131;:::i;:::-;32983:139;;32881:248;;;:::o;33135:419::-;;33339:2;33328:9;33324:18;33316:26;;33388:9;33382:4;33378:20;33374:1;33363:9;33359:17;33352:47;33416:131;33542:4;33416:131;:::i;:::-;33408:139;;33306:248;;;:::o;33560:419::-;;33764:2;33753:9;33749:18;33741:26;;33813:9;33807:4;33803:20;33799:1;33788:9;33784:17;33777:47;33841:131;33967:4;33841:131;:::i;:::-;33833:139;;33731:248;;;:::o;33985:419::-;;34189:2;34178:9;34174:18;34166:26;;34238:9;34232:4;34228:20;34224:1;34213:9;34209:17;34202:47;34266:131;34392:4;34266:131;:::i;:::-;34258:139;;34156:248;;;:::o;34410:419::-;;34614:2;34603:9;34599:18;34591:26;;34663:9;34657:4;34653:20;34649:1;34638:9;34634:17;34627:47;34691:131;34817:4;34691:131;:::i;:::-;34683:139;;34581:248;;;:::o;34835:419::-;;35039:2;35028:9;35024:18;35016:26;;35088:9;35082:4;35078:20;35074:1;35063:9;35059:17;35052:47;35116:131;35242:4;35116:131;:::i;:::-;35108:139;;35006:248;;;:::o;35260:419::-;;35464:2;35453:9;35449:18;35441:26;;35513:9;35507:4;35503:20;35499:1;35488:9;35484:17;35477:47;35541:131;35667:4;35541:131;:::i;:::-;35533:139;;35431:248;;;:::o;35685:419::-;;35889:2;35878:9;35874:18;35866:26;;35938:9;35932:4;35928:20;35924:1;35913:9;35909:17;35902:47;35966:131;36092:4;35966:131;:::i;:::-;35958:139;;35856:248;;;:::o;36110:419::-;;36314:2;36303:9;36299:18;36291:26;;36363:9;36357:4;36353:20;36349:1;36338:9;36334:17;36327:47;36391:131;36517:4;36391:131;:::i;:::-;36383:139;;36281:248;;;:::o;36535:419::-;;36739:2;36728:9;36724:18;36716:26;;36788:9;36782:4;36778:20;36774:1;36763:9;36759:17;36752:47;36816:131;36942:4;36816:131;:::i;:::-;36808:139;;36706:248;;;:::o;36960:419::-;;37164:2;37153:9;37149:18;37141:26;;37213:9;37207:4;37203:20;37199:1;37188:9;37184:17;37177:47;37241:131;37367:4;37241:131;:::i;:::-;37233:139;;37131:248;;;:::o;37385:419::-;;37589:2;37578:9;37574:18;37566:26;;37638:9;37632:4;37628:20;37624:1;37613:9;37609:17;37602:47;37666:131;37792:4;37666:131;:::i;:::-;37658:139;;37556:248;;;:::o;37810:419::-;;38014:2;38003:9;37999:18;37991:26;;38063:9;38057:4;38053:20;38049:1;38038:9;38034:17;38027:47;38091:131;38217:4;38091:131;:::i;:::-;38083:139;;37981:248;;;:::o;38235:419::-;;38439:2;38428:9;38424:18;38416:26;;38488:9;38482:4;38478:20;38474:1;38463:9;38459:17;38452:47;38516:131;38642:4;38516:131;:::i;:::-;38508:139;;38406:248;;;:::o;38660:419::-;;38864:2;38853:9;38849:18;38841:26;;38913:9;38907:4;38903:20;38899:1;38888:9;38884:17;38877:47;38941:131;39067:4;38941:131;:::i;:::-;38933:139;;38831:248;;;:::o;39085:222::-;;39216:2;39205:9;39201:18;39193:26;;39229:71;39297:1;39286:9;39282:17;39273:6;39229:71;:::i;:::-;39183:124;;;;:::o;39313:283::-;;39379:2;39373:9;39363:19;;39421:4;39413:6;39409:17;39528:6;39516:10;39513:22;39492:18;39480:10;39477:34;39474:62;39471:2;;;39539:18;;:::i;:::-;39471:2;39579:10;39575:2;39568:22;39353:243;;;;:::o;39602:331::-;;39753:18;39745:6;39742:30;39739:2;;;39775:18;;:::i;:::-;39739:2;39860:4;39856:9;39849:4;39841:6;39837:17;39833:33;39825:41;;39921:4;39915;39911:15;39903:23;;39668:265;;;:::o;39939:332::-;;40091:18;40083:6;40080:30;40077:2;;;40113:18;;:::i;:::-;40077:2;40198:4;40194:9;40187:4;40179:6;40175:17;40171:33;40163:41;;40259:4;40253;40249:15;40241:23;;40006:265;;;:::o;40277:98::-;;40362:5;40356:12;40346:22;;40335:40;;;:::o;40381:99::-;;40467:5;40461:12;40451:22;;40440:40;;;:::o;40486:168::-;;40603:6;40598:3;40591:19;40643:4;40638:3;40634:14;40619:29;;40581:73;;;;:::o;40660:169::-;;40778:6;40773:3;40766:19;40818:4;40813:3;40809:14;40794:29;;40756:73;;;;:::o;40835:148::-;;40974:3;40959:18;;40949:34;;;;:::o;40989:305::-;;41048:20;41066:1;41048:20;:::i;:::-;41043:25;;41082:20;41100:1;41082:20;:::i;:::-;41077:25;;41236:1;41168:66;41164:74;41161:1;41158:81;41155:2;;;41242:18;;:::i;:::-;41155:2;41286:1;41283;41279:9;41272:16;;41033:261;;;;:::o;41300:185::-;;41357:20;41375:1;41357:20;:::i;:::-;41352:25;;41391:20;41409:1;41391:20;:::i;:::-;41386:25;;41430:1;41420:2;;41435:18;;:::i;:::-;41420:2;41477:1;41474;41470:9;41465:14;;41342:143;;;;:::o;41491:348::-;;41554:20;41572:1;41554:20;:::i;:::-;41549:25;;41588:20;41606:1;41588:20;:::i;:::-;41583:25;;41776:1;41708:66;41704:74;41701:1;41698:81;41693:1;41686:9;41679:17;41675:105;41672:2;;;41783:18;;:::i;:::-;41672:2;41831:1;41828;41824:9;41813:20;;41539:300;;;;:::o;41845:191::-;;41905:20;41923:1;41905:20;:::i;:::-;41900:25;;41939:20;41957:1;41939:20;:::i;:::-;41934:25;;41978:1;41975;41972:8;41969:2;;;41983:18;;:::i;:::-;41969:2;42028:1;42025;42021:9;42013:17;;41890:146;;;;:::o;42042:96::-;;42108:24;42126:5;42108:24;:::i;:::-;42097:35;;42087:51;;;:::o;42144:90::-;;42221:5;42214:13;42207:21;42196:32;;42186:48;;;:::o;42240:149::-;;42316:66;42309:5;42305:78;42294:89;;42284:105;;;:::o;42395:126::-;;42472:42;42465:5;42461:54;42450:65;;42440:81;;;:::o;42527:77::-;;42593:5;42582:16;;42572:32;;;:::o;42610:154::-;42694:6;42689:3;42684;42671:30;42756:1;42747:6;42742:3;42738:16;42731:27;42661:103;;;:::o;42770:307::-;42838:1;42848:113;42862:6;42859:1;42856:13;42848:113;;;42947:1;42942:3;42938:11;42932:18;42928:1;42923:3;42919:11;42912:39;42884:2;42881:1;42877:10;42872:15;;42848:113;;;42979:6;42976:1;42973:13;42970:2;;;43059:1;43050:6;43045:3;43041:16;43034:27;42970:2;42819:258;;;;:::o;43083:320::-;;43164:1;43158:4;43154:12;43144:22;;43211:1;43205:4;43201:12;43232:18;43222:2;;43288:4;43280:6;43276:17;43266:27;;43222:2;43350;43342:6;43339:14;43319:18;43316:38;43313:2;;;43369:18;;:::i;:::-;43313:2;43134:269;;;;:::o;43409:233::-;;43471:24;43489:5;43471:24;:::i;:::-;43462:33;;43517:66;43510:5;43507:77;43504:2;;;43587:18;;:::i;:::-;43504:2;43634:1;43627:5;43623:13;43616:20;;43452:190;;;:::o;43648:176::-;;43697:20;43715:1;43697:20;:::i;:::-;43692:25;;43731:20;43749:1;43731:20;:::i;:::-;43726:25;;43770:1;43760:2;;43775:18;;:::i;:::-;43760:2;43816:1;43813;43809:9;43804:14;;43682:142;;;;:::o;43830:180::-;43878:77;43875:1;43868:88;43975:4;43972:1;43965:15;43999:4;43996:1;43989:15;44016:180;44064:77;44061:1;44054:88;44161:4;44158:1;44151:15;44185:4;44182:1;44175:15;44202:180;44250:77;44247:1;44240:88;44347:4;44344:1;44337:15;44371:4;44368:1;44361:15;44388:180;44436:77;44433:1;44426:88;44533:4;44530:1;44523:15;44557:4;44554:1;44547:15;44574:102;;44666:2;44662:7;44657:2;44650:5;44646:14;44642:28;44632:38;;44622:54;;;:::o;44682:122::-;44755:24;44773:5;44755:24;:::i;:::-;44748:5;44745:35;44735:2;;44794:1;44791;44784:12;44735:2;44725:79;:::o;44810:116::-;44880:21;44895:5;44880:21;:::i;:::-;44873:5;44870:32;44860:2;;44916:1;44913;44906:12;44860:2;44850:76;:::o;44932:120::-;45004:23;45021:5;45004:23;:::i;:::-;44997:5;44994:34;44984:2;;45042:1;45039;45032:12;44984:2;44974:78;:::o;45058:122::-;45131:24;45149:5;45131:24;:::i;:::-;45124:5;45121:35;45111:2;;45170:1;45167;45160:12;45111:2;45101:79;:::o

Swarm Source

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