ETH Price: $3,861.66 (-1.28%)

Token

Raccoon Secret Project (RSP)
 

Overview

Max Total Supply

227 RSP

Holders

153

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 RSP
0x5E8dF48ed819d791914045D4C852d61045A9E912
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:
RaccoonSecretProject

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-31
*/

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



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: contracts/RSP.sol

// SPDX-License-Identifier: MIT
/**
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0l.      'l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0c.          .l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWk.   .:lool;.   'kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0'   :KWMMMMWO'   ,0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMx.  .OMMMMMMMWd   .kMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO.  .oNMMMMMMK;   .OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNo.   ,okkkxl'   .oNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNx'            ,kNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNXkc,......,lkXWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0:;d0XNXKKKKXWWKx::0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMWk'    .,clox0WNd.   'kWMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMNd.         ckKKc      .dNMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMXl.        .dNMXc        .lXMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMK:         ,OWMMWO,         :KMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMW0,         cKMMMMMMK:         ,0WMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMWk'        .oNMMMMMMMMNo.        'kWMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMNd.      ..;kWMMMMMMMMMMWk;..      .dNMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMXl.    'lkKXNWMMMMMMMMMMMMWNXKkl'    .lXMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMK:    .oXMMMMMMMMMMMMMMMMMMMMMMMMXo.    :KMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMW0,    .xWMMMMMMMMMMMMMMMMMMMMMMMMMMWx.    ,0WMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMWk'     .,:cdOXNNK0OOkkkkkkOO0XNNXOdc;,.     'kWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMNd.    .       .'...          ..''.      ..    .dNMMMMMMMMMMMMMMM
ONMMMMMMMMMMMMXl.    :x;                                :k:    .lXMMMMMMMMMMMWX0
.'dKWMMMMMMMMK:     ,l:.                                .cl,     :KMMMMMMMMW0l.,
.  .l0WMMMMW0,     ..    ..;cloddolc'      ,cloddolc;.     ..     ,OWMMMMNOc.  '
.    .:ONMWk.     ..  .;d0NWMMMMMMMMNo.  .dNMMMMMMMMWX0d,   ..     .kWMXx;.    '
.      .;dl.    .;'. 'xNMMMMMMMMMMMMM0'  ,KMMMMMMMMMMMMMNx. .';.    .dXx.      ,
.    .         ,0WN0k0Odoodk0XWMMMMMMk.  'OMMMMMMWX0kdood00kKNWO,    .l0o..    ,
x,...         ;KMMMMMWXkc.  ..;ok00Od'    ,xO00kl;..  .ckNMMMMMMO'     :Ox'...;k
MNO:.        ;clONMMMMMMWXx;.     .          .     .:xXWMMMMMMXx;       ,Ok;l0WM
MMMNk'     'c:. .;xXMMMMMMMW0o,.                .;dKWMMMMMMWKd'          .xNWMMM
MMMNd.  .;l:.      'oKWMMMMMMMNOl,   'xOOd'  .,o0WMMMMMMMW0l.             .dNMMM
MMXl. 'o0Kc..        .l0WMMMMMMMMNOl'.';;'.,oONMMMMMMMMNO:.       ...;xOo' .lXMM
MK:.;xXMMMNOc.     .   .:kNMMMMMMMMMNklccoONMMMMMMMMMXx;.         .l0NMMWXx;.:KM
0llOWMMMMMMMNO:. ...      ,xXMMMMMMMMMMMMMMMMMMMMMWKo'      ... .l0WMMMMMMMWOll0
KXWMMMMMMMMMMMW0d;          'oKWMMMMMMMMMMMMMMMMW0l.         .:xKWMMMMMMMMMMMWXK
MMMMMMMMMMMMMMMMWKd'.         .l0WMMMMMMMMMMMMNk:.         .,xXMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMNk:.    ..   .:kNMMMMMMMMXx;    .     .lONMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMNO:....       ,xXMMMWKo'       ....c0WMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMWKd'          'oxxl.          ,xXWMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMWKo,..                  ..;xXWMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMNk;    ..      ..   .cONMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNk:'..        ..'c0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKl.        'dXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKo'    ,dXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0:.'lXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
*/

pragma solidity ^0.8.0;







interface IRaccoonSecretSociety {
    function ownerOf(uint256) external view returns (address);
    function isHarbingerExternal(uint256) external view returns (bool);
    function ritualCheck(uint256, uint256, uint256) external view returns (bool);
    function renounceHarbinger(uint256) external;
    function transferFrom(address, address, uint256) external;
}

interface ERC721TokenReceiver
{
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}

contract RaccoonSecretProject is ERC721, ERC721Enumerable, Ownable, IERC721Receiver {
    using Strings for uint256;
    
    address public RSS_CONTRACT;
    uint256 public MAX_TOKENS = 333;
    bool public allowMint = false;
    bool public secretFound = false;
    string private _baseURIextended;
    string private _baseURIupgrade;
    uint256 public MAX_ANGEL_LVL = 0;
    mapping (address => uint256) public sacrificedRaccoons;
    mapping (uint256 => uint256) public angelLevels;
    
    constructor() ERC721("Raccoon Secret Project", "RSP") {
    }

    function onERC721Received(address _operator, address _from, uint256, bytes calldata) external override returns(bytes4) {
        if (msg.sender == RSS_CONTRACT) {
            sacrificedRaccoons[_from] = sacrificedRaccoons[_from] + 1;
        }
        return 0x150b7a02;
    }

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

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
    
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }
    
    function setBaseURIUpgrade(string memory baseURI_) external onlyOwner {
        _baseURIupgrade = baseURI_;
    }
    
    function setMaxTokens(uint256 _max) public onlyOwner {
        MAX_TOKENS = _max;
    }
    
    function setMaxLevel(uint256 _level) public onlyOwner {
        MAX_ANGEL_LVL = _level;
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
    
    function _baseURIUpgrade() internal view virtual returns (string memory) {
        return _baseURIupgrade;
    }
    
    function setRSSAddr(address _address) public onlyOwner {
       RSS_CONTRACT = _address;
    }
    
    function secretFunction() public payable {
        require(!secretFound, "It is not a secret anymore...");
        require(1000000000000000000 <= msg.value, "Ether value sent is not correct"); // 1 ETH

        _safeMint(msg.sender, 1);
        secretFound = true;
    }
    
    function reserveTokens(uint numberOfTokens) public onlyOwner {
        uint supply = totalSupply();
        require(supply + numberOfTokens <= MAX_TOKENS, "Reserve would exceed max supply of tokens");
        uint mintIndex;
        for (mintIndex = supply + 2; mintIndex <= supply + numberOfTokens; mintIndex++) {
            _safeMint(msg.sender, mintIndex);
        }
    }
    
    function flipMintState() public onlyOwner {
        allowMint = !allowMint;
    }
    
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
    
    function ritual(uint256 tokenId1, uint256 tokenId2, uint256 tokenId3) public {
        require(allowMint, "Ritual cannot be performed right now");
        require(totalSupply() + 2 <= MAX_TOKENS, "All angels are minted");
        require(tokenId1 != tokenId2 && tokenId2 != tokenId3 && tokenId1 != tokenId3, "At least 3 harbingers required");
        require(IRaccoonSecretSociety(RSS_CONTRACT).ownerOf(tokenId1) == msg.sender && IRaccoonSecretSociety(RSS_CONTRACT).ownerOf(tokenId2) == msg.sender && IRaccoonSecretSociety(RSS_CONTRACT).ownerOf(tokenId3) == msg.sender);
        require(IRaccoonSecretSociety(RSS_CONTRACT).ritualCheck(tokenId1, tokenId2, tokenId3), "At least 3 harbingers required");
        IRaccoonSecretSociety(RSS_CONTRACT).renounceHarbinger(tokenId1);
        IRaccoonSecretSociety(RSS_CONTRACT).renounceHarbinger(tokenId2);
        IRaccoonSecretSociety(RSS_CONTRACT).renounceHarbinger(tokenId3);
         _safeMint(msg.sender, totalSupply() + 2);
    }
    
    function ritual(uint256 tokenId1, uint256 tokenId2) public {
        require(allowMint, "Ritual cannot be performed right now");
        require(totalSupply() + 2 <= MAX_TOKENS, "All angels are minted");
        require(tokenId1 <= 1588 || tokenId2 <= 1588, "At least one early minted harbinger required");
        require(tokenId1 != tokenId2, "At least 2 harbingers required");
        require(IRaccoonSecretSociety(RSS_CONTRACT).ownerOf(tokenId1) == msg.sender && IRaccoonSecretSociety(RSS_CONTRACT).ownerOf(tokenId2) == msg.sender);
        require(IRaccoonSecretSociety(RSS_CONTRACT).isHarbingerExternal(tokenId1) && IRaccoonSecretSociety(RSS_CONTRACT).isHarbingerExternal(tokenId2), "At least 2 harbingers required");
        IRaccoonSecretSociety(RSS_CONTRACT).renounceHarbinger(tokenId1);
        IRaccoonSecretSociety(RSS_CONTRACT).renounceHarbinger(tokenId2);
        _safeMint(msg.sender, totalSupply() + 2);
    }
    
    function angelUpgrade(uint256 tokenId) public {
        require(ownerOf(tokenId) == msg.sender, "You do not own this angel");
        require(sacrificedRaccoons[msg.sender] >= 3, "You need to sacrifice more");
        require(angelLevels[tokenId] + 1 <= MAX_ANGEL_LVL, "You are not prepared");
        sacrificedRaccoons[msg.sender] = 0;
        angelLevels[tokenId] = angelLevels[tokenId] + 1;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory baseURI;
        if (angelLevels[tokenId] > 0) {
            tokenId = tokenId + MAX_TOKENS * angelLevels[tokenId];
            baseURI = _baseURIUpgrade();
        } else {
            baseURI = _baseURI();
        }
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_ANGEL_LVL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RSS_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"angelLevels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"angelUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintState","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId1","type":"uint256"},{"internalType":"uint256","name":"tokenId2","type":"uint256"}],"name":"ritual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId1","type":"uint256"},{"internalType":"uint256","name":"tokenId2","type":"uint256"},{"internalType":"uint256","name":"tokenId3","type":"uint256"}],"name":"ritual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sacrificedRaccoons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secretFound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secretFunction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURIUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_level","type":"uint256"}],"name":"setMaxLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRSSAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261014d600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff02191690831515021790555060006010553480156200005257600080fd5b506040518060400160405280601681526020017f526163636f6f6e205365637265742050726f6a656374000000000000000000008152506040518060400160405280600381526020017f52535000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d7929190620001e7565b508060019080519060200190620000f0929190620001e7565b50505062000113620001076200011960201b60201c565b6200012160201b60201c565b620002fc565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f59062000297565b90600052602060002090601f01602090048101928262000219576000855562000265565b82601f106200023457805160ff191683800117855562000265565b8280016001018555821562000265579182015b828111156200026457825182559160200191906001019062000247565b5b50905062000274919062000278565b5090565b5b808211156200029357600081600090555060010162000279565b5090565b60006002820490506001821680620002b057607f821691505b60208210811415620002c757620002c6620002cd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61587d806200030c6000396000f3fe6080604052600436106102305760003560e01c80636352211e1161012e578063c1b070a4116100ab578063e6df22ee1161006f578063e6df22ee14610849578063e985e9c514610853578063edcf7e2e14610890578063f2fde38b146108b9578063f47c84c5146108e257610230565b8063c1b070a414610752578063c87b56dd1461077d578063cea23400146107ba578063d031370b146107e3578063dcf4840e1461080c57610230565b8063908d313d116100f2578063908d313d1461068157806395d89b41146106aa578063a22cb465146106d5578063a56d091b146106fe578063b88d4fde1461072957610230565b80636352211e1461059a5780636af98f51146105d757806370a0823114610602578063715018a61461063f5780638da5cb5b1461065657610230565b80632660bd16116101bc5780634775c4a5116101805780634775c4a5146104b75780634f6ccce7146104f457806355f804b3146105315780635625c97c1461055a57806359c74f291461058357610230565b80632660bd16146103e85780632f745c5914610411578063344f1ba51461044e5780633ccfd60b1461047757806342842e0e1461048e57610230565b806311e776fe1161020357806311e776fe14610303578063150b7a021461032c57806318160ddd146103695780631b8dca741461039457806323b872dd146103bf57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061418f565b61090d565b6040516102699190614837565b60405180910390f35b34801561027e57600080fd5b5061028761091f565b604051610294919061486d565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190614222565b6109b1565b6040516102d191906147d0565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061412a565b610a36565b005b34801561030f57600080fd5b5061032a60048036038101906103259190614222565b610b4e565b005b34801561033857600080fd5b50610353600480360381019061034e9190613ff3565b610bd4565b6040516103609190614852565b60405180910390f35b34801561037557600080fd5b5061037e610ccf565b60405161038b9190614c2f565b60405180910390f35b3480156103a057600080fd5b506103a9610cdc565b6040516103b69190614837565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190613fa4565b610cef565b005b3480156103f457600080fd5b5061040f600480360381019061040a919061424b565b610d4f565b005b34801561041d57600080fd5b506104386004803603810190610433919061412a565b611326565b6040516104459190614c2f565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190614222565b6113cb565b005b34801561048357600080fd5b5061048c611451565b005b34801561049a57600080fd5b506104b560048036038101906104b09190613fa4565b61151c565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613f16565b61153c565b6040516104eb9190614c2f565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190614222565b611554565b6040516105289190614c2f565b60405180910390f35b34801561053d57600080fd5b50610558600480360381019061055391906141e1565b6115eb565b005b34801561056657600080fd5b50610581600480360381019061057c9190614222565b611681565b005b34801561058f57600080fd5b5061059861185d565b005b3480156105a657600080fd5b506105c160048036038101906105bc9190614222565b611905565b6040516105ce91906147d0565b60405180910390f35b3480156105e357600080fd5b506105ec6119b7565b6040516105f99190614837565b60405180910390f35b34801561060e57600080fd5b5061062960048036038101906106249190613f16565b6119ca565b6040516106369190614c2f565b60405180910390f35b34801561064b57600080fd5b50610654611a82565b005b34801561066257600080fd5b5061066b611b0a565b60405161067891906147d0565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a39190613f16565b611b34565b005b3480156106b657600080fd5b506106bf611bf4565b6040516106cc919061486d565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f791906140ee565b611c86565b005b34801561070a57600080fd5b50610713611e07565b60405161072091906147d0565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190614073565b611e2d565b005b34801561075e57600080fd5b50610767611e8f565b6040516107749190614c2f565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f9190614222565b611e95565b6040516107b1919061486d565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc91906141e1565b611f96565b005b3480156107ef57600080fd5b5061080a60048036038101906108059190614222565b61202c565b005b34801561081857600080fd5b50610833600480360381019061082e9190614222565b61214a565b6040516108409190614c2f565b60405180910390f35b610851612162565b005b34801561085f57600080fd5b5061087a60048036038101906108759190613f68565b612225565b6040516108879190614837565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b29190614287565b6122b9565b005b3480156108c557600080fd5b506108e060048036038101906108db9190613f16565b612916565b005b3480156108ee57600080fd5b506108f7612a0e565b6040516109049190614c2f565b60405180910390f35b600061091882612a14565b9050919050565b60606000805461092e90614f16565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90614f16565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b5050505050905090565b60006109bc82612a8e565b6109fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f290614acf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4182611905565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa990614b4f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad1612afa565b73ffffffffffffffffffffffffffffffffffffffff161480610b005750610aff81610afa612afa565b612225565b5b610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3690614a0f565b60405180910390fd5b610b498383612b02565b505050565b610b56612afa565b73ffffffffffffffffffffffffffffffffffffffff16610b74611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190614aef565b60405180910390fd5b80600c8190555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610cbc576001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c789190614d4b565b601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b63150b7a0260e01b905095945050505050565b6000600880549050905090565b600d60009054906101000a900460ff1681565b610d00610cfa612afa565b82612bbb565b610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690614b8f565b60405180910390fd5b610d4a838383612c99565b505050565b600d60009054906101000a900460ff16610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d95906149ef565b60405180910390fd5b600c546002610dab610ccf565b610db59190614d4b565b1115610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded90614bcf565b60405180910390fd5b61063482111580610e0957506106348111155b610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f9061494f565b60405180910390fd5b80821415610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290614baf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610efd9190614c2f565b60206040518083038186803b158015610f1557600080fd5b505afa158015610f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4d9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff1614801561104557503373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610fdd9190614c2f565b60206040518083038186803b158015610ff557600080fd5b505afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff16145b61104e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab6b736836040518263ffffffff1660e01b81526004016110a99190614c2f565b60206040518083038186803b1580156110c157600080fd5b505afa1580156110d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f99190614166565b80156111ac5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab6b736826040518263ffffffff1660e01b815260040161115b9190614c2f565b60206040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab9190614166565b5b6111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e290614baf565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2836040518263ffffffff1660e01b81526004016112469190614c2f565b600060405180830381600087803b15801561126057600080fd5b505af1158015611274573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2826040518263ffffffff1660e01b81526004016112d39190614c2f565b600060405180830381600087803b1580156112ed57600080fd5b505af1158015611301573d6000803e3d6000fd5b50505050611322336002611313610ccf565b61131d9190614d4b565b612ef5565b5050565b6000611331836119ca565b8210611372576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611369906148cf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6113d3612afa565b73ffffffffffffffffffffffffffffffffffffffff166113f1611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e90614aef565b60405180910390fd5b8060108190555050565b611459612afa565b73ffffffffffffffffffffffffffffffffffffffff16611477611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490614aef565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611518573d6000803e3d6000fd5b5050565b61153783838360405180602001604052806000815250611e2d565b505050565b60116020528060005260406000206000915090505481565b600061155e610ccf565b821061159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690614bef565b60405180910390fd5b600882815481106115d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6115f3612afa565b73ffffffffffffffffffffffffffffffffffffffff16611611611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e90614aef565b60405180910390fd5b80600e908051906020019061167d929190613cc6565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166116a182611905565b73ffffffffffffffffffffffffffffffffffffffff16146116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee906148af565b60405180910390fd5b6003601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561177a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117719061488f565b60405180910390fd5b6010546001601260008481526020019081526020016000205461179d9190614d4b565b11156117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590614a2f565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160126000838152602001908152602001600020546118439190614d4b565b601260008381526020019081526020016000208190555050565b611865612afa565b73ffffffffffffffffffffffffffffffffffffffff16611883611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d090614aef565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590614a6f565b60405180910390fd5b80915050919050565b600d60019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3290614a4f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a8a612afa565b73ffffffffffffffffffffffffffffffffffffffff16611aa8611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590614aef565b60405180910390fd5b611b086000612f13565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b3c612afa565b73ffffffffffffffffffffffffffffffffffffffff16611b5a611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614611bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba790614aef565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611c0390614f16565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2f90614f16565b8015611c7c5780601f10611c5157610100808354040283529160200191611c7c565b820191906000526020600020905b815481529060010190602001808311611c5f57829003601f168201915b5050505050905090565b611c8e612afa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf39061498f565b60405180910390fd5b8060056000611d09612afa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611db6612afa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dfb9190614837565b60405180910390a35050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e3e611e38612afa565b83612bbb565b611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490614b8f565b60405180910390fd5b611e8984848484612fd9565b50505050565b60105481565b6060611ea082612a8e565b611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690614b2f565b60405180910390fd5b6060600060126000858152602001908152602001600020541115611f3a576012600084815260200190815260200160002054600c54611f1e9190614dd2565b83611f299190614d4b565b9250611f33613035565b9050611f45565b611f426130c7565b90505b6000815111611f635760405180602001604052806000815250611f8e565b80611f6d84613159565b604051602001611f7e9291906147ac565b6040516020818303038152906040525b915050919050565b611f9e612afa565b73ffffffffffffffffffffffffffffffffffffffff16611fbc611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614612012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200990614aef565b60405180910390fd5b80600f9080519060200190612028929190613cc6565b5050565b612034612afa565b73ffffffffffffffffffffffffffffffffffffffff16612052611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614aef565b60405180910390fd5b60006120b2610ccf565b9050600c5482826120c39190614d4b565b1115612104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fb90614c0f565b60405180910390fd5b60006002826121139190614d4b565b90505b82826121229190614d4b565b8111612145576121323382612ef5565b808061213d90614f79565b915050612116565b505050565b60126020528060005260406000206000915090505481565b600d60019054906101000a900460ff16156121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a990614b6f565b60405180910390fd5b34670de0b6b3a764000011156121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f4906149af565b60405180910390fd5b612208336001612ef5565b6001600d60016101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff16612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff906149ef565b60405180910390fd5b600c546002612315610ccf565b61231f9190614d4b565b1115612360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235790614bcf565b60405180910390fd5b8183141580156123705750808214155b801561237c5750808314155b6123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290614a8f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b815260040161242d9190614c2f565b60206040518083038186803b15801561244557600080fd5b505afa158015612459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247d9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff1614801561257557503373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161250d9190614c2f565b60206040518083038186803b15801561252557600080fd5b505afa158015612539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255d9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff16145b801561265657503373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016125ee9190614c2f565b60206040518083038186803b15801561260657600080fd5b505afa15801561261a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263e9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff16145b61265f57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f8494758484846040518463ffffffff1660e01b81526004016126be93929190614c4a565b60206040518083038186803b1580156126d657600080fd5b505afa1580156126ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270e9190614166565b61274d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274490614a8f565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2846040518263ffffffff1660e01b81526004016127a89190614c2f565b600060405180830381600087803b1580156127c257600080fd5b505af11580156127d6573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2836040518263ffffffff1660e01b81526004016128359190614c2f565b600060405180830381600087803b15801561284f57600080fd5b505af1158015612863573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2826040518263ffffffff1660e01b81526004016128c29190614c2f565b600060405180830381600087803b1580156128dc57600080fd5b505af11580156128f0573d6000803e3d6000fd5b50505050612911336002612902610ccf565b61290c9190614d4b565b612ef5565b505050565b61291e612afa565b73ffffffffffffffffffffffffffffffffffffffff1661293c611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614612992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298990614aef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f99061490f565b60405180910390fd5b612a0b81612f13565b50565b600c5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a875750612a8682613306565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b7583611905565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bc682612a8e565b612c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfc906149cf565b60405180910390fd5b6000612c1083611905565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c7f57508373ffffffffffffffffffffffffffffffffffffffff16612c67846109b1565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c905750612c8f8185612225565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb982611905565b73ffffffffffffffffffffffffffffffffffffffff1614612d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0690614b0f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d769061496f565b60405180910390fd5b612d8a8383836133e8565b612d95600082612b02565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de59190614e2c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e3c9190614d4b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612f0f8282604051806020016040528060008152506133f8565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fe4848484612c99565b612ff084848484613453565b61302f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613026906148ef565b60405180910390fd5b50505050565b6060600f805461304490614f16565b80601f016020809104026020016040519081016040528092919081815260200182805461307090614f16565b80156130bd5780601f10613092576101008083540402835291602001916130bd565b820191906000526020600020905b8154815290600101906020018083116130a057829003601f168201915b5050505050905090565b6060600e80546130d690614f16565b80601f016020809104026020016040519081016040528092919081815260200182805461310290614f16565b801561314f5780601f106131245761010080835404028352916020019161314f565b820191906000526020600020905b81548152906001019060200180831161313257829003601f168201915b5050505050905090565b606060008214156131a1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613301565b600082905060005b600082146131d35780806131bc90614f79565b915050600a826131cc9190614da1565b91506131a9565b60008167ffffffffffffffff811115613215577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132475781602001600182028036833780820191505090505b5090505b600085146132fa576001826132609190614e2c565b9150600a8561326f9190614fc2565b603061327b9190614d4b565b60f81b8183815181106132b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132f39190614da1565b945061324b565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133d157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133e157506133e0826135ea565b5b9050919050565b6133f3838383613654565b505050565b6134028383613768565b61340f6000848484613453565b61344e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613445906148ef565b60405180910390fd5b505050565b60006134748473ffffffffffffffffffffffffffffffffffffffff16613936565b156135dd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261349d612afa565b8786866040518563ffffffff1660e01b81526004016134bf94939291906147eb565b602060405180830381600087803b1580156134d957600080fd5b505af192505050801561350a57506040513d601f19601f8201168201806040525081019061350791906141b8565b60015b61358d573d806000811461353a576040519150601f19603f3d011682016040523d82523d6000602084013e61353f565b606091505b50600081511415613585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357c906148ef565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135e2565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61365f838383613949565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156136a25761369d8161394e565b6136e1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136e0576136df8382613997565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137245761371f81613b04565b613763565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613762576137618282613c47565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137cf90614aaf565b60405180910390fd5b6137e181612a8e565b15613821576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138189061492f565b60405180910390fd5b61382d600083836133e8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461387d9190614d4b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016139a4846119ca565b6139ae9190614e2c565b9050600060076000848152602001908152602001600020549050818114613a93576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b189190614e2c565b9050600060096000848152602001908152602001600020549050600060088381548110613b6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613bb6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613c2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613c52836119ca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613cd290614f16565b90600052602060002090601f016020900481019282613cf45760008555613d3b565b82601f10613d0d57805160ff1916838001178555613d3b565b82800160010185558215613d3b579182015b82811115613d3a578251825591602001919060010190613d1f565b5b509050613d489190613d4c565b5090565b5b80821115613d65576000816000905550600101613d4d565b5090565b6000613d7c613d7784614ca6565b614c81565b905082815260208101848484011115613d9457600080fd5b613d9f848285614ed4565b509392505050565b6000613dba613db584614cd7565b614c81565b905082815260208101848484011115613dd257600080fd5b613ddd848285614ed4565b509392505050565b600081359050613df4816157eb565b92915050565b600081519050613e09816157eb565b92915050565b600081359050613e1e81615802565b92915050565b600081519050613e3381615802565b92915050565b600081359050613e4881615819565b92915050565b600081519050613e5d81615819565b92915050565b60008083601f840112613e7557600080fd5b8235905067ffffffffffffffff811115613e8e57600080fd5b602083019150836001820283011115613ea657600080fd5b9250929050565b600082601f830112613ebe57600080fd5b8135613ece848260208601613d69565b91505092915050565b600082601f830112613ee857600080fd5b8135613ef8848260208601613da7565b91505092915050565b600081359050613f1081615830565b92915050565b600060208284031215613f2857600080fd5b6000613f3684828501613de5565b91505092915050565b600060208284031215613f5157600080fd5b6000613f5f84828501613dfa565b91505092915050565b60008060408385031215613f7b57600080fd5b6000613f8985828601613de5565b9250506020613f9a85828601613de5565b9150509250929050565b600080600060608486031215613fb957600080fd5b6000613fc786828701613de5565b9350506020613fd886828701613de5565b9250506040613fe986828701613f01565b9150509250925092565b60008060008060006080868803121561400b57600080fd5b600061401988828901613de5565b955050602061402a88828901613de5565b945050604061403b88828901613f01565b935050606086013567ffffffffffffffff81111561405857600080fd5b61406488828901613e63565b92509250509295509295909350565b6000806000806080858703121561408957600080fd5b600061409787828801613de5565b94505060206140a887828801613de5565b93505060406140b987828801613f01565b925050606085013567ffffffffffffffff8111156140d657600080fd5b6140e287828801613ead565b91505092959194509250565b6000806040838503121561410157600080fd5b600061410f85828601613de5565b925050602061412085828601613e0f565b9150509250929050565b6000806040838503121561413d57600080fd5b600061414b85828601613de5565b925050602061415c85828601613f01565b9150509250929050565b60006020828403121561417857600080fd5b600061418684828501613e24565b91505092915050565b6000602082840312156141a157600080fd5b60006141af84828501613e39565b91505092915050565b6000602082840312156141ca57600080fd5b60006141d884828501613e4e565b91505092915050565b6000602082840312156141f357600080fd5b600082013567ffffffffffffffff81111561420d57600080fd5b61421984828501613ed7565b91505092915050565b60006020828403121561423457600080fd5b600061424284828501613f01565b91505092915050565b6000806040838503121561425e57600080fd5b600061426c85828601613f01565b925050602061427d85828601613f01565b9150509250929050565b60008060006060848603121561429c57600080fd5b60006142aa86828701613f01565b93505060206142bb86828701613f01565b92505060406142cc86828701613f01565b9150509250925092565b6142df81614e60565b82525050565b6142ee81614e72565b82525050565b6142fd81614e7e565b82525050565b600061430e82614d08565b6143188185614d1e565b9350614328818560208601614ee3565b614331816150af565b840191505092915050565b600061434782614d13565b6143518185614d2f565b9350614361818560208601614ee3565b61436a816150af565b840191505092915050565b600061438082614d13565b61438a8185614d40565b935061439a818560208601614ee3565b80840191505092915050565b60006143b3601a83614d2f565b91506143be826150c0565b602082019050919050565b60006143d6601983614d2f565b91506143e1826150e9565b602082019050919050565b60006143f9602b83614d2f565b915061440482615112565b604082019050919050565b600061441c603283614d2f565b915061442782615161565b604082019050919050565b600061443f602683614d2f565b915061444a826151b0565b604082019050919050565b6000614462601c83614d2f565b915061446d826151ff565b602082019050919050565b6000614485602c83614d2f565b915061449082615228565b604082019050919050565b60006144a8602483614d2f565b91506144b382615277565b604082019050919050565b60006144cb601983614d2f565b91506144d6826152c6565b602082019050919050565b60006144ee601f83614d2f565b91506144f9826152ef565b602082019050919050565b6000614511602c83614d2f565b915061451c82615318565b604082019050919050565b6000614534602483614d2f565b915061453f82615367565b604082019050919050565b6000614557603883614d2f565b9150614562826153b6565b604082019050919050565b600061457a601483614d2f565b915061458582615405565b602082019050919050565b600061459d602a83614d2f565b91506145a88261542e565b604082019050919050565b60006145c0602983614d2f565b91506145cb8261547d565b604082019050919050565b60006145e3601e83614d2f565b91506145ee826154cc565b602082019050919050565b6000614606602083614d2f565b9150614611826154f5565b602082019050919050565b6000614629602c83614d2f565b91506146348261551e565b604082019050919050565b600061464c602083614d2f565b91506146578261556d565b602082019050919050565b600061466f602983614d2f565b915061467a82615596565b604082019050919050565b6000614692602f83614d2f565b915061469d826155e5565b604082019050919050565b60006146b5602183614d2f565b91506146c082615634565b604082019050919050565b60006146d8601d83614d2f565b91506146e382615683565b602082019050919050565b60006146fb603183614d2f565b9150614706826156ac565b604082019050919050565b600061471e601e83614d2f565b9150614729826156fb565b602082019050919050565b6000614741601583614d2f565b915061474c82615724565b602082019050919050565b6000614764602c83614d2f565b915061476f8261574d565b604082019050919050565b6000614787602983614d2f565b91506147928261579c565b604082019050919050565b6147a681614eca565b82525050565b60006147b88285614375565b91506147c48284614375565b91508190509392505050565b60006020820190506147e560008301846142d6565b92915050565b600060808201905061480060008301876142d6565b61480d60208301866142d6565b61481a604083018561479d565b818103606083015261482c8184614303565b905095945050505050565b600060208201905061484c60008301846142e5565b92915050565b600060208201905061486760008301846142f4565b92915050565b60006020820190508181036000830152614887818461433c565b905092915050565b600060208201905081810360008301526148a8816143a6565b9050919050565b600060208201905081810360008301526148c8816143c9565b9050919050565b600060208201905081810360008301526148e8816143ec565b9050919050565b600060208201905081810360008301526149088161440f565b9050919050565b6000602082019050818103600083015261492881614432565b9050919050565b6000602082019050818103600083015261494881614455565b9050919050565b6000602082019050818103600083015261496881614478565b9050919050565b600060208201905081810360008301526149888161449b565b9050919050565b600060208201905081810360008301526149a8816144be565b9050919050565b600060208201905081810360008301526149c8816144e1565b9050919050565b600060208201905081810360008301526149e881614504565b9050919050565b60006020820190508181036000830152614a0881614527565b9050919050565b60006020820190508181036000830152614a288161454a565b9050919050565b60006020820190508181036000830152614a488161456d565b9050919050565b60006020820190508181036000830152614a6881614590565b9050919050565b60006020820190508181036000830152614a88816145b3565b9050919050565b60006020820190508181036000830152614aa8816145d6565b9050919050565b60006020820190508181036000830152614ac8816145f9565b9050919050565b60006020820190508181036000830152614ae88161461c565b9050919050565b60006020820190508181036000830152614b088161463f565b9050919050565b60006020820190508181036000830152614b2881614662565b9050919050565b60006020820190508181036000830152614b4881614685565b9050919050565b60006020820190508181036000830152614b68816146a8565b9050919050565b60006020820190508181036000830152614b88816146cb565b9050919050565b60006020820190508181036000830152614ba8816146ee565b9050919050565b60006020820190508181036000830152614bc881614711565b9050919050565b60006020820190508181036000830152614be881614734565b9050919050565b60006020820190508181036000830152614c0881614757565b9050919050565b60006020820190508181036000830152614c288161477a565b9050919050565b6000602082019050614c44600083018461479d565b92915050565b6000606082019050614c5f600083018661479d565b614c6c602083018561479d565b614c79604083018461479d565b949350505050565b6000614c8b614c9c565b9050614c978282614f48565b919050565b6000604051905090565b600067ffffffffffffffff821115614cc157614cc0615080565b5b614cca826150af565b9050602081019050919050565b600067ffffffffffffffff821115614cf257614cf1615080565b5b614cfb826150af565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d5682614eca565b9150614d6183614eca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d9657614d95614ff3565b5b828201905092915050565b6000614dac82614eca565b9150614db783614eca565b925082614dc757614dc6615022565b5b828204905092915050565b6000614ddd82614eca565b9150614de883614eca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e2157614e20614ff3565b5b828202905092915050565b6000614e3782614eca565b9150614e4283614eca565b925082821015614e5557614e54614ff3565b5b828203905092915050565b6000614e6b82614eaa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f01578082015181840152602081019050614ee6565b83811115614f10576000848401525b50505050565b60006002820490506001821680614f2e57607f821691505b60208210811415614f4257614f41615051565b5b50919050565b614f51826150af565b810181811067ffffffffffffffff82111715614f7057614f6f615080565b5b80604052505050565b6000614f8482614eca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fb757614fb6614ff3565b5b600182019050919050565b6000614fcd82614eca565b9150614fd883614eca565b925082614fe857614fe7615022565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f596f75206e65656420746f20736163726966696365206d6f7265000000000000600082015250565b7f596f7520646f206e6f74206f776e207468697320616e67656c00000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4174206c65617374206f6e65206561726c79206d696e7465642068617262696e60008201527f6765722072657175697265640000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f52697475616c2063616e6e6f7420626520706572666f726d656420726967687460008201527f206e6f7700000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f7520617265206e6f74207072657061726564000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4174206c6561737420332068617262696e676572732072657175697265640000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4974206973206e6f7420612073656372657420616e796d6f72652e2e2e000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4174206c6561737420322068617262696e676572732072657175697265640000600082015250565b7f416c6c20616e67656c7320617265206d696e7465640000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265736572766520776f756c6420657863656564206d617820737570706c792060008201527f6f6620746f6b656e730000000000000000000000000000000000000000000000602082015250565b6157f481614e60565b81146157ff57600080fd5b50565b61580b81614e72565b811461581657600080fd5b50565b61582281614e7e565b811461582d57600080fd5b50565b61583981614eca565b811461584457600080fd5b5056fea2646970667358221220bd7a7717bad8d3d6a271499fccc0648fa33183654066101868dc81cdb3db6caf64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102305760003560e01c80636352211e1161012e578063c1b070a4116100ab578063e6df22ee1161006f578063e6df22ee14610849578063e985e9c514610853578063edcf7e2e14610890578063f2fde38b146108b9578063f47c84c5146108e257610230565b8063c1b070a414610752578063c87b56dd1461077d578063cea23400146107ba578063d031370b146107e3578063dcf4840e1461080c57610230565b8063908d313d116100f2578063908d313d1461068157806395d89b41146106aa578063a22cb465146106d5578063a56d091b146106fe578063b88d4fde1461072957610230565b80636352211e1461059a5780636af98f51146105d757806370a0823114610602578063715018a61461063f5780638da5cb5b1461065657610230565b80632660bd16116101bc5780634775c4a5116101805780634775c4a5146104b75780634f6ccce7146104f457806355f804b3146105315780635625c97c1461055a57806359c74f291461058357610230565b80632660bd16146103e85780632f745c5914610411578063344f1ba51461044e5780633ccfd60b1461047757806342842e0e1461048e57610230565b806311e776fe1161020357806311e776fe14610303578063150b7a021461032c57806318160ddd146103695780631b8dca741461039457806323b872dd146103bf57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061418f565b61090d565b6040516102699190614837565b60405180910390f35b34801561027e57600080fd5b5061028761091f565b604051610294919061486d565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190614222565b6109b1565b6040516102d191906147d0565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061412a565b610a36565b005b34801561030f57600080fd5b5061032a60048036038101906103259190614222565b610b4e565b005b34801561033857600080fd5b50610353600480360381019061034e9190613ff3565b610bd4565b6040516103609190614852565b60405180910390f35b34801561037557600080fd5b5061037e610ccf565b60405161038b9190614c2f565b60405180910390f35b3480156103a057600080fd5b506103a9610cdc565b6040516103b69190614837565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190613fa4565b610cef565b005b3480156103f457600080fd5b5061040f600480360381019061040a919061424b565b610d4f565b005b34801561041d57600080fd5b506104386004803603810190610433919061412a565b611326565b6040516104459190614c2f565b60405180910390f35b34801561045a57600080fd5b5061047560048036038101906104709190614222565b6113cb565b005b34801561048357600080fd5b5061048c611451565b005b34801561049a57600080fd5b506104b560048036038101906104b09190613fa4565b61151c565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613f16565b61153c565b6040516104eb9190614c2f565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190614222565b611554565b6040516105289190614c2f565b60405180910390f35b34801561053d57600080fd5b50610558600480360381019061055391906141e1565b6115eb565b005b34801561056657600080fd5b50610581600480360381019061057c9190614222565b611681565b005b34801561058f57600080fd5b5061059861185d565b005b3480156105a657600080fd5b506105c160048036038101906105bc9190614222565b611905565b6040516105ce91906147d0565b60405180910390f35b3480156105e357600080fd5b506105ec6119b7565b6040516105f99190614837565b60405180910390f35b34801561060e57600080fd5b5061062960048036038101906106249190613f16565b6119ca565b6040516106369190614c2f565b60405180910390f35b34801561064b57600080fd5b50610654611a82565b005b34801561066257600080fd5b5061066b611b0a565b60405161067891906147d0565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a39190613f16565b611b34565b005b3480156106b657600080fd5b506106bf611bf4565b6040516106cc919061486d565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f791906140ee565b611c86565b005b34801561070a57600080fd5b50610713611e07565b60405161072091906147d0565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190614073565b611e2d565b005b34801561075e57600080fd5b50610767611e8f565b6040516107749190614c2f565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f9190614222565b611e95565b6040516107b1919061486d565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc91906141e1565b611f96565b005b3480156107ef57600080fd5b5061080a60048036038101906108059190614222565b61202c565b005b34801561081857600080fd5b50610833600480360381019061082e9190614222565b61214a565b6040516108409190614c2f565b60405180910390f35b610851612162565b005b34801561085f57600080fd5b5061087a60048036038101906108759190613f68565b612225565b6040516108879190614837565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b29190614287565b6122b9565b005b3480156108c557600080fd5b506108e060048036038101906108db9190613f16565b612916565b005b3480156108ee57600080fd5b506108f7612a0e565b6040516109049190614c2f565b60405180910390f35b600061091882612a14565b9050919050565b60606000805461092e90614f16565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90614f16565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b5050505050905090565b60006109bc82612a8e565b6109fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f290614acf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4182611905565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa990614b4f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad1612afa565b73ffffffffffffffffffffffffffffffffffffffff161480610b005750610aff81610afa612afa565b612225565b5b610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3690614a0f565b60405180910390fd5b610b498383612b02565b505050565b610b56612afa565b73ffffffffffffffffffffffffffffffffffffffff16610b74611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190614aef565b60405180910390fd5b80600c8190555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610cbc576001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c789190614d4b565b601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b63150b7a0260e01b905095945050505050565b6000600880549050905090565b600d60009054906101000a900460ff1681565b610d00610cfa612afa565b82612bbb565b610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690614b8f565b60405180910390fd5b610d4a838383612c99565b505050565b600d60009054906101000a900460ff16610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d95906149ef565b60405180910390fd5b600c546002610dab610ccf565b610db59190614d4b565b1115610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded90614bcf565b60405180910390fd5b61063482111580610e0957506106348111155b610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f9061494f565b60405180910390fd5b80821415610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290614baf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610efd9190614c2f565b60206040518083038186803b158015610f1557600080fd5b505afa158015610f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4d9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff1614801561104557503373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610fdd9190614c2f565b60206040518083038186803b158015610ff557600080fd5b505afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff16145b61104e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab6b736836040518263ffffffff1660e01b81526004016110a99190614c2f565b60206040518083038186803b1580156110c157600080fd5b505afa1580156110d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f99190614166565b80156111ac5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ab6b736826040518263ffffffff1660e01b815260040161115b9190614c2f565b60206040518083038186803b15801561117357600080fd5b505afa158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab9190614166565b5b6111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e290614baf565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2836040518263ffffffff1660e01b81526004016112469190614c2f565b600060405180830381600087803b15801561126057600080fd5b505af1158015611274573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2826040518263ffffffff1660e01b81526004016112d39190614c2f565b600060405180830381600087803b1580156112ed57600080fd5b505af1158015611301573d6000803e3d6000fd5b50505050611322336002611313610ccf565b61131d9190614d4b565b612ef5565b5050565b6000611331836119ca565b8210611372576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611369906148cf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6113d3612afa565b73ffffffffffffffffffffffffffffffffffffffff166113f1611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e90614aef565b60405180910390fd5b8060108190555050565b611459612afa565b73ffffffffffffffffffffffffffffffffffffffff16611477611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490614aef565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611518573d6000803e3d6000fd5b5050565b61153783838360405180602001604052806000815250611e2d565b505050565b60116020528060005260406000206000915090505481565b600061155e610ccf565b821061159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690614bef565b60405180910390fd5b600882815481106115d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6115f3612afa565b73ffffffffffffffffffffffffffffffffffffffff16611611611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e90614aef565b60405180910390fd5b80600e908051906020019061167d929190613cc6565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166116a182611905565b73ffffffffffffffffffffffffffffffffffffffff16146116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee906148af565b60405180910390fd5b6003601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561177a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117719061488f565b60405180910390fd5b6010546001601260008481526020019081526020016000205461179d9190614d4b565b11156117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590614a2f565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160126000838152602001908152602001600020546118439190614d4b565b601260008381526020019081526020016000208190555050565b611865612afa565b73ffffffffffffffffffffffffffffffffffffffff16611883611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d090614aef565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590614a6f565b60405180910390fd5b80915050919050565b600d60019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3290614a4f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a8a612afa565b73ffffffffffffffffffffffffffffffffffffffff16611aa8611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590614aef565b60405180910390fd5b611b086000612f13565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b3c612afa565b73ffffffffffffffffffffffffffffffffffffffff16611b5a611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614611bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba790614aef565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611c0390614f16565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2f90614f16565b8015611c7c5780601f10611c5157610100808354040283529160200191611c7c565b820191906000526020600020905b815481529060010190602001808311611c5f57829003601f168201915b5050505050905090565b611c8e612afa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf39061498f565b60405180910390fd5b8060056000611d09612afa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611db6612afa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dfb9190614837565b60405180910390a35050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e3e611e38612afa565b83612bbb565b611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490614b8f565b60405180910390fd5b611e8984848484612fd9565b50505050565b60105481565b6060611ea082612a8e565b611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690614b2f565b60405180910390fd5b6060600060126000858152602001908152602001600020541115611f3a576012600084815260200190815260200160002054600c54611f1e9190614dd2565b83611f299190614d4b565b9250611f33613035565b9050611f45565b611f426130c7565b90505b6000815111611f635760405180602001604052806000815250611f8e565b80611f6d84613159565b604051602001611f7e9291906147ac565b6040516020818303038152906040525b915050919050565b611f9e612afa565b73ffffffffffffffffffffffffffffffffffffffff16611fbc611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614612012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200990614aef565b60405180910390fd5b80600f9080519060200190612028929190613cc6565b5050565b612034612afa565b73ffffffffffffffffffffffffffffffffffffffff16612052611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614aef565b60405180910390fd5b60006120b2610ccf565b9050600c5482826120c39190614d4b565b1115612104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fb90614c0f565b60405180910390fd5b60006002826121139190614d4b565b90505b82826121229190614d4b565b8111612145576121323382612ef5565b808061213d90614f79565b915050612116565b505050565b60126020528060005260406000206000915090505481565b600d60019054906101000a900460ff16156121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a990614b6f565b60405180910390fd5b34670de0b6b3a764000011156121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f4906149af565b60405180910390fd5b612208336001612ef5565b6001600d60016101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff16612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff906149ef565b60405180910390fd5b600c546002612315610ccf565b61231f9190614d4b565b1115612360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235790614bcf565b60405180910390fd5b8183141580156123705750808214155b801561237c5750808314155b6123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290614a8f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b815260040161242d9190614c2f565b60206040518083038186803b15801561244557600080fd5b505afa158015612459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247d9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff1614801561257557503373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161250d9190614c2f565b60206040518083038186803b15801561252557600080fd5b505afa158015612539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255d9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff16145b801561265657503373ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016125ee9190614c2f565b60206040518083038186803b15801561260657600080fd5b505afa15801561261a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263e9190613f3f565b73ffffffffffffffffffffffffffffffffffffffff16145b61265f57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f8494758484846040518463ffffffff1660e01b81526004016126be93929190614c4a565b60206040518083038186803b1580156126d657600080fd5b505afa1580156126ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270e9190614166565b61274d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274490614a8f565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2846040518263ffffffff1660e01b81526004016127a89190614c2f565b600060405180830381600087803b1580156127c257600080fd5b505af11580156127d6573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2836040518263ffffffff1660e01b81526004016128359190614c2f565b600060405180830381600087803b15801561284f57600080fd5b505af1158015612863573d6000803e3d6000fd5b50505050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd5e75a2826040518263ffffffff1660e01b81526004016128c29190614c2f565b600060405180830381600087803b1580156128dc57600080fd5b505af11580156128f0573d6000803e3d6000fd5b50505050612911336002612902610ccf565b61290c9190614d4b565b612ef5565b505050565b61291e612afa565b73ffffffffffffffffffffffffffffffffffffffff1661293c611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614612992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298990614aef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f99061490f565b60405180910390fd5b612a0b81612f13565b50565b600c5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a875750612a8682613306565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b7583611905565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bc682612a8e565b612c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfc906149cf565b60405180910390fd5b6000612c1083611905565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c7f57508373ffffffffffffffffffffffffffffffffffffffff16612c67846109b1565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c905750612c8f8185612225565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cb982611905565b73ffffffffffffffffffffffffffffffffffffffff1614612d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0690614b0f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d769061496f565b60405180910390fd5b612d8a8383836133e8565b612d95600082612b02565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de59190614e2c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e3c9190614d4b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612f0f8282604051806020016040528060008152506133f8565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fe4848484612c99565b612ff084848484613453565b61302f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613026906148ef565b60405180910390fd5b50505050565b6060600f805461304490614f16565b80601f016020809104026020016040519081016040528092919081815260200182805461307090614f16565b80156130bd5780601f10613092576101008083540402835291602001916130bd565b820191906000526020600020905b8154815290600101906020018083116130a057829003601f168201915b5050505050905090565b6060600e80546130d690614f16565b80601f016020809104026020016040519081016040528092919081815260200182805461310290614f16565b801561314f5780601f106131245761010080835404028352916020019161314f565b820191906000526020600020905b81548152906001019060200180831161313257829003601f168201915b5050505050905090565b606060008214156131a1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613301565b600082905060005b600082146131d35780806131bc90614f79565b915050600a826131cc9190614da1565b91506131a9565b60008167ffffffffffffffff811115613215577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132475781602001600182028036833780820191505090505b5090505b600085146132fa576001826132609190614e2c565b9150600a8561326f9190614fc2565b603061327b9190614d4b565b60f81b8183815181106132b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132f39190614da1565b945061324b565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133d157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133e157506133e0826135ea565b5b9050919050565b6133f3838383613654565b505050565b6134028383613768565b61340f6000848484613453565b61344e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613445906148ef565b60405180910390fd5b505050565b60006134748473ffffffffffffffffffffffffffffffffffffffff16613936565b156135dd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261349d612afa565b8786866040518563ffffffff1660e01b81526004016134bf94939291906147eb565b602060405180830381600087803b1580156134d957600080fd5b505af192505050801561350a57506040513d601f19601f8201168201806040525081019061350791906141b8565b60015b61358d573d806000811461353a576040519150601f19603f3d011682016040523d82523d6000602084013e61353f565b606091505b50600081511415613585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357c906148ef565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135e2565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61365f838383613949565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156136a25761369d8161394e565b6136e1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146136e0576136df8382613997565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137245761371f81613b04565b613763565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613762576137618282613c47565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137cf90614aaf565b60405180910390fd5b6137e181612a8e565b15613821576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138189061492f565b60405180910390fd5b61382d600083836133e8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461387d9190614d4b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016139a4846119ca565b6139ae9190614e2c565b9050600060076000848152602001908152602001600020549050818114613a93576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b189190614e2c565b9050600060096000848152602001908152602001600020549050600060088381548110613b6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613bb6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613c2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613c52836119ca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613cd290614f16565b90600052602060002090601f016020900481019282613cf45760008555613d3b565b82601f10613d0d57805160ff1916838001178555613d3b565b82800160010185558215613d3b579182015b82811115613d3a578251825591602001919060010190613d1f565b5b509050613d489190613d4c565b5090565b5b80821115613d65576000816000905550600101613d4d565b5090565b6000613d7c613d7784614ca6565b614c81565b905082815260208101848484011115613d9457600080fd5b613d9f848285614ed4565b509392505050565b6000613dba613db584614cd7565b614c81565b905082815260208101848484011115613dd257600080fd5b613ddd848285614ed4565b509392505050565b600081359050613df4816157eb565b92915050565b600081519050613e09816157eb565b92915050565b600081359050613e1e81615802565b92915050565b600081519050613e3381615802565b92915050565b600081359050613e4881615819565b92915050565b600081519050613e5d81615819565b92915050565b60008083601f840112613e7557600080fd5b8235905067ffffffffffffffff811115613e8e57600080fd5b602083019150836001820283011115613ea657600080fd5b9250929050565b600082601f830112613ebe57600080fd5b8135613ece848260208601613d69565b91505092915050565b600082601f830112613ee857600080fd5b8135613ef8848260208601613da7565b91505092915050565b600081359050613f1081615830565b92915050565b600060208284031215613f2857600080fd5b6000613f3684828501613de5565b91505092915050565b600060208284031215613f5157600080fd5b6000613f5f84828501613dfa565b91505092915050565b60008060408385031215613f7b57600080fd5b6000613f8985828601613de5565b9250506020613f9a85828601613de5565b9150509250929050565b600080600060608486031215613fb957600080fd5b6000613fc786828701613de5565b9350506020613fd886828701613de5565b9250506040613fe986828701613f01565b9150509250925092565b60008060008060006080868803121561400b57600080fd5b600061401988828901613de5565b955050602061402a88828901613de5565b945050604061403b88828901613f01565b935050606086013567ffffffffffffffff81111561405857600080fd5b61406488828901613e63565b92509250509295509295909350565b6000806000806080858703121561408957600080fd5b600061409787828801613de5565b94505060206140a887828801613de5565b93505060406140b987828801613f01565b925050606085013567ffffffffffffffff8111156140d657600080fd5b6140e287828801613ead565b91505092959194509250565b6000806040838503121561410157600080fd5b600061410f85828601613de5565b925050602061412085828601613e0f565b9150509250929050565b6000806040838503121561413d57600080fd5b600061414b85828601613de5565b925050602061415c85828601613f01565b9150509250929050565b60006020828403121561417857600080fd5b600061418684828501613e24565b91505092915050565b6000602082840312156141a157600080fd5b60006141af84828501613e39565b91505092915050565b6000602082840312156141ca57600080fd5b60006141d884828501613e4e565b91505092915050565b6000602082840312156141f357600080fd5b600082013567ffffffffffffffff81111561420d57600080fd5b61421984828501613ed7565b91505092915050565b60006020828403121561423457600080fd5b600061424284828501613f01565b91505092915050565b6000806040838503121561425e57600080fd5b600061426c85828601613f01565b925050602061427d85828601613f01565b9150509250929050565b60008060006060848603121561429c57600080fd5b60006142aa86828701613f01565b93505060206142bb86828701613f01565b92505060406142cc86828701613f01565b9150509250925092565b6142df81614e60565b82525050565b6142ee81614e72565b82525050565b6142fd81614e7e565b82525050565b600061430e82614d08565b6143188185614d1e565b9350614328818560208601614ee3565b614331816150af565b840191505092915050565b600061434782614d13565b6143518185614d2f565b9350614361818560208601614ee3565b61436a816150af565b840191505092915050565b600061438082614d13565b61438a8185614d40565b935061439a818560208601614ee3565b80840191505092915050565b60006143b3601a83614d2f565b91506143be826150c0565b602082019050919050565b60006143d6601983614d2f565b91506143e1826150e9565b602082019050919050565b60006143f9602b83614d2f565b915061440482615112565b604082019050919050565b600061441c603283614d2f565b915061442782615161565b604082019050919050565b600061443f602683614d2f565b915061444a826151b0565b604082019050919050565b6000614462601c83614d2f565b915061446d826151ff565b602082019050919050565b6000614485602c83614d2f565b915061449082615228565b604082019050919050565b60006144a8602483614d2f565b91506144b382615277565b604082019050919050565b60006144cb601983614d2f565b91506144d6826152c6565b602082019050919050565b60006144ee601f83614d2f565b91506144f9826152ef565b602082019050919050565b6000614511602c83614d2f565b915061451c82615318565b604082019050919050565b6000614534602483614d2f565b915061453f82615367565b604082019050919050565b6000614557603883614d2f565b9150614562826153b6565b604082019050919050565b600061457a601483614d2f565b915061458582615405565b602082019050919050565b600061459d602a83614d2f565b91506145a88261542e565b604082019050919050565b60006145c0602983614d2f565b91506145cb8261547d565b604082019050919050565b60006145e3601e83614d2f565b91506145ee826154cc565b602082019050919050565b6000614606602083614d2f565b9150614611826154f5565b602082019050919050565b6000614629602c83614d2f565b91506146348261551e565b604082019050919050565b600061464c602083614d2f565b91506146578261556d565b602082019050919050565b600061466f602983614d2f565b915061467a82615596565b604082019050919050565b6000614692602f83614d2f565b915061469d826155e5565b604082019050919050565b60006146b5602183614d2f565b91506146c082615634565b604082019050919050565b60006146d8601d83614d2f565b91506146e382615683565b602082019050919050565b60006146fb603183614d2f565b9150614706826156ac565b604082019050919050565b600061471e601e83614d2f565b9150614729826156fb565b602082019050919050565b6000614741601583614d2f565b915061474c82615724565b602082019050919050565b6000614764602c83614d2f565b915061476f8261574d565b604082019050919050565b6000614787602983614d2f565b91506147928261579c565b604082019050919050565b6147a681614eca565b82525050565b60006147b88285614375565b91506147c48284614375565b91508190509392505050565b60006020820190506147e560008301846142d6565b92915050565b600060808201905061480060008301876142d6565b61480d60208301866142d6565b61481a604083018561479d565b818103606083015261482c8184614303565b905095945050505050565b600060208201905061484c60008301846142e5565b92915050565b600060208201905061486760008301846142f4565b92915050565b60006020820190508181036000830152614887818461433c565b905092915050565b600060208201905081810360008301526148a8816143a6565b9050919050565b600060208201905081810360008301526148c8816143c9565b9050919050565b600060208201905081810360008301526148e8816143ec565b9050919050565b600060208201905081810360008301526149088161440f565b9050919050565b6000602082019050818103600083015261492881614432565b9050919050565b6000602082019050818103600083015261494881614455565b9050919050565b6000602082019050818103600083015261496881614478565b9050919050565b600060208201905081810360008301526149888161449b565b9050919050565b600060208201905081810360008301526149a8816144be565b9050919050565b600060208201905081810360008301526149c8816144e1565b9050919050565b600060208201905081810360008301526149e881614504565b9050919050565b60006020820190508181036000830152614a0881614527565b9050919050565b60006020820190508181036000830152614a288161454a565b9050919050565b60006020820190508181036000830152614a488161456d565b9050919050565b60006020820190508181036000830152614a6881614590565b9050919050565b60006020820190508181036000830152614a88816145b3565b9050919050565b60006020820190508181036000830152614aa8816145d6565b9050919050565b60006020820190508181036000830152614ac8816145f9565b9050919050565b60006020820190508181036000830152614ae88161461c565b9050919050565b60006020820190508181036000830152614b088161463f565b9050919050565b60006020820190508181036000830152614b2881614662565b9050919050565b60006020820190508181036000830152614b4881614685565b9050919050565b60006020820190508181036000830152614b68816146a8565b9050919050565b60006020820190508181036000830152614b88816146cb565b9050919050565b60006020820190508181036000830152614ba8816146ee565b9050919050565b60006020820190508181036000830152614bc881614711565b9050919050565b60006020820190508181036000830152614be881614734565b9050919050565b60006020820190508181036000830152614c0881614757565b9050919050565b60006020820190508181036000830152614c288161477a565b9050919050565b6000602082019050614c44600083018461479d565b92915050565b6000606082019050614c5f600083018661479d565b614c6c602083018561479d565b614c79604083018461479d565b949350505050565b6000614c8b614c9c565b9050614c978282614f48565b919050565b6000604051905090565b600067ffffffffffffffff821115614cc157614cc0615080565b5b614cca826150af565b9050602081019050919050565b600067ffffffffffffffff821115614cf257614cf1615080565b5b614cfb826150af565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d5682614eca565b9150614d6183614eca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d9657614d95614ff3565b5b828201905092915050565b6000614dac82614eca565b9150614db783614eca565b925082614dc757614dc6615022565b5b828204905092915050565b6000614ddd82614eca565b9150614de883614eca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e2157614e20614ff3565b5b828202905092915050565b6000614e3782614eca565b9150614e4283614eca565b925082821015614e5557614e54614ff3565b5b828203905092915050565b6000614e6b82614eaa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f01578082015181840152602081019050614ee6565b83811115614f10576000848401525b50505050565b60006002820490506001821680614f2e57607f821691505b60208210811415614f4257614f41615051565b5b50919050565b614f51826150af565b810181811067ffffffffffffffff82111715614f7057614f6f615080565b5b80604052505050565b6000614f8482614eca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fb757614fb6614ff3565b5b600182019050919050565b6000614fcd82614eca565b9150614fd883614eca565b925082614fe857614fe7615022565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f596f75206e65656420746f20736163726966696365206d6f7265000000000000600082015250565b7f596f7520646f206e6f74206f776e207468697320616e67656c00000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4174206c65617374206f6e65206561726c79206d696e7465642068617262696e60008201527f6765722072657175697265640000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f52697475616c2063616e6e6f7420626520706572666f726d656420726967687460008201527f206e6f7700000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f7520617265206e6f74207072657061726564000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4174206c6561737420332068617262696e676572732072657175697265640000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4974206973206e6f7420612073656372657420616e796d6f72652e2e2e000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4174206c6561737420322068617262696e676572732072657175697265640000600082015250565b7f416c6c20616e67656c7320617265206d696e7465640000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265736572766520776f756c6420657863656564206d617820737570706c792060008201527f6f6620746f6b656e730000000000000000000000000000000000000000000000602082015250565b6157f481614e60565b81146157ff57600080fd5b50565b61580b81614e72565b811461581657600080fd5b50565b61582281614e7e565b811461582d57600080fd5b50565b61583981614eca565b811461584457600080fd5b5056fea2646970667358221220bd7a7717bad8d3d6a271499fccc0648fa33183654066101868dc81cdb3db6caf64736f6c63430008040033

Deployed Bytecode Sourcemap

48289:5894:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49347:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21590:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23149:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22672:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49786:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48869:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37607:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48490:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24039:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52285:935;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37275:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49887:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51135:140;;;;;;;;;;;;;:::i;:::-;;24449:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48678:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37797:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49538:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53232:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51040:83;;;;;;;;;;;;;:::i;:::-;;21284:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48526:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21014:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34417:94;;;;;;;;;;;;;:::i;:::-;;33766:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50249:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21759:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23442:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48418:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24705:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48639:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53646:534;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49659:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50645:383;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48739:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50357:276;;;:::i;:::-;;23808:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51287:986;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34666:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48452:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49347:179;49458:4;49482:36;49506:11;49482:23;:36::i;:::-;49475:43;;49347:179;;;:::o;21590:100::-;21644:13;21677:5;21670:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21590:100;:::o;23149:221::-;23225:7;23253:16;23261:7;23253;:16::i;:::-;23245:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23338:15;:24;23354:7;23338:24;;;;;;;;;;;;;;;;;;;;;23331:31;;23149:221;;;:::o;22672:411::-;22753:13;22769:23;22784:7;22769:14;:23::i;:::-;22753:39;;22817:5;22811:11;;:2;:11;;;;22803:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22911:5;22895:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22920:37;22937:5;22944:12;:10;:12::i;:::-;22920:16;:37::i;:::-;22895:62;22873:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23054:21;23063:2;23067:7;23054:8;:21::i;:::-;22672:411;;;:::o;49786:89::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49863:4:::1;49850:10;:17;;;;49786:89:::0;:::o;48869:281::-;48980:6;49017:12;;;;;;;;;;;49003:26;;:10;:26;;;48999:116;;;49102:1;49074:18;:25;49093:5;49074:25;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;49046:18;:25;49065:5;49046:25;;;;;;;;;;;;;;;:57;;;;48999:116;49132:10;49125:17;;;;48869:281;;;;;;;:::o;37607:113::-;37668:7;37695:10;:17;;;;37688:24;;37607:113;:::o;48490:29::-;;;;;;;;;;;;;:::o;24039:339::-;24234:41;24253:12;:10;:12::i;:::-;24267:7;24234:18;:41::i;:::-;24226:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24342:28;24352:4;24358:2;24362:7;24342:9;:28::i;:::-;24039:339;;;:::o;52285:935::-;52363:9;;;;;;;;;;;52355:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52453:10;;52448:1;52432:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;52424:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52520:4;52508:8;:16;;:36;;;;52540:4;52528:8;:16;;52508:36;52500:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;52624:8;52612;:20;;52604:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52743:10;52686:67;;52708:12;;;;;;;;;;;52686:43;;;52730:8;52686:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;:138;;;;;52814:10;52757:67;;52779:12;;;;;;;;;;;52757:43;;;52801:8;52757:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;52686:138;52678:147;;;;;;52866:12;;;;;;;;;;;52844:55;;;52900:8;52844:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:134;;;;;52935:12;;;;;;;;;;;52913:55;;;52969:8;52913:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52844:134;52836:177;;;;;;;;;;;;:::i;:::-;;;;;;;;;53046:12;;;;;;;;;;;53024:53;;;53078:8;53024:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53120:12;;;;;;;;;;;53098:53;;;53152:8;53098:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53172:40;53182:10;53210:1;53194:13;:11;:13::i;:::-;:17;;;;:::i;:::-;53172:9;:40::i;:::-;52285:935;;:::o;37275:256::-;37372:7;37408:23;37425:5;37408:16;:23::i;:::-;37400:5;:31;37392:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37497:12;:19;37510:5;37497:19;;;;;;;;;;;;;;;:26;37517:5;37497:26;;;;;;;;;;;;37490:33;;37275:256;;;;:::o;49887:95::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49968:6:::1;49952:13;:22;;;;49887:95:::0;:::o;51135:140::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51183:12:::1;51198:21;51183:36;;51238:10;51230:28;;:37;51259:7;51230:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;34057:1;51135:140::o:0;24449:185::-;24587:39;24604:4;24610:2;24614:7;24587:39;;;;;;;;;;;;:16;:39::i;:::-;24449:185;;;:::o;48678:54::-;;;;;;;;;;;;;;;;;:::o;37797:233::-;37872:7;37908:30;:28;:30::i;:::-;37900:5;:38;37892:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38005:10;38016:5;38005:17;;;;;;;;;;;;;;;;;;;;;;;;37998:24;;37797:233;;;:::o;49538:109::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49631:8:::1;49612:16;:27;;;;;;;;;;;;:::i;:::-;;49538:109:::0;:::o;53232:406::-;53317:10;53297:30;;:16;53305:7;53297;:16::i;:::-;:30;;;53289:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53410:1;53376:18;:30;53395:10;53376:30;;;;;;;;;;;;;;;;:35;;53368:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53489:13;;53484:1;53461:11;:20;53473:7;53461:20;;;;;;;;;;;;:24;;;;:::i;:::-;:41;;53453:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53571:1;53538:18;:30;53557:10;53538:30;;;;;;;;;;;;;;;:34;;;;53629:1;53606:11;:20;53618:7;53606:20;;;;;;;;;;;;:24;;;;:::i;:::-;53583:11;:20;53595:7;53583:20;;;;;;;;;;;:47;;;;53232:406;:::o;51040:83::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51106:9:::1;;;;;;;;;;;51105:10;51093:9;;:22;;;;;;;;;;;;;;;;;;51040:83::o:0;21284:239::-;21356:7;21376:13;21392:7;:16;21400:7;21392:16;;;;;;;;;;;;;;;;;;;;;21376:32;;21444:1;21427:19;;:5;:19;;;;21419:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21510:5;21503:12;;;21284:239;;;:::o;48526:31::-;;;;;;;;;;;;;:::o;21014:208::-;21086:7;21131:1;21114:19;;:5;:19;;;;21106:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21198:9;:16;21208:5;21198:16;;;;;;;;;;;;;;;;21191:23;;21014:208;;;:::o;34417:94::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34482:21:::1;34500:1;34482:9;:21::i;:::-;34417:94::o:0;33766:87::-;33812:7;33839:6;;;;;;;;;;;33832:13;;33766:87;:::o;50249:96::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50329:8:::1;50314:12;;:23;;;;;;;;;;;;;;;;;;50249:96:::0;:::o;21759:104::-;21815:13;21848:7;21841:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21759:104;:::o;23442:295::-;23557:12;:10;:12::i;:::-;23545:24;;:8;:24;;;;23537:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23657:8;23612:18;:32;23631:12;:10;:12::i;:::-;23612:32;;;;;;;;;;;;;;;:42;23645:8;23612:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23710:8;23681:48;;23696:12;:10;:12::i;:::-;23681:48;;;23720:8;23681:48;;;;;;:::i;:::-;;;;;;;;23442:295;;:::o;48418:27::-;;;;;;;;;;;;;:::o;24705:328::-;24880:41;24899:12;:10;:12::i;:::-;24913:7;24880:18;:41::i;:::-;24872:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24986:39;25000:4;25006:2;25010:7;25019:5;24986:13;:39::i;:::-;24705:328;;;;:::o;48639:32::-;;;;:::o;53646:534::-;53719:13;53753:16;53761:7;53753;:16::i;:::-;53745:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53832:21;53891:1;53868:11;:20;53880:7;53868:20;;;;;;;;;;;;:24;53864:205;;;53942:11;:20;53954:7;53942:20;;;;;;;;;;;;53929:10;;:33;;;;:::i;:::-;53919:7;:43;;;;:::i;:::-;53909:53;;53987:17;:15;:17::i;:::-;53977:27;;53864:205;;;54047:10;:8;:10::i;:::-;54037:20;;53864:205;54110:1;54092:7;54086:21;:25;:86;;;;;;;;;;;;;;;;;54138:7;54147:18;:7;:16;:18::i;:::-;54121:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54086:86;54079:93;;;53646:534;;;:::o;49659:115::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49758:8:::1;49740:15;:26;;;;;;;;;;;;:::i;:::-;;49659:115:::0;:::o;50645:383::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50717:11:::1;50731:13;:11;:13::i;:::-;50717:27;;50790:10;;50772:14;50763:6;:23;;;;:::i;:::-;:37;;50755:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;50857:14;50908:1;50899:6;:10;;;;:::i;:::-;50887:22;;50882:139;50933:14;50924:6;:23;;;;:::i;:::-;50911:9;:36;50882:139;;50977:32;50987:10;50999:9;50977;:32::i;:::-;50949:11;;;;;:::i;:::-;;;;50882:139;;;34057:1;;50645:383:::0;:::o;48739:47::-;;;;;;;;;;;;;;;;;:::o;50357:276::-;50418:11;;;;;;;;;;;50417:12;50409:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;50505:9;50482:19;:32;;50474:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;50572:24;50582:10;50594:1;50572:9;:24::i;:::-;50621:4;50607:11;;:18;;;;;;;;;;;;;;;;;;50357:276::o;23808:164::-;23905:4;23929:18;:25;23948:5;23929:25;;;;;;;;;;;;;;;:35;23955:8;23929:35;;;;;;;;;;;;;;;;;;;;;;;;;23922:42;;23808:164;;;;:::o;51287:986::-;51383:9;;;;;;;;;;;51375:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51473:10;;51468:1;51452:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;51444:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51540:8;51528;:20;;:44;;;;;51564:8;51552;:20;;51528:44;:68;;;;;51588:8;51576;:20;;51528:68;51520:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;51707:10;51650:67;;51672:12;;;;;;;;;;;51650:43;;;51694:8;51650:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;:138;;;;;51778:10;51721:67;;51743:12;;;;;;;;;;;51721:43;;;51765:8;51721:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;51650:138;:209;;;;;51849:10;51792:67;;51814:12;;;;;;;;;;;51792:43;;;51836:8;51792:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;51650:209;51642:218;;;;;;51901:12;;;;;;;;;;;51879:47;;;51927:8;51937;51947;51879:77;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51871:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;52024:12;;;;;;;;;;;52002:53;;;52056:8;52002:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52098:12;;;;;;;;;;;52076:53;;;52130:8;52076:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52172:12;;;;;;;;;;;52150:53;;;52204:8;52150:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52225:40;52235:10;52263:1;52247:13;:11;:13::i;:::-;:17;;;;:::i;:::-;52225:9;:40::i;:::-;51287:986;;;:::o;34666:192::-;33997:12;:10;:12::i;:::-;33986:23;;:7;:5;:7::i;:::-;:23;;;33978:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34775:1:::1;34755:22;;:8;:22;;;;34747:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34831:19;34841:8;34831:9;:19::i;:::-;34666:192:::0;:::o;48452:31::-;;;;:::o;36967:224::-;37069:4;37108:35;37093:50;;;:11;:50;;;;:90;;;;37147:36;37171:11;37147:23;:36::i;:::-;37093:90;37086:97;;36967:224;;;:::o;26543:127::-;26608:4;26660:1;26632:30;;:7;:16;26640:7;26632:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26625:37;;26543:127;;;:::o;16067:98::-;16120:7;16147:10;16140:17;;16067:98;:::o;30525:174::-;30627:2;30600:15;:24;30616:7;30600:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30683:7;30679:2;30645:46;;30654:23;30669:7;30654:14;:23::i;:::-;30645:46;;;;;;;;;;;;30525:174;;:::o;26837:348::-;26930:4;26955:16;26963:7;26955;:16::i;:::-;26947:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27031:13;27047:23;27062:7;27047:14;:23::i;:::-;27031:39;;27100:5;27089:16;;:7;:16;;;:51;;;;27133:7;27109:31;;:20;27121:7;27109:11;:20::i;:::-;:31;;;27089:51;:87;;;;27144:32;27161:5;27168:7;27144:16;:32::i;:::-;27089:87;27081:96;;;26837:348;;;;:::o;29829:578::-;29988:4;29961:31;;:23;29976:7;29961:14;:23::i;:::-;:31;;;29953:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30071:1;30057:16;;:2;:16;;;;30049:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30127:39;30148:4;30154:2;30158:7;30127:20;:39::i;:::-;30231:29;30248:1;30252:7;30231:8;:29::i;:::-;30292:1;30273:9;:15;30283:4;30273:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30321:1;30304:9;:13;30314:2;30304:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30352:2;30333:7;:16;30341:7;30333:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30391:7;30387:2;30372:27;;30381:4;30372:27;;;;;;;;;;;;29829:578;;;:::o;27527:110::-;27603:26;27613:2;27617:7;27603:26;;;;;;;;;;;;:9;:26::i;:::-;27527:110;;:::o;34866:173::-;34922:16;34941:6;;;;;;;;;;;34922:25;;34967:8;34958:6;;:17;;;;;;;;;;;;;;;;;;35022:8;34991:40;;35012:8;34991:40;;;;;;;;;;;;34866:173;;:::o;25915:315::-;26072:28;26082:4;26088:2;26092:7;26072:9;:28::i;:::-;26119:48;26142:4;26148:2;26152:7;26161:5;26119:22;:48::i;:::-;26111:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25915:315;;;;:::o;50123:114::-;50181:13;50214:15;50207:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50123:114;:::o;49994:117::-;50054:13;50087:16;50080:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49994:117;:::o;16592:723::-;16648:13;16878:1;16869:5;:10;16865:53;;;16896:10;;;;;;;;;;;;;;;;;;;;;16865:53;16928:12;16943:5;16928:20;;16959:14;16984:78;16999:1;16991:4;:9;16984:78;;17017:8;;;;;:::i;:::-;;;;17048:2;17040:10;;;;;:::i;:::-;;;16984:78;;;17072:19;17104:6;17094:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17072:39;;17122:154;17138:1;17129:5;:10;17122:154;;17166:1;17156:11;;;;;:::i;:::-;;;17233:2;17225:5;:10;;;;:::i;:::-;17212:2;:24;;;;:::i;:::-;17199:39;;17182:6;17189;17182:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17262:2;17253:11;;;;;:::i;:::-;;;17122:154;;;17300:6;17286:21;;;;;16592:723;;;;:::o;20645:305::-;20747:4;20799:25;20784:40;;;:11;:40;;;;:105;;;;20856:33;20841:48;;;:11;:48;;;;20784:105;:158;;;;20906:36;20930:11;20906:23;:36::i;:::-;20784:158;20764:178;;20645:305;;;:::o;49158:181::-;49286:45;49313:4;49319:2;49323:7;49286:26;:45::i;:::-;49158:181;;;:::o;27864:321::-;27994:18;28000:2;28004:7;27994:5;:18::i;:::-;28045:54;28076:1;28080:2;28084:7;28093:5;28045:22;:54::i;:::-;28023:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27864:321;;;:::o;31264:799::-;31419:4;31440:15;:2;:13;;;:15::i;:::-;31436:620;;;31492:2;31476:36;;;31513:12;:10;:12::i;:::-;31527:4;31533:7;31542:5;31476:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31472:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31735:1;31718:6;:13;:18;31714:272;;;31761:60;;;;;;;;;;:::i;:::-;;;;;;;;31714:272;31936:6;31930:13;31921:6;31917:2;31913:15;31906:38;31472:529;31609:41;;;31599:51;;;:6;:51;;;;31592:58;;;;;31436:620;32040:4;32033:11;;31264:799;;;;;;;:::o;19149:157::-;19234:4;19273:25;19258:40;;;:11;:40;;;;19251:47;;19149:157;;;:::o;38643:589::-;38787:45;38814:4;38820:2;38824:7;38787:26;:45::i;:::-;38865:1;38849:18;;:4;:18;;;38845:187;;;38884:40;38916:7;38884:31;:40::i;:::-;38845:187;;;38954:2;38946:10;;:4;:10;;;38942:90;;38973:47;39006:4;39012:7;38973:32;:47::i;:::-;38942:90;38845:187;39060:1;39046:16;;:2;:16;;;39042:183;;;39079:45;39116:7;39079:36;:45::i;:::-;39042:183;;;39152:4;39146:10;;:2;:10;;;39142:83;;39173:40;39201:2;39205:7;39173:27;:40::i;:::-;39142:83;39042:183;38643:589;;;:::o;28521:382::-;28615:1;28601:16;;:2;:16;;;;28593:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28674:16;28682:7;28674;:16::i;:::-;28673:17;28665:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28736:45;28765:1;28769:2;28773:7;28736:20;:45::i;:::-;28811:1;28794:9;:13;28804:2;28794:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28842:2;28823:7;:16;28831:7;28823:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28887:7;28883:2;28862:33;;28879:1;28862:33;;;;;;;;;;;;28521:382;;:::o;8111:387::-;8171:4;8379:12;8446:7;8434:20;8426:28;;8489:1;8482:4;:8;8475:15;;;8111:387;;;:::o;32635:126::-;;;;:::o;39955:164::-;40059:10;:17;;;;40032:15;:24;40048:7;40032:24;;;;;;;;;;;:44;;;;40087:10;40103:7;40087:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39955:164;:::o;40746:988::-;41012:22;41062:1;41037:22;41054:4;41037:16;:22::i;:::-;:26;;;;:::i;:::-;41012:51;;41074:18;41095:17;:26;41113:7;41095:26;;;;;;;;;;;;41074:47;;41242:14;41228:10;:28;41224:328;;41273:19;41295:12;:18;41308:4;41295:18;;;;;;;;;;;;;;;:34;41314:14;41295:34;;;;;;;;;;;;41273:56;;41379:11;41346:12;:18;41359:4;41346:18;;;;;;;;;;;;;;;:30;41365:10;41346:30;;;;;;;;;;;:44;;;;41496:10;41463:17;:30;41481:11;41463:30;;;;;;;;;;;:43;;;;41224:328;;41648:17;:26;41666:7;41648:26;;;;;;;;;;;41641:33;;;41692:12;:18;41705:4;41692:18;;;;;;;;;;;;;;;:34;41711:14;41692:34;;;;;;;;;;;41685:41;;;40746:988;;;;:::o;42029:1079::-;42282:22;42327:1;42307:10;:17;;;;:21;;;;:::i;:::-;42282:46;;42339:18;42360:15;:24;42376:7;42360:24;;;;;;;;;;;;42339:45;;42711:19;42733:10;42744:14;42733:26;;;;;;;;;;;;;;;;;;;;;;;;42711:48;;42797:11;42772:10;42783;42772:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42908:10;42877:15;:28;42893:11;42877:28;;;;;;;;;;;:41;;;;43049:15;:24;43065:7;43049:24;;;;;;;;;;;43042:31;;;43084:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42029:1079;;;;:::o;39533:221::-;39618:14;39635:20;39652:2;39635:16;:20::i;:::-;39618:37;;39693:7;39666:12;:16;39679:2;39666:16;;;;;;;;;;;;;;;:24;39683:6;39666:24;;;;;;;;;;;:34;;;;39740:6;39711:17;:26;39729:7;39711:26;;;;;;;;;;;:35;;;;39533:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:143::-;909:5;940:6;934:13;925:22;;956:33;983:5;956:33;:::i;:::-;915:80;;;;:::o;1001:133::-;1044:5;1082:6;1069:20;1060:29;;1098:30;1122:5;1098:30;:::i;:::-;1050:84;;;;:::o;1140:137::-;1194:5;1225:6;1219:13;1210:22;;1241:30;1265:5;1241:30;:::i;:::-;1200:77;;;;:::o;1283:137::-;1328:5;1366:6;1353:20;1344:29;;1382:32;1408:5;1382:32;:::i;:::-;1334:86;;;;:::o;1426:141::-;1482:5;1513:6;1507:13;1498:22;;1529:32;1555:5;1529:32;:::i;:::-;1488:79;;;;:::o;1586:351::-;1643:8;1653:6;1703:3;1696:4;1688:6;1684:17;1680:27;1670:2;;1721:1;1718;1711:12;1670:2;1757:6;1744:20;1734:30;;1787:18;1779:6;1776:30;1773:2;;;1819:1;1816;1809:12;1773:2;1856:4;1848:6;1844:17;1832:29;;1910:3;1902:4;1894:6;1890:17;1880:8;1876:32;1873:41;1870:2;;;1927:1;1924;1917:12;1870:2;1660:277;;;;;:::o;1956:271::-;2011:5;2060:3;2053:4;2045:6;2041:17;2037:27;2027:2;;2078:1;2075;2068:12;2027:2;2118:6;2105:20;2143:78;2217:3;2209:6;2202:4;2194:6;2190:17;2143:78;:::i;:::-;2134:87;;2017:210;;;;;:::o;2247:273::-;2303:5;2352:3;2345:4;2337:6;2333:17;2329:27;2319:2;;2370:1;2367;2360:12;2319:2;2410:6;2397:20;2435:79;2510:3;2502:6;2495:4;2487:6;2483:17;2435:79;:::i;:::-;2426:88;;2309:211;;;;;:::o;2526:139::-;2572:5;2610:6;2597:20;2588:29;;2626:33;2653:5;2626:33;:::i;:::-;2578:87;;;;:::o;2671:262::-;2730:6;2779:2;2767:9;2758:7;2754:23;2750:32;2747:2;;;2795:1;2792;2785:12;2747:2;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2737:196;;;;:::o;2939:284::-;3009:6;3058:2;3046:9;3037:7;3033:23;3029:32;3026:2;;;3074:1;3071;3064:12;3026:2;3117:1;3142:64;3198:7;3189:6;3178:9;3174:22;3142:64;:::i;:::-;3132:74;;3088:128;3016:207;;;;:::o;3229:407::-;3297:6;3305;3354:2;3342:9;3333:7;3329:23;3325:32;3322:2;;;3370:1;3367;3360:12;3322:2;3413:1;3438:53;3483:7;3474:6;3463:9;3459:22;3438:53;:::i;:::-;3428:63;;3384:117;3540:2;3566:53;3611:7;3602:6;3591:9;3587:22;3566:53;:::i;:::-;3556:63;;3511:118;3312:324;;;;;:::o;3642:552::-;3719:6;3727;3735;3784:2;3772:9;3763:7;3759:23;3755:32;3752:2;;;3800:1;3797;3790:12;3752:2;3843:1;3868:53;3913:7;3904:6;3893:9;3889:22;3868:53;:::i;:::-;3858:63;;3814:117;3970:2;3996:53;4041:7;4032:6;4021:9;4017:22;3996:53;:::i;:::-;3986:63;;3941:118;4098:2;4124:53;4169:7;4160:6;4149:9;4145:22;4124:53;:::i;:::-;4114:63;;4069:118;3742:452;;;;;:::o;4200:829::-;4297:6;4305;4313;4321;4329;4378:3;4366:9;4357:7;4353:23;4349:33;4346:2;;;4395:1;4392;4385:12;4346:2;4438:1;4463:53;4508:7;4499:6;4488:9;4484:22;4463:53;:::i;:::-;4453:63;;4409:117;4565:2;4591:53;4636:7;4627:6;4616:9;4612:22;4591:53;:::i;:::-;4581:63;;4536:118;4693:2;4719:53;4764:7;4755:6;4744:9;4740:22;4719:53;:::i;:::-;4709:63;;4664:118;4849:2;4838:9;4834:18;4821:32;4880:18;4872:6;4869:30;4866:2;;;4912:1;4909;4902:12;4866:2;4948:64;5004:7;4995:6;4984:9;4980:22;4948:64;:::i;:::-;4930:82;;;;4792:230;4336:693;;;;;;;;:::o;5035:809::-;5130:6;5138;5146;5154;5203:3;5191:9;5182:7;5178:23;5174:33;5171:2;;;5220:1;5217;5210:12;5171:2;5263:1;5288:53;5333:7;5324:6;5313:9;5309:22;5288:53;:::i;:::-;5278:63;;5234:117;5390:2;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5361:118;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5674:2;5663:9;5659:18;5646:32;5705:18;5697:6;5694:30;5691:2;;;5737:1;5734;5727:12;5691:2;5765:62;5819:7;5810:6;5799:9;5795:22;5765:62;:::i;:::-;5755:72;;5617:220;5161:683;;;;;;;:::o;5850:401::-;5915:6;5923;5972:2;5960:9;5951:7;5947:23;5943:32;5940:2;;;5988:1;5985;5978:12;5940:2;6031:1;6056:53;6101:7;6092:6;6081:9;6077:22;6056:53;:::i;:::-;6046:63;;6002:117;6158:2;6184:50;6226:7;6217:6;6206:9;6202:22;6184:50;:::i;:::-;6174:60;;6129:115;5930:321;;;;;:::o;6257:407::-;6325:6;6333;6382:2;6370:9;6361:7;6357:23;6353:32;6350:2;;;6398:1;6395;6388:12;6350:2;6441:1;6466:53;6511:7;6502:6;6491:9;6487:22;6466:53;:::i;:::-;6456:63;;6412:117;6568:2;6594:53;6639:7;6630:6;6619:9;6615:22;6594:53;:::i;:::-;6584:63;;6539:118;6340:324;;;;;:::o;6670:278::-;6737:6;6786:2;6774:9;6765:7;6761:23;6757:32;6754:2;;;6802:1;6799;6792:12;6754:2;6845:1;6870:61;6923:7;6914:6;6903:9;6899:22;6870:61;:::i;:::-;6860:71;;6816:125;6744:204;;;;:::o;6954:260::-;7012:6;7061:2;7049:9;7040:7;7036:23;7032:32;7029:2;;;7077:1;7074;7067:12;7029:2;7120:1;7145:52;7189:7;7180:6;7169:9;7165:22;7145:52;:::i;:::-;7135:62;;7091:116;7019:195;;;;:::o;7220:282::-;7289:6;7338:2;7326:9;7317:7;7313:23;7309:32;7306:2;;;7354:1;7351;7344:12;7306:2;7397:1;7422:63;7477:7;7468:6;7457:9;7453:22;7422:63;:::i;:::-;7412:73;;7368:127;7296:206;;;;:::o;7508:375::-;7577:6;7626:2;7614:9;7605:7;7601:23;7597:32;7594:2;;;7642:1;7639;7632:12;7594:2;7713:1;7702:9;7698:17;7685:31;7743:18;7735:6;7732:30;7729:2;;;7775:1;7772;7765:12;7729:2;7803:63;7858:7;7849:6;7838:9;7834:22;7803:63;:::i;:::-;7793:73;;7656:220;7584:299;;;;:::o;7889:262::-;7948:6;7997:2;7985:9;7976:7;7972:23;7968:32;7965:2;;;8013:1;8010;8003:12;7965:2;8056:1;8081:53;8126:7;8117:6;8106:9;8102:22;8081:53;:::i;:::-;8071:63;;8027:117;7955:196;;;;:::o;8157:407::-;8225:6;8233;8282:2;8270:9;8261:7;8257:23;8253:32;8250:2;;;8298:1;8295;8288:12;8250:2;8341:1;8366:53;8411:7;8402:6;8391:9;8387:22;8366:53;:::i;:::-;8356:63;;8312:117;8468:2;8494:53;8539:7;8530:6;8519:9;8515:22;8494:53;:::i;:::-;8484:63;;8439:118;8240:324;;;;;:::o;8570:552::-;8647:6;8655;8663;8712:2;8700:9;8691:7;8687:23;8683:32;8680:2;;;8728:1;8725;8718:12;8680:2;8771:1;8796:53;8841:7;8832:6;8821:9;8817:22;8796:53;:::i;:::-;8786:63;;8742:117;8898:2;8924:53;8969:7;8960:6;8949:9;8945:22;8924:53;:::i;:::-;8914:63;;8869:118;9026:2;9052:53;9097:7;9088:6;9077:9;9073:22;9052:53;:::i;:::-;9042:63;;8997:118;8670:452;;;;;:::o;9128:118::-;9215:24;9233:5;9215:24;:::i;:::-;9210:3;9203:37;9193:53;;:::o;9252:109::-;9333:21;9348:5;9333:21;:::i;:::-;9328:3;9321:34;9311:50;;:::o;9367:115::-;9452:23;9469:5;9452:23;:::i;:::-;9447:3;9440:36;9430:52;;:::o;9488:360::-;9574:3;9602:38;9634:5;9602:38;:::i;:::-;9656:70;9719:6;9714:3;9656:70;:::i;:::-;9649:77;;9735:52;9780:6;9775:3;9768:4;9761:5;9757:16;9735:52;:::i;:::-;9812:29;9834:6;9812:29;:::i;:::-;9807:3;9803:39;9796:46;;9578:270;;;;;:::o;9854:364::-;9942:3;9970:39;10003:5;9970:39;:::i;:::-;10025:71;10089:6;10084:3;10025:71;:::i;:::-;10018:78;;10105:52;10150:6;10145:3;10138:4;10131:5;10127:16;10105:52;:::i;:::-;10182:29;10204:6;10182:29;:::i;:::-;10177:3;10173:39;10166:46;;9946:272;;;;;:::o;10224:377::-;10330:3;10358:39;10391:5;10358:39;:::i;:::-;10413:89;10495:6;10490:3;10413:89;:::i;:::-;10406:96;;10511:52;10556:6;10551:3;10544:4;10537:5;10533:16;10511:52;:::i;:::-;10588:6;10583:3;10579:16;10572:23;;10334:267;;;;;:::o;10607:366::-;10749:3;10770:67;10834:2;10829:3;10770:67;:::i;:::-;10763:74;;10846:93;10935:3;10846:93;:::i;:::-;10964:2;10959:3;10955:12;10948:19;;10753:220;;;:::o;10979:366::-;11121:3;11142:67;11206:2;11201:3;11142:67;:::i;:::-;11135:74;;11218:93;11307:3;11218:93;:::i;:::-;11336:2;11331:3;11327:12;11320:19;;11125:220;;;:::o;11351:366::-;11493:3;11514:67;11578:2;11573:3;11514:67;:::i;:::-;11507:74;;11590:93;11679:3;11590:93;:::i;:::-;11708:2;11703:3;11699:12;11692:19;;11497:220;;;:::o;11723:366::-;11865:3;11886:67;11950:2;11945:3;11886:67;:::i;:::-;11879:74;;11962:93;12051:3;11962:93;:::i;:::-;12080:2;12075:3;12071:12;12064:19;;11869:220;;;:::o;12095:366::-;12237:3;12258:67;12322:2;12317:3;12258:67;:::i;:::-;12251:74;;12334:93;12423:3;12334:93;:::i;:::-;12452:2;12447:3;12443:12;12436:19;;12241:220;;;:::o;12467:366::-;12609:3;12630:67;12694:2;12689:3;12630:67;:::i;:::-;12623:74;;12706:93;12795:3;12706:93;:::i;:::-;12824:2;12819:3;12815:12;12808:19;;12613:220;;;:::o;12839:366::-;12981:3;13002:67;13066:2;13061:3;13002:67;:::i;:::-;12995:74;;13078:93;13167:3;13078:93;:::i;:::-;13196:2;13191:3;13187:12;13180:19;;12985:220;;;:::o;13211:366::-;13353:3;13374:67;13438:2;13433:3;13374:67;:::i;:::-;13367:74;;13450:93;13539:3;13450:93;:::i;:::-;13568:2;13563:3;13559:12;13552:19;;13357:220;;;:::o;13583:366::-;13725:3;13746:67;13810:2;13805:3;13746:67;:::i;:::-;13739:74;;13822:93;13911:3;13822:93;:::i;:::-;13940:2;13935:3;13931:12;13924:19;;13729:220;;;:::o;13955:366::-;14097:3;14118:67;14182:2;14177:3;14118:67;:::i;:::-;14111:74;;14194:93;14283:3;14194:93;:::i;:::-;14312:2;14307:3;14303:12;14296:19;;14101:220;;;:::o;14327:366::-;14469:3;14490:67;14554:2;14549:3;14490:67;:::i;:::-;14483:74;;14566:93;14655:3;14566:93;:::i;:::-;14684:2;14679:3;14675:12;14668:19;;14473:220;;;:::o;14699:366::-;14841:3;14862:67;14926:2;14921:3;14862:67;:::i;:::-;14855:74;;14938:93;15027:3;14938:93;:::i;:::-;15056:2;15051:3;15047:12;15040:19;;14845:220;;;:::o;15071:366::-;15213:3;15234:67;15298:2;15293:3;15234:67;:::i;:::-;15227:74;;15310:93;15399:3;15310:93;:::i;:::-;15428:2;15423:3;15419:12;15412:19;;15217:220;;;:::o;15443:366::-;15585:3;15606:67;15670:2;15665:3;15606:67;:::i;:::-;15599:74;;15682:93;15771:3;15682:93;:::i;:::-;15800:2;15795:3;15791:12;15784:19;;15589:220;;;:::o;15815:366::-;15957:3;15978:67;16042:2;16037:3;15978:67;:::i;:::-;15971:74;;16054:93;16143:3;16054:93;:::i;:::-;16172:2;16167:3;16163:12;16156:19;;15961:220;;;:::o;16187:366::-;16329:3;16350:67;16414:2;16409:3;16350:67;:::i;:::-;16343:74;;16426:93;16515:3;16426:93;:::i;:::-;16544:2;16539:3;16535:12;16528:19;;16333:220;;;:::o;16559:366::-;16701:3;16722:67;16786:2;16781:3;16722:67;:::i;:::-;16715:74;;16798:93;16887:3;16798:93;:::i;:::-;16916:2;16911:3;16907:12;16900:19;;16705:220;;;:::o;16931:366::-;17073:3;17094:67;17158:2;17153:3;17094:67;:::i;:::-;17087:74;;17170:93;17259:3;17170:93;:::i;:::-;17288:2;17283:3;17279:12;17272:19;;17077:220;;;:::o;17303:366::-;17445:3;17466:67;17530:2;17525:3;17466:67;:::i;:::-;17459:74;;17542:93;17631:3;17542:93;:::i;:::-;17660:2;17655:3;17651:12;17644:19;;17449:220;;;:::o;17675:366::-;17817:3;17838:67;17902:2;17897:3;17838:67;:::i;:::-;17831:74;;17914:93;18003:3;17914:93;:::i;:::-;18032:2;18027:3;18023:12;18016:19;;17821:220;;;:::o;18047:366::-;18189:3;18210:67;18274:2;18269:3;18210:67;:::i;:::-;18203:74;;18286:93;18375:3;18286:93;:::i;:::-;18404:2;18399:3;18395:12;18388:19;;18193:220;;;:::o;18419:366::-;18561:3;18582:67;18646:2;18641:3;18582:67;:::i;:::-;18575:74;;18658:93;18747:3;18658:93;:::i;:::-;18776:2;18771:3;18767:12;18760:19;;18565:220;;;:::o;18791:366::-;18933:3;18954:67;19018:2;19013:3;18954:67;:::i;:::-;18947:74;;19030:93;19119:3;19030:93;:::i;:::-;19148:2;19143:3;19139:12;19132:19;;18937:220;;;:::o;19163:366::-;19305:3;19326:67;19390:2;19385:3;19326:67;:::i;:::-;19319:74;;19402:93;19491:3;19402:93;:::i;:::-;19520:2;19515:3;19511:12;19504:19;;19309:220;;;:::o;19535:366::-;19677:3;19698:67;19762:2;19757:3;19698:67;:::i;:::-;19691:74;;19774:93;19863:3;19774:93;:::i;:::-;19892:2;19887:3;19883:12;19876:19;;19681:220;;;:::o;19907:366::-;20049:3;20070:67;20134:2;20129:3;20070:67;:::i;:::-;20063:74;;20146:93;20235:3;20146:93;:::i;:::-;20264:2;20259:3;20255:12;20248:19;;20053:220;;;:::o;20279:366::-;20421:3;20442:67;20506:2;20501:3;20442:67;:::i;:::-;20435:74;;20518:93;20607:3;20518:93;:::i;:::-;20636:2;20631:3;20627:12;20620:19;;20425:220;;;:::o;20651:366::-;20793:3;20814:67;20878:2;20873:3;20814:67;:::i;:::-;20807:74;;20890:93;20979:3;20890:93;:::i;:::-;21008:2;21003:3;20999:12;20992:19;;20797:220;;;:::o;21023:366::-;21165:3;21186:67;21250:2;21245:3;21186:67;:::i;:::-;21179:74;;21262:93;21351:3;21262:93;:::i;:::-;21380:2;21375:3;21371:12;21364:19;;21169:220;;;:::o;21395:118::-;21482:24;21500:5;21482:24;:::i;:::-;21477:3;21470:37;21460:53;;:::o;21519:435::-;21699:3;21721:95;21812:3;21803:6;21721:95;:::i;:::-;21714:102;;21833:95;21924:3;21915:6;21833:95;:::i;:::-;21826:102;;21945:3;21938:10;;21703:251;;;;;:::o;21960:222::-;22053:4;22091:2;22080:9;22076:18;22068:26;;22104:71;22172:1;22161:9;22157:17;22148:6;22104:71;:::i;:::-;22058:124;;;;:::o;22188:640::-;22383:4;22421:3;22410:9;22406:19;22398:27;;22435:71;22503:1;22492:9;22488:17;22479:6;22435:71;:::i;:::-;22516:72;22584:2;22573:9;22569:18;22560:6;22516:72;:::i;:::-;22598;22666:2;22655:9;22651:18;22642:6;22598:72;:::i;:::-;22717:9;22711:4;22707:20;22702:2;22691:9;22687:18;22680:48;22745:76;22816:4;22807:6;22745:76;:::i;:::-;22737:84;;22388:440;;;;;;;:::o;22834:210::-;22921:4;22959:2;22948:9;22944:18;22936:26;;22972:65;23034:1;23023:9;23019:17;23010:6;22972:65;:::i;:::-;22926:118;;;;:::o;23050:218::-;23141:4;23179:2;23168:9;23164:18;23156:26;;23192:69;23258:1;23247:9;23243:17;23234:6;23192:69;:::i;:::-;23146:122;;;;:::o;23274:313::-;23387:4;23425:2;23414:9;23410:18;23402:26;;23474:9;23468:4;23464:20;23460:1;23449:9;23445:17;23438:47;23502:78;23575:4;23566:6;23502:78;:::i;:::-;23494:86;;23392:195;;;;:::o;23593:419::-;23759:4;23797:2;23786:9;23782:18;23774:26;;23846:9;23840:4;23836:20;23832:1;23821:9;23817:17;23810:47;23874:131;24000:4;23874:131;:::i;:::-;23866:139;;23764:248;;;:::o;24018:419::-;24184:4;24222:2;24211:9;24207:18;24199:26;;24271:9;24265:4;24261:20;24257:1;24246:9;24242:17;24235:47;24299:131;24425:4;24299:131;:::i;:::-;24291:139;;24189:248;;;:::o;24443:419::-;24609:4;24647:2;24636:9;24632:18;24624:26;;24696:9;24690:4;24686:20;24682:1;24671:9;24667:17;24660:47;24724:131;24850:4;24724:131;:::i;:::-;24716:139;;24614:248;;;:::o;24868:419::-;25034:4;25072:2;25061:9;25057:18;25049:26;;25121:9;25115:4;25111:20;25107:1;25096:9;25092:17;25085:47;25149:131;25275:4;25149:131;:::i;:::-;25141:139;;25039:248;;;:::o;25293:419::-;25459:4;25497:2;25486:9;25482:18;25474:26;;25546:9;25540:4;25536:20;25532:1;25521:9;25517:17;25510:47;25574:131;25700:4;25574:131;:::i;:::-;25566:139;;25464:248;;;:::o;25718:419::-;25884:4;25922:2;25911:9;25907:18;25899:26;;25971:9;25965:4;25961:20;25957:1;25946:9;25942:17;25935:47;25999:131;26125:4;25999:131;:::i;:::-;25991:139;;25889:248;;;:::o;26143:419::-;26309:4;26347:2;26336:9;26332:18;26324:26;;26396:9;26390:4;26386:20;26382:1;26371:9;26367:17;26360:47;26424:131;26550:4;26424:131;:::i;:::-;26416:139;;26314:248;;;:::o;26568:419::-;26734:4;26772:2;26761:9;26757:18;26749:26;;26821:9;26815:4;26811:20;26807:1;26796:9;26792:17;26785:47;26849:131;26975:4;26849:131;:::i;:::-;26841:139;;26739:248;;;:::o;26993:419::-;27159:4;27197:2;27186:9;27182:18;27174:26;;27246:9;27240:4;27236:20;27232:1;27221:9;27217:17;27210:47;27274:131;27400:4;27274:131;:::i;:::-;27266:139;;27164:248;;;:::o;27418:419::-;27584:4;27622:2;27611:9;27607:18;27599:26;;27671:9;27665:4;27661:20;27657:1;27646:9;27642:17;27635:47;27699:131;27825:4;27699:131;:::i;:::-;27691:139;;27589:248;;;:::o;27843:419::-;28009:4;28047:2;28036:9;28032:18;28024:26;;28096:9;28090:4;28086:20;28082:1;28071:9;28067:17;28060:47;28124:131;28250:4;28124:131;:::i;:::-;28116:139;;28014:248;;;:::o;28268:419::-;28434:4;28472:2;28461:9;28457:18;28449:26;;28521:9;28515:4;28511:20;28507:1;28496:9;28492:17;28485:47;28549:131;28675:4;28549:131;:::i;:::-;28541:139;;28439:248;;;:::o;28693:419::-;28859:4;28897:2;28886:9;28882:18;28874:26;;28946:9;28940:4;28936:20;28932:1;28921:9;28917:17;28910:47;28974:131;29100:4;28974:131;:::i;:::-;28966:139;;28864:248;;;:::o;29118:419::-;29284:4;29322:2;29311:9;29307:18;29299:26;;29371:9;29365:4;29361:20;29357:1;29346:9;29342:17;29335:47;29399:131;29525:4;29399:131;:::i;:::-;29391:139;;29289:248;;;:::o;29543:419::-;29709:4;29747:2;29736:9;29732:18;29724:26;;29796:9;29790:4;29786:20;29782:1;29771:9;29767:17;29760:47;29824:131;29950:4;29824:131;:::i;:::-;29816:139;;29714:248;;;:::o;29968:419::-;30134:4;30172:2;30161:9;30157:18;30149:26;;30221:9;30215:4;30211:20;30207:1;30196:9;30192:17;30185:47;30249:131;30375:4;30249:131;:::i;:::-;30241:139;;30139:248;;;:::o;30393:419::-;30559:4;30597:2;30586:9;30582:18;30574:26;;30646:9;30640:4;30636:20;30632:1;30621:9;30617:17;30610:47;30674:131;30800:4;30674:131;:::i;:::-;30666:139;;30564:248;;;:::o;30818:419::-;30984:4;31022:2;31011:9;31007:18;30999:26;;31071:9;31065:4;31061:20;31057:1;31046:9;31042:17;31035:47;31099:131;31225:4;31099:131;:::i;:::-;31091:139;;30989:248;;;:::o;31243:419::-;31409:4;31447:2;31436:9;31432:18;31424:26;;31496:9;31490:4;31486:20;31482:1;31471:9;31467:17;31460:47;31524:131;31650:4;31524:131;:::i;:::-;31516:139;;31414:248;;;:::o;31668:419::-;31834:4;31872:2;31861:9;31857:18;31849:26;;31921:9;31915:4;31911:20;31907:1;31896:9;31892:17;31885:47;31949:131;32075:4;31949:131;:::i;:::-;31941:139;;31839:248;;;:::o;32093:419::-;32259:4;32297:2;32286:9;32282:18;32274:26;;32346:9;32340:4;32336:20;32332:1;32321:9;32317:17;32310:47;32374:131;32500:4;32374:131;:::i;:::-;32366:139;;32264:248;;;:::o;32518:419::-;32684:4;32722:2;32711:9;32707:18;32699:26;;32771:9;32765:4;32761:20;32757:1;32746:9;32742:17;32735:47;32799:131;32925:4;32799:131;:::i;:::-;32791:139;;32689:248;;;:::o;32943:419::-;33109:4;33147:2;33136:9;33132:18;33124:26;;33196:9;33190:4;33186:20;33182:1;33171:9;33167:17;33160:47;33224:131;33350:4;33224:131;:::i;:::-;33216:139;;33114:248;;;:::o;33368:419::-;33534:4;33572:2;33561:9;33557:18;33549:26;;33621:9;33615:4;33611:20;33607:1;33596:9;33592:17;33585:47;33649:131;33775:4;33649:131;:::i;:::-;33641:139;;33539:248;;;:::o;33793:419::-;33959:4;33997:2;33986:9;33982:18;33974:26;;34046:9;34040:4;34036:20;34032:1;34021:9;34017:17;34010:47;34074:131;34200:4;34074:131;:::i;:::-;34066:139;;33964:248;;;:::o;34218:419::-;34384:4;34422:2;34411:9;34407:18;34399:26;;34471:9;34465:4;34461:20;34457:1;34446:9;34442:17;34435:47;34499:131;34625:4;34499:131;:::i;:::-;34491:139;;34389:248;;;:::o;34643:419::-;34809:4;34847:2;34836:9;34832:18;34824:26;;34896:9;34890:4;34886:20;34882:1;34871:9;34867:17;34860:47;34924:131;35050:4;34924:131;:::i;:::-;34916:139;;34814:248;;;:::o;35068:419::-;35234:4;35272:2;35261:9;35257:18;35249:26;;35321:9;35315:4;35311:20;35307:1;35296:9;35292:17;35285:47;35349:131;35475:4;35349:131;:::i;:::-;35341:139;;35239:248;;;:::o;35493:419::-;35659:4;35697:2;35686:9;35682:18;35674:26;;35746:9;35740:4;35736:20;35732:1;35721:9;35717:17;35710:47;35774:131;35900:4;35774:131;:::i;:::-;35766:139;;35664:248;;;:::o;35918:222::-;36011:4;36049:2;36038:9;36034:18;36026:26;;36062:71;36130:1;36119:9;36115:17;36106:6;36062:71;:::i;:::-;36016:124;;;;:::o;36146:442::-;36295:4;36333:2;36322:9;36318:18;36310:26;;36346:71;36414:1;36403:9;36399:17;36390:6;36346:71;:::i;:::-;36427:72;36495:2;36484:9;36480:18;36471:6;36427:72;:::i;:::-;36509;36577:2;36566:9;36562:18;36553:6;36509:72;:::i;:::-;36300:288;;;;;;:::o;36594:129::-;36628:6;36655:20;;:::i;:::-;36645:30;;36684:33;36712:4;36704:6;36684:33;:::i;:::-;36635:88;;;:::o;36729:75::-;36762:6;36795:2;36789:9;36779:19;;36769:35;:::o;36810:307::-;36871:4;36961:18;36953:6;36950:30;36947:2;;;36983:18;;:::i;:::-;36947:2;37021:29;37043:6;37021:29;:::i;:::-;37013:37;;37105:4;37099;37095:15;37087:23;;36876:241;;;:::o;37123:308::-;37185:4;37275:18;37267:6;37264:30;37261:2;;;37297:18;;:::i;:::-;37261:2;37335:29;37357:6;37335:29;:::i;:::-;37327:37;;37419:4;37413;37409:15;37401:23;;37190:241;;;:::o;37437:98::-;37488:6;37522:5;37516:12;37506:22;;37495:40;;;:::o;37541:99::-;37593:6;37627:5;37621:12;37611:22;;37600:40;;;:::o;37646:168::-;37729:11;37763:6;37758:3;37751:19;37803:4;37798:3;37794:14;37779:29;;37741:73;;;;:::o;37820:169::-;37904:11;37938:6;37933:3;37926:19;37978:4;37973:3;37969:14;37954:29;;37916:73;;;;:::o;37995:148::-;38097:11;38134:3;38119:18;;38109:34;;;;:::o;38149:305::-;38189:3;38208:20;38226:1;38208:20;:::i;:::-;38203:25;;38242:20;38260:1;38242:20;:::i;:::-;38237:25;;38396:1;38328:66;38324:74;38321:1;38318:81;38315:2;;;38402:18;;:::i;:::-;38315:2;38446:1;38443;38439:9;38432:16;;38193:261;;;;:::o;38460:185::-;38500:1;38517:20;38535:1;38517:20;:::i;:::-;38512:25;;38551:20;38569:1;38551:20;:::i;:::-;38546:25;;38590:1;38580:2;;38595:18;;:::i;:::-;38580:2;38637:1;38634;38630:9;38625:14;;38502:143;;;;:::o;38651:348::-;38691:7;38714:20;38732:1;38714:20;:::i;:::-;38709:25;;38748:20;38766:1;38748:20;:::i;:::-;38743:25;;38936:1;38868:66;38864:74;38861:1;38858:81;38853:1;38846:9;38839:17;38835:105;38832:2;;;38943:18;;:::i;:::-;38832:2;38991:1;38988;38984:9;38973:20;;38699:300;;;;:::o;39005:191::-;39045:4;39065:20;39083:1;39065:20;:::i;:::-;39060:25;;39099:20;39117:1;39099:20;:::i;:::-;39094:25;;39138:1;39135;39132:8;39129:2;;;39143:18;;:::i;:::-;39129:2;39188:1;39185;39181:9;39173:17;;39050:146;;;;:::o;39202:96::-;39239:7;39268:24;39286:5;39268:24;:::i;:::-;39257:35;;39247:51;;;:::o;39304:90::-;39338:7;39381:5;39374:13;39367:21;39356:32;;39346:48;;;:::o;39400:149::-;39436:7;39476:66;39469:5;39465:78;39454:89;;39444:105;;;:::o;39555:126::-;39592:7;39632:42;39625:5;39621:54;39610:65;;39600:81;;;:::o;39687:77::-;39724:7;39753:5;39742:16;;39732:32;;;:::o;39770:154::-;39854:6;39849:3;39844;39831:30;39916:1;39907:6;39902:3;39898:16;39891:27;39821:103;;;:::o;39930:307::-;39998:1;40008:113;40022:6;40019:1;40016:13;40008:113;;;40107:1;40102:3;40098:11;40092:18;40088:1;40083:3;40079:11;40072:39;40044:2;40041:1;40037:10;40032:15;;40008:113;;;40139:6;40136:1;40133:13;40130:2;;;40219:1;40210:6;40205:3;40201:16;40194:27;40130:2;39979:258;;;;:::o;40243:320::-;40287:6;40324:1;40318:4;40314:12;40304:22;;40371:1;40365:4;40361:12;40392:18;40382:2;;40448:4;40440:6;40436:17;40426:27;;40382:2;40510;40502:6;40499:14;40479:18;40476:38;40473:2;;;40529:18;;:::i;:::-;40473:2;40294:269;;;;:::o;40569:281::-;40652:27;40674:4;40652:27;:::i;:::-;40644:6;40640:40;40782:6;40770:10;40767:22;40746:18;40734:10;40731:34;40728:62;40725:2;;;40793:18;;:::i;:::-;40725:2;40833:10;40829:2;40822:22;40612:238;;;:::o;40856:233::-;40895:3;40918:24;40936:5;40918:24;:::i;:::-;40909:33;;40964:66;40957:5;40954:77;40951:2;;;41034:18;;:::i;:::-;40951:2;41081:1;41074:5;41070:13;41063:20;;40899:190;;;:::o;41095:176::-;41127:1;41144:20;41162:1;41144:20;:::i;:::-;41139:25;;41178:20;41196:1;41178:20;:::i;:::-;41173:25;;41217:1;41207:2;;41222:18;;:::i;:::-;41207:2;41263:1;41260;41256:9;41251:14;;41129:142;;;;:::o;41277:180::-;41325:77;41322:1;41315:88;41422:4;41419:1;41412:15;41446:4;41443:1;41436:15;41463:180;41511:77;41508:1;41501:88;41608:4;41605:1;41598:15;41632:4;41629:1;41622:15;41649:180;41697:77;41694:1;41687:88;41794:4;41791:1;41784:15;41818:4;41815:1;41808:15;41835:180;41883:77;41880:1;41873:88;41980:4;41977:1;41970:15;42004:4;42001:1;41994:15;42021:102;42062:6;42113:2;42109:7;42104:2;42097:5;42093:14;42089:28;42079:38;;42069:54;;;:::o;42129:176::-;42269:28;42265:1;42257:6;42253:14;42246:52;42235:70;:::o;42311:175::-;42451:27;42447:1;42439:6;42435:14;42428:51;42417:69;:::o;42492:230::-;42632:34;42628:1;42620:6;42616:14;42609:58;42701:13;42696:2;42688:6;42684:15;42677:38;42598:124;:::o;42728:237::-;42868:34;42864:1;42856:6;42852:14;42845:58;42937:20;42932:2;42924:6;42920:15;42913:45;42834:131;:::o;42971:225::-;43111:34;43107:1;43099:6;43095:14;43088:58;43180:8;43175:2;43167:6;43163:15;43156:33;43077:119;:::o;43202:178::-;43342:30;43338:1;43330:6;43326:14;43319:54;43308:72;:::o;43386:231::-;43526:34;43522:1;43514:6;43510:14;43503:58;43595:14;43590:2;43582:6;43578:15;43571:39;43492:125;:::o;43623:223::-;43763:34;43759:1;43751:6;43747:14;43740:58;43832:6;43827:2;43819:6;43815:15;43808:31;43729:117;:::o;43852:175::-;43992:27;43988:1;43980:6;43976:14;43969:51;43958:69;:::o;44033:181::-;44173:33;44169:1;44161:6;44157:14;44150:57;44139:75;:::o;44220:231::-;44360:34;44356:1;44348:6;44344:14;44337:58;44429:14;44424:2;44416:6;44412:15;44405:39;44326:125;:::o;44457:223::-;44597:34;44593:1;44585:6;44581:14;44574:58;44666:6;44661:2;44653:6;44649:15;44642:31;44563:117;:::o;44686:243::-;44826:34;44822:1;44814:6;44810:14;44803:58;44895:26;44890:2;44882:6;44878:15;44871:51;44792:137;:::o;44935:170::-;45075:22;45071:1;45063:6;45059:14;45052:46;45041:64;:::o;45111:229::-;45251:34;45247:1;45239:6;45235:14;45228:58;45320:12;45315:2;45307:6;45303:15;45296:37;45217:123;:::o;45346:228::-;45486:34;45482:1;45474:6;45470:14;45463:58;45555:11;45550:2;45542:6;45538:15;45531:36;45452:122;:::o;45580:180::-;45720:32;45716:1;45708:6;45704:14;45697:56;45686:74;:::o;45766:182::-;45906:34;45902:1;45894:6;45890:14;45883:58;45872:76;:::o;45954:231::-;46094:34;46090:1;46082:6;46078:14;46071:58;46163:14;46158:2;46150:6;46146:15;46139:39;46060:125;:::o;46191:182::-;46331:34;46327:1;46319:6;46315:14;46308:58;46297:76;:::o;46379:228::-;46519:34;46515:1;46507:6;46503:14;46496:58;46588:11;46583:2;46575:6;46571:15;46564:36;46485:122;:::o;46613:234::-;46753:34;46749:1;46741:6;46737:14;46730:58;46822:17;46817:2;46809:6;46805:15;46798:42;46719:128;:::o;46853:220::-;46993:34;46989:1;46981:6;46977:14;46970:58;47062:3;47057:2;47049:6;47045:15;47038:28;46959:114;:::o;47079:179::-;47219:31;47215:1;47207:6;47203:14;47196:55;47185:73;:::o;47264:236::-;47404:34;47400:1;47392:6;47388:14;47381:58;47473:19;47468:2;47460:6;47456:15;47449:44;47370:130;:::o;47506:180::-;47646:32;47642:1;47634:6;47630:14;47623:56;47612:74;:::o;47692:171::-;47832:23;47828:1;47820:6;47816:14;47809:47;47798:65;:::o;47869:231::-;48009:34;48005:1;47997:6;47993:14;47986:58;48078:14;48073:2;48065:6;48061:15;48054:39;47975:125;:::o;48106:228::-;48246:34;48242:1;48234:6;48230:14;48223:58;48315:11;48310:2;48302:6;48298:15;48291:36;48212:122;:::o;48340:::-;48413:24;48431:5;48413:24;:::i;:::-;48406:5;48403:35;48393:2;;48452:1;48449;48442:12;48393:2;48383:79;:::o;48468:116::-;48538:21;48553:5;48538:21;:::i;:::-;48531:5;48528:32;48518:2;;48574:1;48571;48564:12;48518:2;48508:76;:::o;48590:120::-;48662:23;48679:5;48662:23;:::i;:::-;48655:5;48652:34;48642:2;;48700:1;48697;48690:12;48642:2;48632:78;:::o;48716:122::-;48789:24;48807:5;48789:24;:::i;:::-;48782:5;48779:35;48769:2;;48828:1;48825;48818:12;48769:2;48759:79;:::o

Swarm Source

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