ETH Price: $3,236.43 (-0.56%)
Gas: 1 Gwei

Token

Spellbooks for Looters (LootSpellbook)
 

Overview

Max Total Supply

62 LootSpellbook

Holders

36

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
9000001000009.eth
Balance
1 LootSpellbook
0xFCFA4369EAa965AC4e36f1Dd9fd2852C6542b0F7
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:
LootSpellbook

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-03
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @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;
}




/**
 * @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);
    }
}




/*
 * @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;
    }
}









/**
 * @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);
    }
}





/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}














/**
 * @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);
}







/**
 * @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);
}





/**
 * @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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}









/**
 * @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;
    }
}


/**
 * @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(to).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 {}
}







/**
 * @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);
}


/**
 * @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();
    }
}

interface LootInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

contract LootSpellbook is ERC721Enumerable, ReentrancyGuard, Ownable {

    address public lootAddress = 0xFF9C1b15B16263C61d017ee9F65C50e4AE0113D7;
    LootInterface lootContract = LootInterface(lootAddress);
    
    uint256 public lootersPrice = 30000000000000000; //0.03 ETH
    uint256 public publicPrice = 150000000000000000; //0.15 ETH
    
    function contractURI() public pure returns (string memory) {
        return "https://loot-spells.herokuapp.com/contract/loot-spellbooks";
    }
    
    //generating a random number
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function generateSpell(uint256 tokenId, uint256 position) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("Spell", toString(tokenId), toString(position))));
        return rand % 410;
    }

    function generateSpellbook(uint256 tokenId) internal pure returns (uint256) {
        uint256 book = 0; 
        for (uint i=0; i<7; i++) {
            book += generateSpell(tokenId, i) * 2 ** (i*16);
        }
        return book;
    }
    
    function baseTokenURI() public pure returns (string memory) {
        return "https://loot-spells.herokuapp.com/api/spellbook/";
    }

    function tokenURI(uint256 _tokenId) override public pure returns (string memory) {
        uint256 book = generateSpellbook(_tokenId);
        return string(abi.encodePacked(baseTokenURI(), Strings.toHexString(book), "/", Strings.toString(_tokenId)));
    }

    //Private sale minting (reserved for Loot owners)
    function mintWithLoot(uint lootId) public payable nonReentrant {
        require(lootersPrice <= msg.value, "Ether value sent is not correct");
        require(lootContract.ownerOf(lootId) == msg.sender, "Not the owner of this loot");
        require(!_exists(lootId), "This token has already been minted");

        _safeMint(msg.sender, lootId);
    }
    function multiMintWithLoot(uint[] memory lootIds) public payable nonReentrant {
        require((lootersPrice * lootIds.length) <= msg.value, "Ether value sent is not correct");
        
        for (uint i=0; i<lootIds.length; i++) {
            require(lootContract.ownerOf(lootIds[i]) == msg.sender, "Not the owner of this loot");
            require(!_exists(lootIds[i]), "One of these tokens has already been minted");
            _safeMint(msg.sender, lootIds[i]);
        }
        
    }

    //Public sale minting
    function mint(uint lootId) public payable nonReentrant {
        require(publicPrice <= msg.value, "Ether value sent is not correct");
        require(lootId > 8000 && lootId <= 12000, "Token ID invalid");
        require(!_exists(lootId), "This token has already been minted");

        _safeMint(msg.sender, lootId);
    }
    function multiMint(uint[] memory lootIds) public payable nonReentrant {
        require((publicPrice * lootIds.length) <= msg.value, "Ether value sent is not correct");
        
        for (uint i=0; i<lootIds.length; i++) {
            require(lootIds[i] > 8000 && lootIds[i] <= 12000, "Token ID invalid");
            require(!_exists(lootIds[i]), "One of these tokens have already been minted");
            _safeMint(msg.sender, lootIds[i]);
        }
    }
    
    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 12000 && tokenId <= 12100, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    
    function setLootersPrice(uint256 newPrice) public onlyOwner {
        lootersPrice = newPrice;
    }

    function setPublicPrice(uint256 newPrice) public onlyOwner {
        publicPrice = newPrice;
    }

    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Spellbooks for Looters", "LootSpellbook") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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":[{"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"lootAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lootersPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootId","type":"uint256"}],"name":"mintWithLoot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"lootIds","type":"uint256[]"}],"name":"multiMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"lootIds","type":"uint256[]"}],"name":"multiMintWithLoot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setLootersPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicPrice","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":"pure","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"}]

608060405273ff9c1b15b16263c61d017ee9f65c50e4ae0113d7600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550666a94d74f430000600e55670214e8348c4f0000600f55348015620000e057600080fd5b506040518060400160405280601681526020017f5370656c6c626f6f6b7320666f72204c6f6f74657273000000000000000000008152506040518060400160405280600d81526020017f4c6f6f745370656c6c626f6f6b000000000000000000000000000000000000008152508160009080519060200190620001659291906200027d565b5080600190805190602001906200017e9291906200027d565b5050506001600a81905550620001a96200019d620001af60201b60201c565b620001b760201b60201c565b62000392565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200028b906200032d565b90600052602060002090601f016020900481019282620002af5760008555620002fb565b82601f10620002ca57805160ff1916838001178555620002fb565b82800160010185558215620002fb579182015b82811115620002fa578251825591602001919060010190620002dd565b5b5090506200030a91906200030e565b5090565b5b80821115620003295760008160009055506001016200030f565b5090565b600060028204905060018216806200034657607f821691505b602082108114156200035d576200035c62000363565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614ce980620003a26000396000f3fe6080604052600436106101d85760003560e01c806370a0823111610102578063b88d4fde11610095578063e8a3d48511610064578063e8a3d48514610693578063e985e9c5146106be578063f2fde38b146106fb578063fd12c96814610724576101d8565b8063b88d4fde146105d9578063c627525514610602578063c87b56dd1461062b578063d547cfb714610668576101d8565b80639a0e4ebb116100d15780639a0e4ebb1461054d578063a0712d6814610569578063a22cb46514610585578063a945bf80146105ae576101d8565b806370a08231146104a3578063715018a6146104e05780638da5cb5b146104f757806395d89b4114610522576101d8565b80632e22de9f1161017a5780634a96974e116101495780634a96974e146103e25780634f6ccce71461040d5780636352211e1461044a57806367fd1a0f14610487576101d8565b80632e22de9f1461032a5780632f745c591461035357806342842e0e14610390578063434f48c4146103b9576101d8565b8063095ea7b3116101b6578063095ea7b3146102825780630e439326146102ab57806318160ddd146102d657806323b872dd14610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613578565b610740565b6040516102119190613b69565b60405180910390f35b34801561022657600080fd5b5061022f6107ba565b60405161023c9190613b84565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906135d2565b61084c565b6040516102799190613b02565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a491906134ef565b6108d1565b005b3480156102b757600080fd5b506102c06109e9565b6040516102cd9190613b02565b60405180910390f35b3480156102e257600080fd5b506102eb610a0f565b6040516102f89190613ec6565b60405180910390f35b34801561030d57600080fd5b50610328600480360381019061032391906133d9565b610a1c565b005b34801561033657600080fd5b50610351600480360381019061034c91906135d2565b610a7c565b005b34801561035f57600080fd5b5061037a600480360381019061037591906134ef565b610b02565b6040516103879190613ec6565b60405180910390f35b34801561039c57600080fd5b506103b760048036038101906103b291906133d9565b610ba7565b005b3480156103c557600080fd5b506103e060048036038101906103db91906135d2565b610bc7565b005b3480156103ee57600080fd5b506103f7610cff565b6040516104049190613ec6565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f91906135d2565b610d05565b6040516104419190613ec6565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c91906135d2565b610d76565b60405161047e9190613b02565b60405180910390f35b6104a1600480360381019061049c919061352f565b610e28565b005b3480156104af57600080fd5b506104ca60048036038101906104c5919061333f565b6110ab565b6040516104d79190613ec6565b60405180910390f35b3480156104ec57600080fd5b506104f5611163565b005b34801561050357600080fd5b5061050c6111eb565b6040516105199190613b02565b60405180910390f35b34801561052e57600080fd5b50610537611215565b6040516105449190613b84565b60405180910390f35b6105676004803603810190610562919061352f565b6112a7565b005b610583600480360381019061057e91906135d2565b61147e565b005b34801561059157600080fd5b506105ac60048036038101906105a791906134af565b6115c1565b005b3480156105ba57600080fd5b506105c3611742565b6040516105d09190613ec6565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb919061342c565b611748565b005b34801561060e57600080fd5b50610629600480360381019061062491906135d2565b6117aa565b005b34801561063757600080fd5b50610652600480360381019061064d91906135d2565b611830565b60405161065f9190613b84565b60405180910390f35b34801561067457600080fd5b5061067d611882565b60405161068a9190613b84565b60405180910390f35b34801561069f57600080fd5b506106a86118a2565b6040516106b59190613b84565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190613399565b6118c2565b6040516106f29190613b69565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d919061333f565b611956565b005b61073e600480360381019061073991906135d2565b611a4e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b357506107b282611c57565b5b9050919050565b6060600080546107c99061430c565b80601f01602080910402602001604051908101604052809291908181526020018280546107f59061430c565b80156108425780601f1061081757610100808354040283529160200191610842565b820191906000526020600020905b81548152906001019060200180831161082557829003601f168201915b5050505050905090565b600061085782611d39565b610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d90613da6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108dc82610d76565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094490613e46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096c611da5565b73ffffffffffffffffffffffffffffffffffffffff16148061099b575061099a81610995611da5565b6118c2565b5b6109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d190613d26565b60405180910390fd5b6109e48383611dad565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b610a2d610a27611da5565b82611e66565b610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390613e66565b60405180910390fd5b610a77838383611f44565b505050565b610a84611da5565b73ffffffffffffffffffffffffffffffffffffffff16610aa26111eb565b73ffffffffffffffffffffffffffffffffffffffff1614610af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aef90613dc6565b60405180910390fd5b80600e8190555050565b6000610b0d836110ab565b8210610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590613bc6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bc283838360405180602001604052806000815250611748565b505050565b6002600a541415610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0490613ea6565b60405180910390fd5b6002600a81905550610c1d611da5565b73ffffffffffffffffffffffffffffffffffffffff16610c3b6111eb565b73ffffffffffffffffffffffffffffffffffffffff1614610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890613dc6565b60405180910390fd5b612ee081118015610ca45750612f448111155b610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90613de6565b60405180910390fd5b610cf4610cee6111eb565b826121a0565b6001600a8190555050565b600e5481565b6000610d0f610a0f565b8210610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790613e86565b60405180910390fd5b60088281548110610d6457610d636144a5565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1690613d66565b60405180910390fd5b80915050919050565b6002600a541415610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590613ea6565b60405180910390fd5b6002600a81905550348151600e54610e86919061419e565b1115610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe90613ca6565b60405180910390fd5b60005b815181101561109f573373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610f3b57610f3a6144a5565b5b60200260200101516040518263ffffffff1660e01b8152600401610f5f9190613ec6565b60206040518083038186803b158015610f7757600080fd5b505afa158015610f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faf919061336c565b73ffffffffffffffffffffffffffffffffffffffff1614611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90613cc6565b60405180910390fd5b61102882828151811061101b5761101a6144a5565b5b6020026020010151611d39565b15611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90613e26565b60405180910390fd5b61108c3383838151811061107f5761107e6144a5565b5b60200260200101516121a0565b80806110979061436f565b915050610eca565b506001600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613d46565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61116b611da5565b73ffffffffffffffffffffffffffffffffffffffff166111896111eb565b73ffffffffffffffffffffffffffffffffffffffff16146111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d690613dc6565b60405180910390fd5b6111e960006121be565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112249061430c565b80601f01602080910402602001604051908101604052809291908181526020018280546112509061430c565b801561129d5780601f106112725761010080835404028352916020019161129d565b820191906000526020600020905b81548152906001019060200180831161128057829003601f168201915b5050505050905090565b6002600a5414156112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613ea6565b60405180910390fd5b6002600a81905550348151600f54611305919061419e565b1115611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d90613ca6565b60405180910390fd5b60005b815181101561147257611f40828281518110611368576113676144a5565b5b60200260200101511180156113995750612ee082828151811061138e5761138d6144a5565b5b602002602001015111155b6113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613de6565b60405180910390fd5b6113fb8282815181106113ee576113ed6144a5565b5b6020026020010151611d39565b1561143b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143290613c46565b60405180910390fd5b61145f33838381518110611452576114516144a5565b5b60200260200101516121a0565b808061146a9061436f565b915050611349565b506001600a8190555050565b6002600a5414156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb90613ea6565b60405180910390fd5b6002600a8190555034600f541115611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890613ca6565b60405180910390fd5b611f40811180156115245750612ee08111155b611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a90613de6565b60405180910390fd5b61156c81611d39565b156115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390613d06565b60405180910390fd5b6115b633826121a0565b6001600a8190555050565b6115c9611da5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90613c86565b60405180910390fd5b8060056000611644611da5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116f1611da5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117369190613b69565b60405180910390a35050565b600f5481565b611759611753611da5565b83611e66565b611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90613e66565b60405180910390fd5b6117a484848484612284565b50505050565b6117b2611da5565b73ffffffffffffffffffffffffffffffffffffffff166117d06111eb565b73ffffffffffffffffffffffffffffffffffffffff1614611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d90613dc6565b60405180910390fd5b80600f8190555050565b6060600061183d836122e0565b9050611847611882565b6118508261234a565b611859856123d0565b60405160200161186b93929190613a97565b604051602081830303815290604052915050919050565b6060604051806060016040528060308152602001614c8460309139905090565b60606040518060600160405280603a8152602001614c4a603a9139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61195e611da5565b73ffffffffffffffffffffffffffffffffffffffff1661197c6111eb565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990613dc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613c06565b60405180910390fd5b611a4b816121be565b50565b6002600a541415611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90613ea6565b60405180910390fd5b6002600a8190555034600e541115611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad890613ca6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611b539190613ec6565b60206040518083038186803b158015611b6b57600080fd5b505afa158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba3919061336c565b73ffffffffffffffffffffffffffffffffffffffff1614611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf090613cc6565b60405180910390fd5b611c0281611d39565b15611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3990613d06565b60405180910390fd5b611c4c33826121a0565b6001600a8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d2257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d325750611d3182612531565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e2083610d76565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7182611d39565b611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790613ce6565b60405180910390fd5b6000611ebb83610d76565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f2a57508373ffffffffffffffffffffffffffffffffffffffff16611f128461084c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f3b5750611f3a81856118c2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6482610d76565b73ffffffffffffffffffffffffffffffffffffffff1614611fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb190613e06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561202a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202190613c66565b60405180910390fd5b61203583838361259b565b612040600082611dad565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461209091906141f8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e79190613fa6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6121ba8282604051806020016040528060008152506126af565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61228f848484611f44565b61229b8484848461270a565b6122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d190613be6565b60405180910390fd5b50505050565b6000806000905060005b600781101561234057601081612300919061419e565b600261230c9190614080565b61231685836128a1565b612320919061419e565b8261232b9190613fa6565b915080806123389061436f565b9150506122ea565b5080915050919050565b60606000821415612392576040518060400160405280600481526020017f307830300000000000000000000000000000000000000000000000000000000081525090506123cb565b600082905060005b600082146123bc5780806123ad9061436f565b915050600882901c915061239a565b6123c684826128f7565b925050505b919050565b60606000821415612418576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061252c565b600082905060005b6000821461244a5780806124339061436f565b915050600a826124439190613ffc565b9150612420565b60008167ffffffffffffffff811115612466576124656144d4565b5b6040519080825280601f01601f1916602001820160405280156124985781602001600182028036833780820191505090505b5090505b60008514612525576001826124b191906141f8565b9150600a856124c091906143b8565b60306124cc9190613fa6565b60f81b8183815181106124e2576124e16144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561251e9190613ffc565b945061249c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125a6838383612b33565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125e9576125e481612b38565b612628565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612627576126268382612b81565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561266b5761266681612cee565b6126aa565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126a9576126a88282612dbf565b5b5b505050565b6126b98383612e3e565b6126c6600084848461270a565b612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90613be6565b60405180910390fd5b505050565b600061272b8473ffffffffffffffffffffffffffffffffffffffff1661300c565b15612894578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612754611da5565b8786866040518563ffffffff1660e01b81526004016127769493929190613b1d565b602060405180830381600087803b15801561279057600080fd5b505af19250505080156127c157506040513d601f19601f820116820180604052508101906127be91906135a5565b60015b612844573d80600081146127f1576040519150601f19603f3d011682016040523d82523d6000602084013e6127f6565b606091505b5060008151141561283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390613be6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612899565b600190505b949350505050565b6000806128de6128b08561301f565b6128b98561301f565b6040516020016128ca929190613ad3565b604051602081830303815290604052613180565b905061019a816128ee91906143b8565b91505092915050565b60606000600283600261290a919061419e565b6129149190613fa6565b67ffffffffffffffff81111561292d5761292c6144d4565b5b6040519080825280601f01601f19166020018201604052801561295f5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612997576129966144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106129fb576129fa6144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a3b919061419e565b612a459190613fa6565b90505b6001811115612ae5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a8757612a866144a5565b5b1a60f81b828281518110612a9e57612a9d6144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612ade906142e2565b9050612a48565b5060008414612b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2090613ba6565b60405180910390fd5b8091505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b8e846110ab565b612b9891906141f8565b9050600060076000848152602001908152602001600020549050818114612c7d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d0291906141f8565b9050600060096000848152602001908152602001600020549050600060088381548110612d3257612d316144a5565b5b906000526020600020015490508060088381548110612d5457612d536144a5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612da357612da2614476565b5b6001900381819060005260206000200160009055905550505050565b6000612dca836110ab565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea590613d86565b60405180910390fd5b612eb781611d39565b15612ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eee90613c26565b60405180910390fd5b612f036000838361259b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f539190613fa6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415613067576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061317b565b600082905060005b600082146130995780806130829061436f565b915050600a826130929190613ffc565b915061306f565b60008167ffffffffffffffff8111156130b5576130b46144d4565b5b6040519080825280601f01601f1916602001820160405280156130e75781602001600182028036833780820191505090505b5090505b600085146131745760018261310091906141f8565b9150600a8561310f91906143b8565b603061311b9190613fa6565b60f81b818381518110613131576131306144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561316d9190613ffc565b94506130eb565b8093505050505b919050565b6000816040516020016131939190613a80565b6040516020818303038152906040528051906020012060001c9050919050565b60006131c66131c184613f06565b613ee1565b905080838252602082019050828560208602820111156131e9576131e8614508565b5b60005b8581101561321957816131ff888261332a565b8452602084019350602083019250506001810190506131ec565b5050509392505050565b600061323661323184613f32565b613ee1565b9050828152602081018484840111156132525761325161450d565b5b61325d8482856142a0565b509392505050565b60008135905061327481614bed565b92915050565b60008151905061328981614bed565b92915050565b600082601f8301126132a4576132a3614503565b5b81356132b48482602086016131b3565b91505092915050565b6000813590506132cc81614c04565b92915050565b6000813590506132e181614c1b565b92915050565b6000815190506132f681614c1b565b92915050565b600082601f83011261331157613310614503565b5b8135613321848260208601613223565b91505092915050565b60008135905061333981614c32565b92915050565b60006020828403121561335557613354614517565b5b600061336384828501613265565b91505092915050565b60006020828403121561338257613381614517565b5b60006133908482850161327a565b91505092915050565b600080604083850312156133b0576133af614517565b5b60006133be85828601613265565b92505060206133cf85828601613265565b9150509250929050565b6000806000606084860312156133f2576133f1614517565b5b600061340086828701613265565b935050602061341186828701613265565b92505060406134228682870161332a565b9150509250925092565b6000806000806080858703121561344657613445614517565b5b600061345487828801613265565b945050602061346587828801613265565b93505060406134768782880161332a565b925050606085013567ffffffffffffffff81111561349757613496614512565b5b6134a3878288016132fc565b91505092959194509250565b600080604083850312156134c6576134c5614517565b5b60006134d485828601613265565b92505060206134e5858286016132bd565b9150509250929050565b6000806040838503121561350657613505614517565b5b600061351485828601613265565b92505060206135258582860161332a565b9150509250929050565b60006020828403121561354557613544614517565b5b600082013567ffffffffffffffff81111561356357613562614512565b5b61356f8482850161328f565b91505092915050565b60006020828403121561358e5761358d614517565b5b600061359c848285016132d2565b91505092915050565b6000602082840312156135bb576135ba614517565b5b60006135c9848285016132e7565b91505092915050565b6000602082840312156135e8576135e7614517565b5b60006135f68482850161332a565b91505092915050565b6136088161422c565b82525050565b6136178161423e565b82525050565b600061362882613f63565b6136328185613f79565b93506136428185602086016142af565b61364b8161451c565b840191505092915050565b600061366182613f6e565b61366b8185613f8a565b935061367b8185602086016142af565b6136848161451c565b840191505092915050565b600061369a82613f6e565b6136a48185613f9b565b93506136b48185602086016142af565b80840191505092915050565b60006136cd602083613f8a565b91506136d88261453a565b602082019050919050565b60006136f0602b83613f8a565b91506136fb82614563565b604082019050919050565b6000613713603283613f8a565b915061371e826145b2565b604082019050919050565b6000613736602683613f8a565b915061374182614601565b604082019050919050565b6000613759601c83613f8a565b915061376482614650565b602082019050919050565b600061377c602c83613f8a565b915061378782614679565b604082019050919050565b600061379f602483613f8a565b91506137aa826146c8565b604082019050919050565b60006137c2601983613f8a565b91506137cd82614717565b602082019050919050565b60006137e5601f83613f8a565b91506137f082614740565b602082019050919050565b6000613808601a83613f8a565b915061381382614769565b602082019050919050565b600061382b602c83613f8a565b915061383682614792565b604082019050919050565b600061384e600583613f9b565b9150613859826147e1565b600582019050919050565b6000613871602283613f8a565b915061387c8261480a565b604082019050919050565b6000613894603883613f8a565b915061389f82614859565b604082019050919050565b60006138b7602a83613f8a565b91506138c2826148a8565b604082019050919050565b60006138da602983613f8a565b91506138e5826148f7565b604082019050919050565b60006138fd602083613f8a565b915061390882614946565b602082019050919050565b6000613920602c83613f8a565b915061392b8261496f565b604082019050919050565b6000613943602083613f8a565b915061394e826149be565b602082019050919050565b6000613966601083613f8a565b9150613971826149e7565b602082019050919050565b6000613989602983613f8a565b915061399482614a10565b604082019050919050565b60006139ac602b83613f8a565b91506139b782614a5f565b604082019050919050565b60006139cf602183613f8a565b91506139da82614aae565b604082019050919050565b60006139f2603183613f8a565b91506139fd82614afd565b604082019050919050565b6000613a15602c83613f8a565b9150613a2082614b4c565b604082019050919050565b6000613a38601f83613f8a565b9150613a4382614b9b565b602082019050919050565b6000613a5b600183613f9b565b9150613a6682614bc4565b600182019050919050565b613a7a81614296565b82525050565b6000613a8c828461368f565b915081905092915050565b6000613aa3828661368f565b9150613aaf828561368f565b9150613aba82613a4e565b9150613ac6828461368f565b9150819050949350505050565b6000613ade82613841565b9150613aea828561368f565b9150613af6828461368f565b91508190509392505050565b6000602082019050613b1760008301846135ff565b92915050565b6000608082019050613b3260008301876135ff565b613b3f60208301866135ff565b613b4c6040830185613a71565b8181036060830152613b5e818461361d565b905095945050505050565b6000602082019050613b7e600083018461360e565b92915050565b60006020820190508181036000830152613b9e8184613656565b905092915050565b60006020820190508181036000830152613bbf816136c0565b9050919050565b60006020820190508181036000830152613bdf816136e3565b9050919050565b60006020820190508181036000830152613bff81613706565b9050919050565b60006020820190508181036000830152613c1f81613729565b9050919050565b60006020820190508181036000830152613c3f8161374c565b9050919050565b60006020820190508181036000830152613c5f8161376f565b9050919050565b60006020820190508181036000830152613c7f81613792565b9050919050565b60006020820190508181036000830152613c9f816137b5565b9050919050565b60006020820190508181036000830152613cbf816137d8565b9050919050565b60006020820190508181036000830152613cdf816137fb565b9050919050565b60006020820190508181036000830152613cff8161381e565b9050919050565b60006020820190508181036000830152613d1f81613864565b9050919050565b60006020820190508181036000830152613d3f81613887565b9050919050565b60006020820190508181036000830152613d5f816138aa565b9050919050565b60006020820190508181036000830152613d7f816138cd565b9050919050565b60006020820190508181036000830152613d9f816138f0565b9050919050565b60006020820190508181036000830152613dbf81613913565b9050919050565b60006020820190508181036000830152613ddf81613936565b9050919050565b60006020820190508181036000830152613dff81613959565b9050919050565b60006020820190508181036000830152613e1f8161397c565b9050919050565b60006020820190508181036000830152613e3f8161399f565b9050919050565b60006020820190508181036000830152613e5f816139c2565b9050919050565b60006020820190508181036000830152613e7f816139e5565b9050919050565b60006020820190508181036000830152613e9f81613a08565b9050919050565b60006020820190508181036000830152613ebf81613a2b565b9050919050565b6000602082019050613edb6000830184613a71565b92915050565b6000613eeb613efc565b9050613ef7828261433e565b919050565b6000604051905090565b600067ffffffffffffffff821115613f2157613f206144d4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f4d57613f4c6144d4565b5b613f568261451c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fb182614296565b9150613fbc83614296565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ff157613ff06143e9565b5b828201905092915050565b600061400782614296565b915061401283614296565b92508261402257614021614418565b5b828204905092915050565b6000808291508390505b600185111561407757808604811115614053576140526143e9565b5b60018516156140625780820291505b80810290506140708561452d565b9450614037565b94509492505050565b600061408b82614296565b915061409683614296565b92506140c37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846140cb565b905092915050565b6000826140db5760019050614197565b816140e95760009050614197565b81600181146140ff576002811461410957614138565b6001915050614197565b60ff84111561411b5761411a6143e9565b5b8360020a915084821115614132576141316143e9565b5b50614197565b5060208310610133831016604e8410600b841016171561416d5782820a905083811115614168576141676143e9565b5b614197565b61417a848484600161402d565b92509050818404811115614191576141906143e9565b5b81810290505b9392505050565b60006141a982614296565b91506141b483614296565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141ed576141ec6143e9565b5b828202905092915050565b600061420382614296565b915061420e83614296565b925082821015614221576142206143e9565b5b828203905092915050565b600061423782614276565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142cd5780820151818401526020810190506142b2565b838111156142dc576000848401525b50505050565b60006142ed82614296565b91506000821415614301576143006143e9565b5b600182039050919050565b6000600282049050600182168061432457607f821691505b6020821081141561433857614337614447565b5b50919050565b6143478261451c565b810181811067ffffffffffffffff82111715614366576143656144d4565b5b80604052505050565b600061437a82614296565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143ad576143ac6143e9565b5b600182019050919050565b60006143c382614296565b91506143ce83614296565b9250826143de576143dd614418565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4f6e65206f6620746865736520746f6b656e73206861766520616c726561647960008201527f206265656e206d696e7465640000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4e6f7420746865206f776e6572206f662074686973206c6f6f74000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5370656c6c000000000000000000000000000000000000000000000000000000600082015250565b7f5468697320746f6b656e2068617320616c7265616479206265656e206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4f6e65206f6620746865736520746f6b656e732068617320616c72656164792060008201527f6265656e206d696e746564000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614bf68161422c565b8114614c0157600080fd5b50565b614c0d8161423e565b8114614c1857600080fd5b50565b614c248161424a565b8114614c2f57600080fd5b50565b614c3b81614296565b8114614c4657600080fd5b5056fe68747470733a2f2f6c6f6f742d7370656c6c732e6865726f6b756170702e636f6d2f636f6e74726163742f6c6f6f742d7370656c6c626f6f6b7368747470733a2f2f6c6f6f742d7370656c6c732e6865726f6b756170702e636f6d2f6170692f7370656c6c626f6f6b2fa2646970667358221220204320d6fad32d508aa75f429fd0bc9fdbf48eb26b64eb83532eea5cfaf0bfaa64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c806370a0823111610102578063b88d4fde11610095578063e8a3d48511610064578063e8a3d48514610693578063e985e9c5146106be578063f2fde38b146106fb578063fd12c96814610724576101d8565b8063b88d4fde146105d9578063c627525514610602578063c87b56dd1461062b578063d547cfb714610668576101d8565b80639a0e4ebb116100d15780639a0e4ebb1461054d578063a0712d6814610569578063a22cb46514610585578063a945bf80146105ae576101d8565b806370a08231146104a3578063715018a6146104e05780638da5cb5b146104f757806395d89b4114610522576101d8565b80632e22de9f1161017a5780634a96974e116101495780634a96974e146103e25780634f6ccce71461040d5780636352211e1461044a57806367fd1a0f14610487576101d8565b80632e22de9f1461032a5780632f745c591461035357806342842e0e14610390578063434f48c4146103b9576101d8565b8063095ea7b3116101b6578063095ea7b3146102825780630e439326146102ab57806318160ddd146102d657806323b872dd14610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613578565b610740565b6040516102119190613b69565b60405180910390f35b34801561022657600080fd5b5061022f6107ba565b60405161023c9190613b84565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906135d2565b61084c565b6040516102799190613b02565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a491906134ef565b6108d1565b005b3480156102b757600080fd5b506102c06109e9565b6040516102cd9190613b02565b60405180910390f35b3480156102e257600080fd5b506102eb610a0f565b6040516102f89190613ec6565b60405180910390f35b34801561030d57600080fd5b50610328600480360381019061032391906133d9565b610a1c565b005b34801561033657600080fd5b50610351600480360381019061034c91906135d2565b610a7c565b005b34801561035f57600080fd5b5061037a600480360381019061037591906134ef565b610b02565b6040516103879190613ec6565b60405180910390f35b34801561039c57600080fd5b506103b760048036038101906103b291906133d9565b610ba7565b005b3480156103c557600080fd5b506103e060048036038101906103db91906135d2565b610bc7565b005b3480156103ee57600080fd5b506103f7610cff565b6040516104049190613ec6565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f91906135d2565b610d05565b6040516104419190613ec6565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c91906135d2565b610d76565b60405161047e9190613b02565b60405180910390f35b6104a1600480360381019061049c919061352f565b610e28565b005b3480156104af57600080fd5b506104ca60048036038101906104c5919061333f565b6110ab565b6040516104d79190613ec6565b60405180910390f35b3480156104ec57600080fd5b506104f5611163565b005b34801561050357600080fd5b5061050c6111eb565b6040516105199190613b02565b60405180910390f35b34801561052e57600080fd5b50610537611215565b6040516105449190613b84565b60405180910390f35b6105676004803603810190610562919061352f565b6112a7565b005b610583600480360381019061057e91906135d2565b61147e565b005b34801561059157600080fd5b506105ac60048036038101906105a791906134af565b6115c1565b005b3480156105ba57600080fd5b506105c3611742565b6040516105d09190613ec6565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb919061342c565b611748565b005b34801561060e57600080fd5b50610629600480360381019061062491906135d2565b6117aa565b005b34801561063757600080fd5b50610652600480360381019061064d91906135d2565b611830565b60405161065f9190613b84565b60405180910390f35b34801561067457600080fd5b5061067d611882565b60405161068a9190613b84565b60405180910390f35b34801561069f57600080fd5b506106a86118a2565b6040516106b59190613b84565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e09190613399565b6118c2565b6040516106f29190613b69565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d919061333f565b611956565b005b61073e600480360381019061073991906135d2565b611a4e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b357506107b282611c57565b5b9050919050565b6060600080546107c99061430c565b80601f01602080910402602001604051908101604052809291908181526020018280546107f59061430c565b80156108425780601f1061081757610100808354040283529160200191610842565b820191906000526020600020905b81548152906001019060200180831161082557829003601f168201915b5050505050905090565b600061085782611d39565b610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d90613da6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108dc82610d76565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094490613e46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096c611da5565b73ffffffffffffffffffffffffffffffffffffffff16148061099b575061099a81610995611da5565b6118c2565b5b6109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d190613d26565b60405180910390fd5b6109e48383611dad565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b610a2d610a27611da5565b82611e66565b610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390613e66565b60405180910390fd5b610a77838383611f44565b505050565b610a84611da5565b73ffffffffffffffffffffffffffffffffffffffff16610aa26111eb565b73ffffffffffffffffffffffffffffffffffffffff1614610af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aef90613dc6565b60405180910390fd5b80600e8190555050565b6000610b0d836110ab565b8210610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590613bc6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bc283838360405180602001604052806000815250611748565b505050565b6002600a541415610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0490613ea6565b60405180910390fd5b6002600a81905550610c1d611da5565b73ffffffffffffffffffffffffffffffffffffffff16610c3b6111eb565b73ffffffffffffffffffffffffffffffffffffffff1614610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890613dc6565b60405180910390fd5b612ee081118015610ca45750612f448111155b610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90613de6565b60405180910390fd5b610cf4610cee6111eb565b826121a0565b6001600a8190555050565b600e5481565b6000610d0f610a0f565b8210610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790613e86565b60405180910390fd5b60088281548110610d6457610d636144a5565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1690613d66565b60405180910390fd5b80915050919050565b6002600a541415610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590613ea6565b60405180910390fd5b6002600a81905550348151600e54610e86919061419e565b1115610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe90613ca6565b60405180910390fd5b60005b815181101561109f573373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610f3b57610f3a6144a5565b5b60200260200101516040518263ffffffff1660e01b8152600401610f5f9190613ec6565b60206040518083038186803b158015610f7757600080fd5b505afa158015610f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faf919061336c565b73ffffffffffffffffffffffffffffffffffffffff1614611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90613cc6565b60405180910390fd5b61102882828151811061101b5761101a6144a5565b5b6020026020010151611d39565b15611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90613e26565b60405180910390fd5b61108c3383838151811061107f5761107e6144a5565b5b60200260200101516121a0565b80806110979061436f565b915050610eca565b506001600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613d46565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61116b611da5565b73ffffffffffffffffffffffffffffffffffffffff166111896111eb565b73ffffffffffffffffffffffffffffffffffffffff16146111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d690613dc6565b60405180910390fd5b6111e960006121be565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112249061430c565b80601f01602080910402602001604051908101604052809291908181526020018280546112509061430c565b801561129d5780601f106112725761010080835404028352916020019161129d565b820191906000526020600020905b81548152906001019060200180831161128057829003601f168201915b5050505050905090565b6002600a5414156112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613ea6565b60405180910390fd5b6002600a81905550348151600f54611305919061419e565b1115611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d90613ca6565b60405180910390fd5b60005b815181101561147257611f40828281518110611368576113676144a5565b5b60200260200101511180156113995750612ee082828151811061138e5761138d6144a5565b5b602002602001015111155b6113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613de6565b60405180910390fd5b6113fb8282815181106113ee576113ed6144a5565b5b6020026020010151611d39565b1561143b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143290613c46565b60405180910390fd5b61145f33838381518110611452576114516144a5565b5b60200260200101516121a0565b808061146a9061436f565b915050611349565b506001600a8190555050565b6002600a5414156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb90613ea6565b60405180910390fd5b6002600a8190555034600f541115611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890613ca6565b60405180910390fd5b611f40811180156115245750612ee08111155b611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a90613de6565b60405180910390fd5b61156c81611d39565b156115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390613d06565b60405180910390fd5b6115b633826121a0565b6001600a8190555050565b6115c9611da5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90613c86565b60405180910390fd5b8060056000611644611da5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116f1611da5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117369190613b69565b60405180910390a35050565b600f5481565b611759611753611da5565b83611e66565b611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90613e66565b60405180910390fd5b6117a484848484612284565b50505050565b6117b2611da5565b73ffffffffffffffffffffffffffffffffffffffff166117d06111eb565b73ffffffffffffffffffffffffffffffffffffffff1614611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d90613dc6565b60405180910390fd5b80600f8190555050565b6060600061183d836122e0565b9050611847611882565b6118508261234a565b611859856123d0565b60405160200161186b93929190613a97565b604051602081830303815290604052915050919050565b6060604051806060016040528060308152602001614c8460309139905090565b60606040518060600160405280603a8152602001614c4a603a9139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61195e611da5565b73ffffffffffffffffffffffffffffffffffffffff1661197c6111eb565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990613dc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613c06565b60405180910390fd5b611a4b816121be565b50565b6002600a541415611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90613ea6565b60405180910390fd5b6002600a8190555034600e541115611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad890613ca6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611b539190613ec6565b60206040518083038186803b158015611b6b57600080fd5b505afa158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba3919061336c565b73ffffffffffffffffffffffffffffffffffffffff1614611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf090613cc6565b60405180910390fd5b611c0281611d39565b15611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3990613d06565b60405180910390fd5b611c4c33826121a0565b6001600a8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d2257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d325750611d3182612531565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e2083610d76565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7182611d39565b611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790613ce6565b60405180910390fd5b6000611ebb83610d76565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f2a57508373ffffffffffffffffffffffffffffffffffffffff16611f128461084c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f3b5750611f3a81856118c2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f6482610d76565b73ffffffffffffffffffffffffffffffffffffffff1614611fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb190613e06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561202a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202190613c66565b60405180910390fd5b61203583838361259b565b612040600082611dad565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461209091906141f8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e79190613fa6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6121ba8282604051806020016040528060008152506126af565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61228f848484611f44565b61229b8484848461270a565b6122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d190613be6565b60405180910390fd5b50505050565b6000806000905060005b600781101561234057601081612300919061419e565b600261230c9190614080565b61231685836128a1565b612320919061419e565b8261232b9190613fa6565b915080806123389061436f565b9150506122ea565b5080915050919050565b60606000821415612392576040518060400160405280600481526020017f307830300000000000000000000000000000000000000000000000000000000081525090506123cb565b600082905060005b600082146123bc5780806123ad9061436f565b915050600882901c915061239a565b6123c684826128f7565b925050505b919050565b60606000821415612418576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061252c565b600082905060005b6000821461244a5780806124339061436f565b915050600a826124439190613ffc565b9150612420565b60008167ffffffffffffffff811115612466576124656144d4565b5b6040519080825280601f01601f1916602001820160405280156124985781602001600182028036833780820191505090505b5090505b60008514612525576001826124b191906141f8565b9150600a856124c091906143b8565b60306124cc9190613fa6565b60f81b8183815181106124e2576124e16144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561251e9190613ffc565b945061249c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125a6838383612b33565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125e9576125e481612b38565b612628565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612627576126268382612b81565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561266b5761266681612cee565b6126aa565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126a9576126a88282612dbf565b5b5b505050565b6126b98383612e3e565b6126c6600084848461270a565b612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90613be6565b60405180910390fd5b505050565b600061272b8473ffffffffffffffffffffffffffffffffffffffff1661300c565b15612894578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612754611da5565b8786866040518563ffffffff1660e01b81526004016127769493929190613b1d565b602060405180830381600087803b15801561279057600080fd5b505af19250505080156127c157506040513d601f19601f820116820180604052508101906127be91906135a5565b60015b612844573d80600081146127f1576040519150601f19603f3d011682016040523d82523d6000602084013e6127f6565b606091505b5060008151141561283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390613be6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612899565b600190505b949350505050565b6000806128de6128b08561301f565b6128b98561301f565b6040516020016128ca929190613ad3565b604051602081830303815290604052613180565b905061019a816128ee91906143b8565b91505092915050565b60606000600283600261290a919061419e565b6129149190613fa6565b67ffffffffffffffff81111561292d5761292c6144d4565b5b6040519080825280601f01601f19166020018201604052801561295f5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612997576129966144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106129fb576129fa6144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a3b919061419e565b612a459190613fa6565b90505b6001811115612ae5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a8757612a866144a5565b5b1a60f81b828281518110612a9e57612a9d6144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612ade906142e2565b9050612a48565b5060008414612b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2090613ba6565b60405180910390fd5b8091505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b8e846110ab565b612b9891906141f8565b9050600060076000848152602001908152602001600020549050818114612c7d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d0291906141f8565b9050600060096000848152602001908152602001600020549050600060088381548110612d3257612d316144a5565b5b906000526020600020015490508060088381548110612d5457612d536144a5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612da357612da2614476565b5b6001900381819060005260206000200160009055905550505050565b6000612dca836110ab565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea590613d86565b60405180910390fd5b612eb781611d39565b15612ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eee90613c26565b60405180910390fd5b612f036000838361259b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f539190613fa6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415613067576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061317b565b600082905060005b600082146130995780806130829061436f565b915050600a826130929190613ffc565b915061306f565b60008167ffffffffffffffff8111156130b5576130b46144d4565b5b6040519080825280601f01601f1916602001820160405280156130e75781602001600182028036833780820191505090505b5090505b600085146131745760018261310091906141f8565b9150600a8561310f91906143b8565b603061311b9190613fa6565b60f81b818381518110613131576131306144a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561316d9190613ffc565b94506130eb565b8093505050505b919050565b6000816040516020016131939190613a80565b6040516020818303038152906040528051906020012060001c9050919050565b60006131c66131c184613f06565b613ee1565b905080838252602082019050828560208602820111156131e9576131e8614508565b5b60005b8581101561321957816131ff888261332a565b8452602084019350602083019250506001810190506131ec565b5050509392505050565b600061323661323184613f32565b613ee1565b9050828152602081018484840111156132525761325161450d565b5b61325d8482856142a0565b509392505050565b60008135905061327481614bed565b92915050565b60008151905061328981614bed565b92915050565b600082601f8301126132a4576132a3614503565b5b81356132b48482602086016131b3565b91505092915050565b6000813590506132cc81614c04565b92915050565b6000813590506132e181614c1b565b92915050565b6000815190506132f681614c1b565b92915050565b600082601f83011261331157613310614503565b5b8135613321848260208601613223565b91505092915050565b60008135905061333981614c32565b92915050565b60006020828403121561335557613354614517565b5b600061336384828501613265565b91505092915050565b60006020828403121561338257613381614517565b5b60006133908482850161327a565b91505092915050565b600080604083850312156133b0576133af614517565b5b60006133be85828601613265565b92505060206133cf85828601613265565b9150509250929050565b6000806000606084860312156133f2576133f1614517565b5b600061340086828701613265565b935050602061341186828701613265565b92505060406134228682870161332a565b9150509250925092565b6000806000806080858703121561344657613445614517565b5b600061345487828801613265565b945050602061346587828801613265565b93505060406134768782880161332a565b925050606085013567ffffffffffffffff81111561349757613496614512565b5b6134a3878288016132fc565b91505092959194509250565b600080604083850312156134c6576134c5614517565b5b60006134d485828601613265565b92505060206134e5858286016132bd565b9150509250929050565b6000806040838503121561350657613505614517565b5b600061351485828601613265565b92505060206135258582860161332a565b9150509250929050565b60006020828403121561354557613544614517565b5b600082013567ffffffffffffffff81111561356357613562614512565b5b61356f8482850161328f565b91505092915050565b60006020828403121561358e5761358d614517565b5b600061359c848285016132d2565b91505092915050565b6000602082840312156135bb576135ba614517565b5b60006135c9848285016132e7565b91505092915050565b6000602082840312156135e8576135e7614517565b5b60006135f68482850161332a565b91505092915050565b6136088161422c565b82525050565b6136178161423e565b82525050565b600061362882613f63565b6136328185613f79565b93506136428185602086016142af565b61364b8161451c565b840191505092915050565b600061366182613f6e565b61366b8185613f8a565b935061367b8185602086016142af565b6136848161451c565b840191505092915050565b600061369a82613f6e565b6136a48185613f9b565b93506136b48185602086016142af565b80840191505092915050565b60006136cd602083613f8a565b91506136d88261453a565b602082019050919050565b60006136f0602b83613f8a565b91506136fb82614563565b604082019050919050565b6000613713603283613f8a565b915061371e826145b2565b604082019050919050565b6000613736602683613f8a565b915061374182614601565b604082019050919050565b6000613759601c83613f8a565b915061376482614650565b602082019050919050565b600061377c602c83613f8a565b915061378782614679565b604082019050919050565b600061379f602483613f8a565b91506137aa826146c8565b604082019050919050565b60006137c2601983613f8a565b91506137cd82614717565b602082019050919050565b60006137e5601f83613f8a565b91506137f082614740565b602082019050919050565b6000613808601a83613f8a565b915061381382614769565b602082019050919050565b600061382b602c83613f8a565b915061383682614792565b604082019050919050565b600061384e600583613f9b565b9150613859826147e1565b600582019050919050565b6000613871602283613f8a565b915061387c8261480a565b604082019050919050565b6000613894603883613f8a565b915061389f82614859565b604082019050919050565b60006138b7602a83613f8a565b91506138c2826148a8565b604082019050919050565b60006138da602983613f8a565b91506138e5826148f7565b604082019050919050565b60006138fd602083613f8a565b915061390882614946565b602082019050919050565b6000613920602c83613f8a565b915061392b8261496f565b604082019050919050565b6000613943602083613f8a565b915061394e826149be565b602082019050919050565b6000613966601083613f8a565b9150613971826149e7565b602082019050919050565b6000613989602983613f8a565b915061399482614a10565b604082019050919050565b60006139ac602b83613f8a565b91506139b782614a5f565b604082019050919050565b60006139cf602183613f8a565b91506139da82614aae565b604082019050919050565b60006139f2603183613f8a565b91506139fd82614afd565b604082019050919050565b6000613a15602c83613f8a565b9150613a2082614b4c565b604082019050919050565b6000613a38601f83613f8a565b9150613a4382614b9b565b602082019050919050565b6000613a5b600183613f9b565b9150613a6682614bc4565b600182019050919050565b613a7a81614296565b82525050565b6000613a8c828461368f565b915081905092915050565b6000613aa3828661368f565b9150613aaf828561368f565b9150613aba82613a4e565b9150613ac6828461368f565b9150819050949350505050565b6000613ade82613841565b9150613aea828561368f565b9150613af6828461368f565b91508190509392505050565b6000602082019050613b1760008301846135ff565b92915050565b6000608082019050613b3260008301876135ff565b613b3f60208301866135ff565b613b4c6040830185613a71565b8181036060830152613b5e818461361d565b905095945050505050565b6000602082019050613b7e600083018461360e565b92915050565b60006020820190508181036000830152613b9e8184613656565b905092915050565b60006020820190508181036000830152613bbf816136c0565b9050919050565b60006020820190508181036000830152613bdf816136e3565b9050919050565b60006020820190508181036000830152613bff81613706565b9050919050565b60006020820190508181036000830152613c1f81613729565b9050919050565b60006020820190508181036000830152613c3f8161374c565b9050919050565b60006020820190508181036000830152613c5f8161376f565b9050919050565b60006020820190508181036000830152613c7f81613792565b9050919050565b60006020820190508181036000830152613c9f816137b5565b9050919050565b60006020820190508181036000830152613cbf816137d8565b9050919050565b60006020820190508181036000830152613cdf816137fb565b9050919050565b60006020820190508181036000830152613cff8161381e565b9050919050565b60006020820190508181036000830152613d1f81613864565b9050919050565b60006020820190508181036000830152613d3f81613887565b9050919050565b60006020820190508181036000830152613d5f816138aa565b9050919050565b60006020820190508181036000830152613d7f816138cd565b9050919050565b60006020820190508181036000830152613d9f816138f0565b9050919050565b60006020820190508181036000830152613dbf81613913565b9050919050565b60006020820190508181036000830152613ddf81613936565b9050919050565b60006020820190508181036000830152613dff81613959565b9050919050565b60006020820190508181036000830152613e1f8161397c565b9050919050565b60006020820190508181036000830152613e3f8161399f565b9050919050565b60006020820190508181036000830152613e5f816139c2565b9050919050565b60006020820190508181036000830152613e7f816139e5565b9050919050565b60006020820190508181036000830152613e9f81613a08565b9050919050565b60006020820190508181036000830152613ebf81613a2b565b9050919050565b6000602082019050613edb6000830184613a71565b92915050565b6000613eeb613efc565b9050613ef7828261433e565b919050565b6000604051905090565b600067ffffffffffffffff821115613f2157613f206144d4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f4d57613f4c6144d4565b5b613f568261451c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fb182614296565b9150613fbc83614296565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ff157613ff06143e9565b5b828201905092915050565b600061400782614296565b915061401283614296565b92508261402257614021614418565b5b828204905092915050565b6000808291508390505b600185111561407757808604811115614053576140526143e9565b5b60018516156140625780820291505b80810290506140708561452d565b9450614037565b94509492505050565b600061408b82614296565b915061409683614296565b92506140c37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846140cb565b905092915050565b6000826140db5760019050614197565b816140e95760009050614197565b81600181146140ff576002811461410957614138565b6001915050614197565b60ff84111561411b5761411a6143e9565b5b8360020a915084821115614132576141316143e9565b5b50614197565b5060208310610133831016604e8410600b841016171561416d5782820a905083811115614168576141676143e9565b5b614197565b61417a848484600161402d565b92509050818404811115614191576141906143e9565b5b81810290505b9392505050565b60006141a982614296565b91506141b483614296565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141ed576141ec6143e9565b5b828202905092915050565b600061420382614296565b915061420e83614296565b925082821015614221576142206143e9565b5b828203905092915050565b600061423782614276565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142cd5780820151818401526020810190506142b2565b838111156142dc576000848401525b50505050565b60006142ed82614296565b91506000821415614301576143006143e9565b5b600182039050919050565b6000600282049050600182168061432457607f821691505b6020821081141561433857614337614447565b5b50919050565b6143478261451c565b810181811067ffffffffffffffff82111715614366576143656144d4565b5b80604052505050565b600061437a82614296565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143ad576143ac6143e9565b5b600182019050919050565b60006143c382614296565b91506143ce83614296565b9250826143de576143dd614418565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4f6e65206f6620746865736520746f6b656e73206861766520616c726561647960008201527f206265656e206d696e7465640000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4e6f7420746865206f776e6572206f662074686973206c6f6f74000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5370656c6c000000000000000000000000000000000000000000000000000000600082015250565b7f5468697320746f6b656e2068617320616c7265616479206265656e206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4f6e65206f6620746865736520746f6b656e732068617320616c72656164792060008201527f6265656e206d696e746564000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614bf68161422c565b8114614c0157600080fd5b50565b614c0d8161423e565b8114614c1857600080fd5b50565b614c248161424a565b8114614c2f57600080fd5b50565b614c3b81614296565b8114614c4657600080fd5b5056fe68747470733a2f2f6c6f6f742d7370656c6c732e6865726f6b756170702e636f6d2f636f6e74726163742f6c6f6f742d7370656c6c626f6f6b7368747470733a2f2f6c6f6f742d7370656c6c732e6865726f6b756170702e636f6d2f6170692f7370656c6c626f6f6b2fa2646970667358221220204320d6fad32d508aa75f429fd0bc9fdbf48eb26b64eb83532eea5cfaf0bfaa64736f6c63430008070033

Deployed Bytecode Sourcemap

44598:4615:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38340:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25454:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27013:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26536:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44676:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38980:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27903:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48183:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38648:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28313:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47983:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44822:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39170:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25148:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46626:504;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24878:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9846:94;;;;;;;;;;;;;:::i;:::-;;9195:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25623:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47501:470;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47165:330;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27306:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44887:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28569:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48293:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45938:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45794:136;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44958:145;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27672:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10095:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46261:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38340:224;38442:4;38481:35;38466:50;;;:11;:50;;;;:90;;;;38520:36;38544:11;38520:23;:36::i;:::-;38466:90;38459:97;;38340:224;;;:::o;25454:100::-;25508:13;25541:5;25534:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25454:100;:::o;27013:221::-;27089:7;27117:16;27125:7;27117;:16::i;:::-;27109:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27202:15;:24;27218:7;27202:24;;;;;;;;;;;;;;;;;;;;;27195:31;;27013:221;;;:::o;26536:411::-;26617:13;26633:23;26648:7;26633:14;:23::i;:::-;26617:39;;26681:5;26675:11;;:2;:11;;;;26667:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26775:5;26759:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26784:37;26801:5;26808:12;:10;:12::i;:::-;26784:16;:37::i;:::-;26759:62;26737:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26918:21;26927:2;26931:7;26918:8;:21::i;:::-;26606:341;26536:411;;:::o;44676:71::-;;;;;;;;;;;;;:::o;38980:113::-;39041:7;39068:10;:17;;;;39061:24;;38980:113;:::o;27903:339::-;28098:41;28117:12;:10;:12::i;:::-;28131:7;28098:18;:41::i;:::-;28090:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28206:28;28216:4;28222:2;28226:7;28206:9;:28::i;:::-;27903:339;;;:::o;48183:102::-;9426:12;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48269:8:::1;48254:12;:23;;;;48183:102:::0;:::o;38648:256::-;38745:7;38781:23;38798:5;38781:16;:23::i;:::-;38773:5;:31;38765:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38870:12;:19;38883:5;38870:19;;;;;;;;;;;;;;;:26;38890:5;38870:26;;;;;;;;;;;;38863:33;;38648:256;;;;:::o;28313:185::-;28451:39;28468:4;28474:2;28478:7;28451:39;;;;;;;;;;;;:16;:39::i;:::-;28313:185;;;:::o;47983:188::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;9426:12:::1;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48079:5:::2;48069:7;:15;:35;;;;;48099:5;48088:7;:16;;48069:35;48061:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48136:27;48146:7;:5;:7::i;:::-;48155;48136:9;:27::i;:::-;12090:1:::0;13042:7;:22;;;;47983:188;:::o;44822:47::-;;;;:::o;39170:233::-;39245:7;39281:30;:28;:30::i;:::-;39273:5;:38;39265:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39378:10;39389:5;39378:17;;;;;;;;:::i;:::-;;;;;;;;;;39371:24;;39170:233;;;:::o;25148:239::-;25220:7;25240:13;25256:7;:16;25264:7;25256:16;;;;;;;;;;;;;;;;;;;;;25240:32;;25308:1;25291:19;;:5;:19;;;;25283:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25374:5;25367:12;;;25148:239;;;:::o;46626:504::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;46758:9:::1;46739:7;:14;46724:12;;:29;;;;:::i;:::-;46723:44;;46715:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;46829:6;46824:289;46841:7;:14;46839:1;:16;46824:289;;;46921:10;46885:46;;:12;;;;;;;;;;;:20;;;46906:7;46914:1;46906:10;;;;;;;;:::i;:::-;;;;;;;;46885:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;46877:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;46986:19;46994:7;47002:1;46994:10;;;;;;;;:::i;:::-;;;;;;;;46986:7;:19::i;:::-;46985:20;46977:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47068:33;47078:10;47090:7;47098:1;47090:10;;;;;;;;:::i;:::-;;;;;;;;47068:9;:33::i;:::-;46857:3;;;;;:::i;:::-;;;;46824:289;;;;12090:1:::0;13042:7;:22;;;;46626:504;:::o;24878:208::-;24950:7;24995:1;24978:19;;:5;:19;;;;24970:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25062:9;:16;25072:5;25062:16;;;;;;;;;;;;;;;;25055:23;;24878:208;;;:::o;9846:94::-;9426:12;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9911:21:::1;9929:1;9911:9;:21::i;:::-;9846:94::o:0;9195:87::-;9241:7;9268:6;;;;;;;;;;;9261:13;;9195:87;:::o;25623:104::-;25679:13;25712:7;25705:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25623:104;:::o;47501:470::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;47624:9:::1;47605:7;:14;47591:11;;:28;;;;:::i;:::-;47590:43;;47582:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47695:6;47690:274;47707:7;:14;47705:1;:16;47690:274;;;47764:4;47751:7;47759:1;47751:10;;;;;;;;:::i;:::-;;;;;;;;:17;:40;;;;;47786:5;47772:7;47780:1;47772:10;;;;;;;;:::i;:::-;;;;;;;;:19;;47751:40;47743:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47836:19;47844:7;47852:1;47844:10;;;;;;;;:::i;:::-;;;;;;;;47836:7;:19::i;:::-;47835:20;47827:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;47919:33;47929:10;47941:7;47949:1;47941:10;;;;;;;;:::i;:::-;;;;;;;;47919:9;:33::i;:::-;47723:3;;;;;:::i;:::-;;;;47690:274;;;;12090:1:::0;13042:7;:22;;;;47501:470;:::o;47165:330::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;47254:9:::1;47239:11;;:24;;47231:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47327:4;47318:6;:13;:32;;;;;47345:5;47335:6;:15;;47318:32;47310:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47391:15;47399:6;47391:7;:15::i;:::-;47390:16;47382:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47458:29;47468:10;47480:6;47458:9;:29::i;:::-;12090:1:::0;13042:7;:22;;;;47165:330;:::o;27306:295::-;27421:12;:10;:12::i;:::-;27409:24;;:8;:24;;;;27401:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27521:8;27476:18;:32;27495:12;:10;:12::i;:::-;27476:32;;;;;;;;;;;;;;;:42;27509:8;27476:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27574:8;27545:48;;27560:12;:10;:12::i;:::-;27545:48;;;27584:8;27545:48;;;;;;:::i;:::-;;;;;;;;27306:295;;:::o;44887:47::-;;;;:::o;28569:328::-;28744:41;28763:12;:10;:12::i;:::-;28777:7;28744:18;:41::i;:::-;28736:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28850:39;28864:4;28870:2;28874:7;28883:5;28850:13;:39::i;:::-;28569:328;;;;:::o;48293:100::-;9426:12;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48377:8:::1;48363:11;:22;;;;48293:100:::0;:::o;45938:260::-;46004:13;46030:12;46045:27;46063:8;46045:17;:27::i;:::-;46030:42;;46114:14;:12;:14::i;:::-;46130:25;46150:4;46130:19;:25::i;:::-;46162:26;46179:8;46162:16;:26::i;:::-;46097:92;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46083:107;;;45938:260;;;:::o;45794:136::-;45839:13;45865:57;;;;;;;;;;;;;;;;;;;45794:136;:::o;44958:145::-;45002:13;45028:67;;;;;;;;;;;;;;;;;;;44958:145;:::o;27672:164::-;27769:4;27793:18;:25;27812:5;27793:25;;;;;;;;;;;;;;;:35;27819:8;27793:35;;;;;;;;;;;;;;;;;;;;;;;;;27786:42;;27672:164;;;;:::o;10095:192::-;9426:12;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10204:1:::1;10184:22;;:8;:22;;;;10176:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10260:19;10270:8;10260:9;:19::i;:::-;10095:192:::0;:::o;46261:359::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;46359:9:::1;46343:12;;:25;;46335:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;46455:10;46423:42;;:12;;;;;;;;;;;:20;;;46444:6;46423:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;46415:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46516:15;46524:6;46516:7;:15::i;:::-;46515:16;46507:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46583:29;46593:10;46605:6;46583:9;:29::i;:::-;12090:1:::0;13042:7;:22;;;;46261:359;:::o;24509:305::-;24611:4;24663:25;24648:40;;;:11;:40;;;;:105;;;;24720:33;24705:48;;;:11;:48;;;;24648:105;:158;;;;24770:36;24794:11;24770:23;:36::i;:::-;24648:158;24628:178;;24509:305;;;:::o;30407:127::-;30472:4;30524:1;30496:30;;:7;:16;30504:7;30496:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30489:37;;30407:127;;;:::o;8055:98::-;8108:7;8135:10;8128:17;;8055:98;:::o;34389:174::-;34491:2;34464:15;:24;34480:7;34464:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34547:7;34543:2;34509:46;;34518:23;34533:7;34518:14;:23::i;:::-;34509:46;;;;;;;;;;;;34389:174;;:::o;30701:348::-;30794:4;30819:16;30827:7;30819;:16::i;:::-;30811:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30895:13;30911:23;30926:7;30911:14;:23::i;:::-;30895:39;;30964:5;30953:16;;:7;:16;;;:51;;;;30997:7;30973:31;;:20;30985:7;30973:11;:20::i;:::-;:31;;;30953:51;:87;;;;31008:32;31025:5;31032:7;31008:16;:32::i;:::-;30953:87;30945:96;;;30701:348;;;;:::o;33693:578::-;33852:4;33825:31;;:23;33840:7;33825:14;:23::i;:::-;:31;;;33817:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33935:1;33921:16;;:2;:16;;;;33913:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33991:39;34012:4;34018:2;34022:7;33991:20;:39::i;:::-;34095:29;34112:1;34116:7;34095:8;:29::i;:::-;34156:1;34137:9;:15;34147:4;34137:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34185:1;34168:9;:13;34178:2;34168:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34216:2;34197:7;:16;34205:7;34197:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34255:7;34251:2;34236:27;;34245:4;34236:27;;;;;;;;;;;;33693:578;;;:::o;31391:110::-;31467:26;31477:2;31481:7;31467:26;;;;;;;;;;;;:9;:26::i;:::-;31391:110;;:::o;10295:173::-;10351:16;10370:6;;;;;;;;;;;10351:25;;10396:8;10387:6;;:17;;;;;;;;;;;;;;;;;;10451:8;10420:40;;10441:8;10420:40;;;;;;;;;;;;10340:128;10295:173;:::o;29779:315::-;29936:28;29946:4;29952:2;29956:7;29936:9;:28::i;:::-;29983:48;30006:4;30012:2;30016:7;30025:5;29983:22;:48::i;:::-;29975:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29779:315;;;;:::o;45539:243::-;45606:7;45626:12;45641:1;45626:16;;45659:6;45654:99;45671:1;45669;:3;45654:99;;;45738:2;45736:1;:4;;;;:::i;:::-;45730:1;:11;;;;:::i;:::-;45702:25;45716:7;45725:1;45702:13;:25::i;:::-;:39;;;;:::i;:::-;45694:47;;;;;:::i;:::-;;;45674:3;;;;;:::i;:::-;;;;45654:99;;;;45770:4;45763:11;;;45539:243;;;:::o;6584:340::-;6643:13;6682:1;6673:5;:10;6669:56;;;6700:13;;;;;;;;;;;;;;;;;;;;;6669:56;6735:12;6750:5;6735:20;;6766:14;6795:78;6810:1;6802:4;:9;6795:78;;6828:8;;;;;:::i;:::-;;;;6860:1;6851:10;;;;;6795:78;;;6890:26;6902:5;6909:6;6890:11;:26::i;:::-;6883:33;;;;6584:340;;;;:::o;5751:723::-;5807:13;6037:1;6028:5;:10;6024:53;;;6055:10;;;;;;;;;;;;;;;;;;;;;6024:53;6087:12;6102:5;6087:20;;6118:14;6143:78;6158:1;6150:4;:9;6143:78;;6176:8;;;;;:::i;:::-;;;;6207:2;6199:10;;;;;:::i;:::-;;;6143:78;;;6231:19;6263:6;6253:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6231:39;;6281:154;6297:1;6288:5;:10;6281:154;;6325:1;6315:11;;;;;:::i;:::-;;;6392:2;6384:5;:10;;;;:::i;:::-;6371:2;:24;;;;:::i;:::-;6358:39;;6341:6;6348;6341:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6421:2;6412:11;;;;;:::i;:::-;;;6281:154;;;6459:6;6445:21;;;;;5751:723;;;;:::o;23116:157::-;23201:4;23240:25;23225:40;;;:11;:40;;;;23218:47;;23116:157;;;:::o;40016:589::-;40160:45;40187:4;40193:2;40197:7;40160:26;:45::i;:::-;40238:1;40222:18;;:4;:18;;;40218:187;;;40257:40;40289:7;40257:31;:40::i;:::-;40218:187;;;40327:2;40319:10;;:4;:10;;;40315:90;;40346:47;40379:4;40385:7;40346:32;:47::i;:::-;40315:90;40218:187;40433:1;40419:16;;:2;:16;;;40415:183;;;40452:45;40489:7;40452:36;:45::i;:::-;40415:183;;;40525:4;40519:10;;:2;:10;;;40515:83;;40546:40;40574:2;40578:7;40546:27;:40::i;:::-;40515:83;40415:183;40016:589;;;:::o;31728:321::-;31858:18;31864:2;31868:7;31858:5;:18::i;:::-;31909:54;31940:1;31944:2;31948:7;31957:5;31909:22;:54::i;:::-;31887:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31728:321;;;:::o;35128:803::-;35283:4;35304:15;:2;:13;;;:15::i;:::-;35300:624;;;35356:2;35340:36;;;35377:12;:10;:12::i;:::-;35391:4;35397:7;35406:5;35340:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35336:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35603:1;35586:6;:13;:18;35582:272;;;35629:60;;;;;;;;;;:::i;:::-;;;;;;;;35582:272;35804:6;35798:13;35789:6;35785:2;35781:15;35774:38;35336:533;35473:45;;;35463:55;;;:6;:55;;;;35456:62;;;;;35300:624;35908:4;35901:11;;35128:803;;;;;;;:::o;45299:232::-;45380:7;45400:12;45415:80;45455:17;45464:7;45455:8;:17::i;:::-;45474:18;45483:8;45474;:18::i;:::-;45429:64;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45415:6;:80::i;:::-;45400:95;;45520:3;45513:4;:10;;;;:::i;:::-;45506:17;;;45299:232;;;;:::o;7052:451::-;7127:13;7153:19;7198:1;7189:6;7185:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;7175:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7153:47;;7211:15;:6;7218:1;7211:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;7237;:6;7244:1;7237:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;7268:9;7293:1;7284:6;7280:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;7268:26;;7263:135;7300:1;7296;:5;7263:135;;;7335:12;7356:3;7348:5;:11;7335:25;;;;;;;:::i;:::-;;;;;7323:6;7330:1;7323:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;7385:1;7375:11;;;;;7303:3;;;;:::i;:::-;;;7263:135;;;;7425:1;7416:5;:10;7408:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;7488:6;7474:21;;;7052:451;;;;:::o;36503:126::-;;;;:::o;41328:164::-;41432:10;:17;;;;41405:15;:24;41421:7;41405:24;;;;;;;;;;;:44;;;;41460:10;41476:7;41460:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41328:164;:::o;42119:988::-;42385:22;42435:1;42410:22;42427:4;42410:16;:22::i;:::-;:26;;;;:::i;:::-;42385:51;;42447:18;42468:17;:26;42486:7;42468:26;;;;;;;;;;;;42447:47;;42615:14;42601:10;:28;42597:328;;42646:19;42668:12;:18;42681:4;42668:18;;;;;;;;;;;;;;;:34;42687:14;42668:34;;;;;;;;;;;;42646:56;;42752:11;42719:12;:18;42732:4;42719:18;;;;;;;;;;;;;;;:30;42738:10;42719:30;;;;;;;;;;;:44;;;;42869:10;42836:17;:30;42854:11;42836:30;;;;;;;;;;;:43;;;;42631:294;42597:328;43021:17;:26;43039:7;43021:26;;;;;;;;;;;43014:33;;;43065:12;:18;43078:4;43065:18;;;;;;;;;;;;;;;:34;43084:14;43065:34;;;;;;;;;;;43058:41;;;42200:907;;42119:988;;:::o;43402:1079::-;43655:22;43700:1;43680:10;:17;;;;:21;;;;:::i;:::-;43655:46;;43712:18;43733:15;:24;43749:7;43733:24;;;;;;;;;;;;43712:45;;44084:19;44106:10;44117:14;44106:26;;;;;;;;:::i;:::-;;;;;;;;;;44084:48;;44170:11;44145:10;44156;44145:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44281:10;44250:15;:28;44266:11;44250:28;;;;;;;;;;;:41;;;;44422:15;:24;44438:7;44422:24;;;;;;;;;;;44415:31;;;44457:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43473:1008;;;43402:1079;:::o;40906:221::-;40991:14;41008:20;41025:2;41008:16;:20::i;:::-;40991:37;;41066:7;41039:12;:16;41052:2;41039:16;;;;;;;;;;;;;;;:24;41056:6;41039:24;;;;;;;;;;;:34;;;;41113:6;41084:17;:26;41102:7;41084:26;;;;;;;;;;;:35;;;;40980:147;40906:221;;:::o;32385:382::-;32479:1;32465:16;;:2;:16;;;;32457:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32538:16;32546:7;32538;:16::i;:::-;32537:17;32529:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32600:45;32629:1;32633:2;32637:7;32600:20;:45::i;:::-;32675:1;32658:9;:13;32668:2;32658:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32706:2;32687:7;:16;32695:7;32687:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32751:7;32747:2;32726:33;;32743:1;32726:33;;;;;;;;;;;;32385:382;;:::o;15288:387::-;15348:4;15556:12;15623:7;15611:20;15603:28;;15666:1;15659:4;:8;15652:15;;;15288:387;;;:::o;48407:715::-;48463:13;48685:1;48676:5;:10;48672:53;;;48703:10;;;;;;;;;;;;;;;;;;;;;48672:53;48735:12;48750:5;48735:20;;48766:14;48791:78;48806:1;48798:4;:9;48791:78;;48824:8;;;;;:::i;:::-;;;;48855:2;48847:10;;;;;:::i;:::-;;;48791:78;;;48879:19;48911:6;48901:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48879:39;;48929:154;48945:1;48936:5;:10;48929:154;;48973:1;48963:11;;;;;:::i;:::-;;;49040:2;49032:5;:10;;;;:::i;:::-;49019:2;:24;;;;:::i;:::-;49006:39;;48989:6;48996;48989:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;49069:2;49060:11;;;;;:::i;:::-;;;48929:154;;;49107:6;49093:21;;;;;48407:715;;;;:::o;45149:138::-;45209:7;45271:5;45254:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;45244:34;;;;;;45236:43;;45229:50;;45149:138;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1313:143::-;1370:5;1401:6;1395:13;1386:22;;1417:33;1444:5;1417:33;:::i;:::-;1313:143;;;;:::o;1479:370::-;1550:5;1599:3;1592:4;1584:6;1580:17;1576:27;1566:122;;1607:79;;:::i;:::-;1566:122;1724:6;1711:20;1749:94;1839:3;1831:6;1824:4;1816:6;1812:17;1749:94;:::i;:::-;1740:103;;1556:293;1479:370;;;;:::o;1855:133::-;1898:5;1936:6;1923:20;1914:29;;1952:30;1976:5;1952:30;:::i;:::-;1855:133;;;;:::o;1994:137::-;2039:5;2077:6;2064:20;2055:29;;2093:32;2119:5;2093:32;:::i;:::-;1994:137;;;;:::o;2137:141::-;2193:5;2224:6;2218:13;2209:22;;2240:32;2266:5;2240:32;:::i;:::-;2137:141;;;;:::o;2297:338::-;2352:5;2401:3;2394:4;2386:6;2382:17;2378:27;2368:122;;2409:79;;:::i;:::-;2368:122;2526:6;2513:20;2551:78;2625:3;2617:6;2610:4;2602:6;2598:17;2551:78;:::i;:::-;2542:87;;2358:277;2297:338;;;;:::o;2641:139::-;2687:5;2725:6;2712:20;2703:29;;2741:33;2768:5;2741:33;:::i;:::-;2641:139;;;;:::o;2786:329::-;2845:6;2894:2;2882:9;2873:7;2869:23;2865:32;2862:119;;;2900:79;;:::i;:::-;2862:119;3020:1;3045:53;3090:7;3081:6;3070:9;3066:22;3045:53;:::i;:::-;3035:63;;2991:117;2786:329;;;;:::o;3121:351::-;3191:6;3240:2;3228:9;3219:7;3215:23;3211:32;3208:119;;;3246:79;;:::i;:::-;3208:119;3366:1;3391:64;3447:7;3438:6;3427:9;3423:22;3391:64;:::i;:::-;3381:74;;3337:128;3121:351;;;;:::o;3478:474::-;3546:6;3554;3603:2;3591:9;3582:7;3578:23;3574:32;3571:119;;;3609:79;;:::i;:::-;3571:119;3729:1;3754:53;3799:7;3790:6;3779:9;3775:22;3754:53;:::i;:::-;3744:63;;3700:117;3856:2;3882:53;3927:7;3918:6;3907:9;3903:22;3882:53;:::i;:::-;3872:63;;3827:118;3478:474;;;;;:::o;3958:619::-;4035:6;4043;4051;4100:2;4088:9;4079:7;4075:23;4071:32;4068:119;;;4106:79;;:::i;:::-;4068:119;4226:1;4251:53;4296:7;4287:6;4276:9;4272:22;4251:53;:::i;:::-;4241:63;;4197:117;4353:2;4379:53;4424:7;4415:6;4404:9;4400:22;4379:53;:::i;:::-;4369:63;;4324:118;4481:2;4507:53;4552:7;4543:6;4532:9;4528:22;4507:53;:::i;:::-;4497:63;;4452:118;3958:619;;;;;:::o;4583:943::-;4678:6;4686;4694;4702;4751:3;4739:9;4730:7;4726:23;4722:33;4719:120;;;4758:79;;:::i;:::-;4719:120;4878:1;4903:53;4948:7;4939:6;4928:9;4924:22;4903:53;:::i;:::-;4893:63;;4849:117;5005:2;5031:53;5076:7;5067:6;5056:9;5052:22;5031:53;:::i;:::-;5021:63;;4976:118;5133:2;5159:53;5204:7;5195:6;5184:9;5180:22;5159:53;:::i;:::-;5149:63;;5104:118;5289:2;5278:9;5274:18;5261:32;5320:18;5312:6;5309:30;5306:117;;;5342:79;;:::i;:::-;5306:117;5447:62;5501:7;5492:6;5481:9;5477:22;5447:62;:::i;:::-;5437:72;;5232:287;4583:943;;;;;;;:::o;5532:468::-;5597:6;5605;5654:2;5642:9;5633:7;5629:23;5625:32;5622:119;;;5660:79;;:::i;:::-;5622:119;5780:1;5805:53;5850:7;5841:6;5830:9;5826:22;5805:53;:::i;:::-;5795:63;;5751:117;5907:2;5933:50;5975:7;5966:6;5955:9;5951:22;5933:50;:::i;:::-;5923:60;;5878:115;5532:468;;;;;:::o;6006:474::-;6074:6;6082;6131:2;6119:9;6110:7;6106:23;6102:32;6099:119;;;6137:79;;:::i;:::-;6099:119;6257:1;6282:53;6327:7;6318:6;6307:9;6303:22;6282:53;:::i;:::-;6272:63;;6228:117;6384:2;6410:53;6455:7;6446:6;6435:9;6431:22;6410:53;:::i;:::-;6400:63;;6355:118;6006:474;;;;;:::o;6486:539::-;6570:6;6619:2;6607:9;6598:7;6594:23;6590:32;6587:119;;;6625:79;;:::i;:::-;6587:119;6773:1;6762:9;6758:17;6745:31;6803:18;6795:6;6792:30;6789:117;;;6825:79;;:::i;:::-;6789:117;6930:78;7000:7;6991:6;6980:9;6976:22;6930:78;:::i;:::-;6920:88;;6716:302;6486:539;;;;:::o;7031:327::-;7089:6;7138:2;7126:9;7117:7;7113:23;7109:32;7106:119;;;7144:79;;:::i;:::-;7106:119;7264:1;7289:52;7333:7;7324:6;7313:9;7309:22;7289:52;:::i;:::-;7279:62;;7235:116;7031:327;;;;:::o;7364:349::-;7433:6;7482:2;7470:9;7461:7;7457:23;7453:32;7450:119;;;7488:79;;:::i;:::-;7450:119;7608:1;7633:63;7688:7;7679:6;7668:9;7664:22;7633:63;:::i;:::-;7623:73;;7579:127;7364:349;;;;:::o;7719:329::-;7778:6;7827:2;7815:9;7806:7;7802:23;7798:32;7795:119;;;7833:79;;:::i;:::-;7795:119;7953:1;7978:53;8023:7;8014:6;8003:9;7999:22;7978:53;:::i;:::-;7968:63;;7924:117;7719:329;;;;:::o;8054:118::-;8141:24;8159:5;8141:24;:::i;:::-;8136:3;8129:37;8054:118;;:::o;8178:109::-;8259:21;8274:5;8259:21;:::i;:::-;8254:3;8247:34;8178:109;;:::o;8293:360::-;8379:3;8407:38;8439:5;8407:38;:::i;:::-;8461:70;8524:6;8519:3;8461:70;:::i;:::-;8454:77;;8540:52;8585:6;8580:3;8573:4;8566:5;8562:16;8540:52;:::i;:::-;8617:29;8639:6;8617:29;:::i;:::-;8612:3;8608:39;8601:46;;8383:270;8293:360;;;;:::o;8659:364::-;8747:3;8775:39;8808:5;8775:39;:::i;:::-;8830:71;8894:6;8889:3;8830:71;:::i;:::-;8823:78;;8910:52;8955:6;8950:3;8943:4;8936:5;8932:16;8910:52;:::i;:::-;8987:29;9009:6;8987:29;:::i;:::-;8982:3;8978:39;8971:46;;8751:272;8659:364;;;;:::o;9029:377::-;9135:3;9163:39;9196:5;9163:39;:::i;:::-;9218:89;9300:6;9295:3;9218:89;:::i;:::-;9211:96;;9316:52;9361:6;9356:3;9349:4;9342:5;9338:16;9316:52;:::i;:::-;9393:6;9388:3;9384:16;9377:23;;9139:267;9029:377;;;;:::o;9412:366::-;9554:3;9575:67;9639:2;9634:3;9575:67;:::i;:::-;9568:74;;9651:93;9740:3;9651:93;:::i;:::-;9769:2;9764:3;9760:12;9753:19;;9412:366;;;:::o;9784:::-;9926:3;9947:67;10011:2;10006:3;9947:67;:::i;:::-;9940:74;;10023:93;10112:3;10023:93;:::i;:::-;10141:2;10136:3;10132:12;10125:19;;9784:366;;;:::o;10156:::-;10298:3;10319:67;10383:2;10378:3;10319:67;:::i;:::-;10312:74;;10395:93;10484:3;10395:93;:::i;:::-;10513:2;10508:3;10504:12;10497:19;;10156:366;;;:::o;10528:::-;10670:3;10691:67;10755:2;10750:3;10691:67;:::i;:::-;10684:74;;10767:93;10856:3;10767:93;:::i;:::-;10885:2;10880:3;10876:12;10869:19;;10528:366;;;:::o;10900:::-;11042:3;11063:67;11127:2;11122:3;11063:67;:::i;:::-;11056:74;;11139:93;11228:3;11139:93;:::i;:::-;11257:2;11252:3;11248:12;11241:19;;10900:366;;;:::o;11272:::-;11414:3;11435:67;11499:2;11494:3;11435:67;:::i;:::-;11428:74;;11511:93;11600:3;11511:93;:::i;:::-;11629:2;11624:3;11620:12;11613:19;;11272:366;;;:::o;11644:::-;11786:3;11807:67;11871:2;11866:3;11807:67;:::i;:::-;11800:74;;11883:93;11972:3;11883:93;:::i;:::-;12001:2;11996:3;11992:12;11985:19;;11644:366;;;:::o;12016:::-;12158:3;12179:67;12243:2;12238:3;12179:67;:::i;:::-;12172:74;;12255:93;12344:3;12255:93;:::i;:::-;12373:2;12368:3;12364:12;12357:19;;12016:366;;;:::o;12388:::-;12530:3;12551:67;12615:2;12610:3;12551:67;:::i;:::-;12544:74;;12627:93;12716:3;12627:93;:::i;:::-;12745:2;12740:3;12736:12;12729:19;;12388:366;;;:::o;12760:::-;12902:3;12923:67;12987:2;12982:3;12923:67;:::i;:::-;12916:74;;12999:93;13088:3;12999:93;:::i;:::-;13117:2;13112:3;13108:12;13101:19;;12760:366;;;:::o;13132:::-;13274:3;13295:67;13359:2;13354:3;13295:67;:::i;:::-;13288:74;;13371:93;13460:3;13371:93;:::i;:::-;13489:2;13484:3;13480:12;13473:19;;13132:366;;;:::o;13504:400::-;13664:3;13685:84;13767:1;13762:3;13685:84;:::i;:::-;13678:91;;13778:93;13867:3;13778:93;:::i;:::-;13896:1;13891:3;13887:11;13880:18;;13504:400;;;:::o;13910:366::-;14052:3;14073:67;14137:2;14132:3;14073:67;:::i;:::-;14066:74;;14149:93;14238:3;14149:93;:::i;:::-;14267:2;14262:3;14258:12;14251:19;;13910:366;;;:::o;14282:::-;14424:3;14445:67;14509:2;14504:3;14445:67;:::i;:::-;14438:74;;14521:93;14610:3;14521:93;:::i;:::-;14639:2;14634:3;14630:12;14623:19;;14282:366;;;:::o;14654:::-;14796:3;14817:67;14881:2;14876:3;14817:67;:::i;:::-;14810:74;;14893:93;14982:3;14893:93;:::i;:::-;15011:2;15006:3;15002:12;14995:19;;14654:366;;;:::o;15026:::-;15168:3;15189:67;15253:2;15248:3;15189:67;:::i;:::-;15182:74;;15265:93;15354:3;15265:93;:::i;:::-;15383:2;15378:3;15374:12;15367:19;;15026:366;;;:::o;15398:::-;15540:3;15561:67;15625:2;15620:3;15561:67;:::i;:::-;15554:74;;15637:93;15726:3;15637:93;:::i;:::-;15755:2;15750:3;15746:12;15739:19;;15398:366;;;:::o;15770:::-;15912:3;15933:67;15997:2;15992:3;15933:67;:::i;:::-;15926:74;;16009:93;16098:3;16009:93;:::i;:::-;16127:2;16122:3;16118:12;16111:19;;15770:366;;;:::o;16142:::-;16284:3;16305:67;16369:2;16364:3;16305:67;:::i;:::-;16298:74;;16381:93;16470:3;16381:93;:::i;:::-;16499:2;16494:3;16490:12;16483:19;;16142:366;;;:::o;16514:::-;16656:3;16677:67;16741:2;16736:3;16677:67;:::i;:::-;16670:74;;16753:93;16842:3;16753:93;:::i;:::-;16871:2;16866:3;16862:12;16855:19;;16514:366;;;:::o;16886:::-;17028:3;17049:67;17113:2;17108:3;17049:67;:::i;:::-;17042:74;;17125:93;17214:3;17125:93;:::i;:::-;17243:2;17238:3;17234:12;17227:19;;16886:366;;;:::o;17258:::-;17400:3;17421:67;17485:2;17480:3;17421:67;:::i;:::-;17414:74;;17497:93;17586:3;17497:93;:::i;:::-;17615:2;17610:3;17606:12;17599:19;;17258:366;;;:::o;17630:::-;17772:3;17793:67;17857:2;17852:3;17793:67;:::i;:::-;17786:74;;17869:93;17958:3;17869:93;:::i;:::-;17987:2;17982:3;17978:12;17971:19;;17630:366;;;:::o;18002:::-;18144:3;18165:67;18229:2;18224:3;18165:67;:::i;:::-;18158:74;;18241:93;18330:3;18241:93;:::i;:::-;18359:2;18354:3;18350:12;18343:19;;18002:366;;;:::o;18374:::-;18516:3;18537:67;18601:2;18596:3;18537:67;:::i;:::-;18530:74;;18613:93;18702:3;18613:93;:::i;:::-;18731:2;18726:3;18722:12;18715:19;;18374:366;;;:::o;18746:::-;18888:3;18909:67;18973:2;18968:3;18909:67;:::i;:::-;18902:74;;18985:93;19074:3;18985:93;:::i;:::-;19103:2;19098:3;19094:12;19087:19;;18746:366;;;:::o;19118:400::-;19278:3;19299:84;19381:1;19376:3;19299:84;:::i;:::-;19292:91;;19392:93;19481:3;19392:93;:::i;:::-;19510:1;19505:3;19501:11;19494:18;;19118:400;;;:::o;19524:118::-;19611:24;19629:5;19611:24;:::i;:::-;19606:3;19599:37;19524:118;;:::o;19648:275::-;19780:3;19802:95;19893:3;19884:6;19802:95;:::i;:::-;19795:102;;19914:3;19907:10;;19648:275;;;;:::o;19929:861::-;20258:3;20280:95;20371:3;20362:6;20280:95;:::i;:::-;20273:102;;20392:95;20483:3;20474:6;20392:95;:::i;:::-;20385:102;;20504:148;20648:3;20504:148;:::i;:::-;20497:155;;20669:95;20760:3;20751:6;20669:95;:::i;:::-;20662:102;;20781:3;20774:10;;19929:861;;;;;;:::o;20796:701::-;21077:3;21099:148;21243:3;21099:148;:::i;:::-;21092:155;;21264:95;21355:3;21346:6;21264:95;:::i;:::-;21257:102;;21376:95;21467:3;21458:6;21376:95;:::i;:::-;21369:102;;21488:3;21481:10;;20796:701;;;;;:::o;21503:222::-;21596:4;21634:2;21623:9;21619:18;21611:26;;21647:71;21715:1;21704:9;21700:17;21691:6;21647:71;:::i;:::-;21503:222;;;;:::o;21731:640::-;21926:4;21964:3;21953:9;21949:19;21941:27;;21978:71;22046:1;22035:9;22031:17;22022:6;21978:71;:::i;:::-;22059:72;22127:2;22116:9;22112:18;22103:6;22059:72;:::i;:::-;22141;22209:2;22198:9;22194:18;22185:6;22141:72;:::i;:::-;22260:9;22254:4;22250:20;22245:2;22234:9;22230:18;22223:48;22288:76;22359:4;22350:6;22288:76;:::i;:::-;22280:84;;21731:640;;;;;;;:::o;22377:210::-;22464:4;22502:2;22491:9;22487:18;22479:26;;22515:65;22577:1;22566:9;22562:17;22553:6;22515:65;:::i;:::-;22377:210;;;;:::o;22593:313::-;22706:4;22744:2;22733:9;22729:18;22721:26;;22793:9;22787:4;22783:20;22779:1;22768:9;22764:17;22757:47;22821:78;22894:4;22885:6;22821:78;:::i;:::-;22813:86;;22593:313;;;;:::o;22912:419::-;23078:4;23116:2;23105:9;23101:18;23093:26;;23165:9;23159:4;23155:20;23151:1;23140:9;23136:17;23129:47;23193:131;23319:4;23193:131;:::i;:::-;23185:139;;22912:419;;;:::o;23337:::-;23503:4;23541:2;23530:9;23526:18;23518:26;;23590:9;23584:4;23580:20;23576:1;23565:9;23561:17;23554:47;23618:131;23744:4;23618:131;:::i;:::-;23610:139;;23337:419;;;:::o;23762:::-;23928:4;23966:2;23955:9;23951:18;23943:26;;24015:9;24009:4;24005:20;24001:1;23990:9;23986:17;23979:47;24043:131;24169:4;24043:131;:::i;:::-;24035:139;;23762:419;;;:::o;24187:::-;24353:4;24391:2;24380:9;24376:18;24368:26;;24440:9;24434:4;24430:20;24426:1;24415:9;24411:17;24404:47;24468:131;24594:4;24468:131;:::i;:::-;24460:139;;24187:419;;;:::o;24612:::-;24778:4;24816:2;24805:9;24801:18;24793:26;;24865:9;24859:4;24855:20;24851:1;24840:9;24836:17;24829:47;24893:131;25019:4;24893:131;:::i;:::-;24885:139;;24612:419;;;:::o;25037:::-;25203:4;25241:2;25230:9;25226:18;25218:26;;25290:9;25284:4;25280:20;25276:1;25265:9;25261:17;25254:47;25318:131;25444:4;25318:131;:::i;:::-;25310:139;;25037:419;;;:::o;25462:::-;25628:4;25666:2;25655:9;25651:18;25643:26;;25715:9;25709:4;25705:20;25701:1;25690:9;25686:17;25679:47;25743:131;25869:4;25743:131;:::i;:::-;25735:139;;25462:419;;;:::o;25887:::-;26053:4;26091:2;26080:9;26076:18;26068:26;;26140:9;26134:4;26130:20;26126:1;26115:9;26111:17;26104:47;26168:131;26294:4;26168:131;:::i;:::-;26160:139;;25887:419;;;:::o;26312:::-;26478:4;26516:2;26505:9;26501:18;26493:26;;26565:9;26559:4;26555:20;26551:1;26540:9;26536:17;26529:47;26593:131;26719:4;26593:131;:::i;:::-;26585:139;;26312:419;;;:::o;26737:::-;26903:4;26941:2;26930:9;26926:18;26918:26;;26990:9;26984:4;26980:20;26976:1;26965:9;26961:17;26954:47;27018:131;27144:4;27018:131;:::i;:::-;27010:139;;26737:419;;;:::o;27162:::-;27328:4;27366:2;27355:9;27351:18;27343:26;;27415:9;27409:4;27405:20;27401:1;27390:9;27386:17;27379:47;27443:131;27569:4;27443:131;:::i;:::-;27435:139;;27162:419;;;:::o;27587:::-;27753:4;27791:2;27780:9;27776:18;27768:26;;27840:9;27834:4;27830:20;27826:1;27815:9;27811:17;27804:47;27868:131;27994:4;27868:131;:::i;:::-;27860:139;;27587:419;;;:::o;28012:::-;28178:4;28216:2;28205:9;28201:18;28193:26;;28265:9;28259:4;28255:20;28251:1;28240:9;28236:17;28229:47;28293:131;28419:4;28293:131;:::i;:::-;28285:139;;28012:419;;;:::o;28437:::-;28603:4;28641:2;28630:9;28626:18;28618:26;;28690:9;28684:4;28680:20;28676:1;28665:9;28661:17;28654:47;28718:131;28844:4;28718:131;:::i;:::-;28710:139;;28437:419;;;:::o;28862:::-;29028:4;29066:2;29055:9;29051:18;29043:26;;29115:9;29109:4;29105:20;29101:1;29090:9;29086:17;29079:47;29143:131;29269:4;29143:131;:::i;:::-;29135:139;;28862:419;;;:::o;29287:::-;29453:4;29491:2;29480:9;29476:18;29468:26;;29540:9;29534:4;29530:20;29526:1;29515:9;29511:17;29504:47;29568:131;29694:4;29568:131;:::i;:::-;29560:139;;29287:419;;;:::o;29712:::-;29878:4;29916:2;29905:9;29901:18;29893:26;;29965:9;29959:4;29955:20;29951:1;29940:9;29936:17;29929:47;29993:131;30119:4;29993:131;:::i;:::-;29985:139;;29712:419;;;:::o;30137:::-;30303:4;30341:2;30330:9;30326:18;30318:26;;30390:9;30384:4;30380:20;30376:1;30365:9;30361:17;30354:47;30418:131;30544:4;30418:131;:::i;:::-;30410:139;;30137:419;;;:::o;30562:::-;30728:4;30766:2;30755:9;30751:18;30743:26;;30815:9;30809:4;30805:20;30801:1;30790:9;30786:17;30779:47;30843:131;30969:4;30843:131;:::i;:::-;30835:139;;30562:419;;;:::o;30987:::-;31153:4;31191:2;31180:9;31176:18;31168:26;;31240:9;31234:4;31230:20;31226:1;31215:9;31211:17;31204:47;31268:131;31394:4;31268:131;:::i;:::-;31260:139;;30987:419;;;:::o;31412:::-;31578:4;31616:2;31605:9;31601:18;31593:26;;31665:9;31659:4;31655:20;31651:1;31640:9;31636:17;31629:47;31693:131;31819:4;31693:131;:::i;:::-;31685:139;;31412:419;;;:::o;31837:::-;32003:4;32041:2;32030:9;32026:18;32018:26;;32090:9;32084:4;32080:20;32076:1;32065:9;32061:17;32054:47;32118:131;32244:4;32118:131;:::i;:::-;32110:139;;31837:419;;;:::o;32262:::-;32428:4;32466:2;32455:9;32451:18;32443:26;;32515:9;32509:4;32505:20;32501:1;32490:9;32486:17;32479:47;32543:131;32669:4;32543:131;:::i;:::-;32535:139;;32262:419;;;:::o;32687:::-;32853:4;32891:2;32880:9;32876:18;32868:26;;32940:9;32934:4;32930:20;32926:1;32915:9;32911:17;32904:47;32968:131;33094:4;32968:131;:::i;:::-;32960:139;;32687:419;;;:::o;33112:::-;33278:4;33316:2;33305:9;33301:18;33293:26;;33365:9;33359:4;33355:20;33351:1;33340:9;33336:17;33329:47;33393:131;33519:4;33393:131;:::i;:::-;33385:139;;33112:419;;;:::o;33537:222::-;33630:4;33668:2;33657:9;33653:18;33645:26;;33681:71;33749:1;33738:9;33734:17;33725:6;33681:71;:::i;:::-;33537:222;;;;:::o;33765:129::-;33799:6;33826:20;;:::i;:::-;33816:30;;33855:33;33883:4;33875:6;33855:33;:::i;:::-;33765:129;;;:::o;33900:75::-;33933:6;33966:2;33960:9;33950:19;;33900:75;:::o;33981:311::-;34058:4;34148:18;34140:6;34137:30;34134:56;;;34170:18;;:::i;:::-;34134:56;34220:4;34212:6;34208:17;34200:25;;34280:4;34274;34270:15;34262:23;;33981:311;;;:::o;34298:307::-;34359:4;34449:18;34441:6;34438:30;34435:56;;;34471:18;;:::i;:::-;34435:56;34509:29;34531:6;34509:29;:::i;:::-;34501:37;;34593:4;34587;34583:15;34575:23;;34298:307;;;:::o;34611:98::-;34662:6;34696:5;34690:12;34680:22;;34611:98;;;:::o;34715:99::-;34767:6;34801:5;34795:12;34785:22;;34715:99;;;:::o;34820:168::-;34903:11;34937:6;34932:3;34925:19;34977:4;34972:3;34968:14;34953:29;;34820:168;;;;:::o;34994:169::-;35078:11;35112:6;35107:3;35100:19;35152:4;35147:3;35143:14;35128:29;;34994:169;;;;:::o;35169:148::-;35271:11;35308:3;35293:18;;35169:148;;;;:::o;35323:305::-;35363:3;35382:20;35400:1;35382:20;:::i;:::-;35377:25;;35416:20;35434:1;35416:20;:::i;:::-;35411:25;;35570:1;35502:66;35498:74;35495:1;35492:81;35489:107;;;35576:18;;:::i;:::-;35489:107;35620:1;35617;35613:9;35606:16;;35323:305;;;;:::o;35634:185::-;35674:1;35691:20;35709:1;35691:20;:::i;:::-;35686:25;;35725:20;35743:1;35725:20;:::i;:::-;35720:25;;35764:1;35754:35;;35769:18;;:::i;:::-;35754:35;35811:1;35808;35804:9;35799:14;;35634:185;;;;:::o;35825:848::-;35886:5;35893:4;35917:6;35908:15;;35941:5;35932:14;;35955:712;35976:1;35966:8;35963:15;35955:712;;;36071:4;36066:3;36062:14;36056:4;36053:24;36050:50;;;36080:18;;:::i;:::-;36050:50;36130:1;36120:8;36116:16;36113:451;;;36545:4;36538:5;36534:16;36525:25;;36113:451;36595:4;36589;36585:15;36577:23;;36625:32;36648:8;36625:32;:::i;:::-;36613:44;;35955:712;;;35825:848;;;;;;;:::o;36679:285::-;36739:5;36763:23;36781:4;36763:23;:::i;:::-;36755:31;;36807:27;36825:8;36807:27;:::i;:::-;36795:39;;36853:104;36890:66;36880:8;36874:4;36853:104;:::i;:::-;36844:113;;36679:285;;;;:::o;36970:1073::-;37024:5;37215:8;37205:40;;37236:1;37227:10;;37238:5;;37205:40;37264:4;37254:36;;37281:1;37272:10;;37283:5;;37254:36;37350:4;37398:1;37393:27;;;;37434:1;37429:191;;;;37343:277;;37393:27;37411:1;37402:10;;37413:5;;;37429:191;37474:3;37464:8;37461:17;37458:43;;;37481:18;;:::i;:::-;37458:43;37530:8;37527:1;37523:16;37514:25;;37565:3;37558:5;37555:14;37552:40;;;37572:18;;:::i;:::-;37552:40;37605:5;;;37343:277;;37729:2;37719:8;37716:16;37710:3;37704:4;37701:13;37697:36;37679:2;37669:8;37666:16;37661:2;37655:4;37652:12;37648:35;37632:111;37629:246;;;37785:8;37779:4;37775:19;37766:28;;37820:3;37813:5;37810:14;37807:40;;;37827:18;;:::i;:::-;37807:40;37860:5;;37629:246;37900:42;37938:3;37928:8;37922:4;37919:1;37900:42;:::i;:::-;37885:57;;;;37974:4;37969:3;37965:14;37958:5;37955:25;37952:51;;;37983:18;;:::i;:::-;37952:51;38032:4;38025:5;38021:16;38012:25;;36970:1073;;;;;;:::o;38049:348::-;38089:7;38112:20;38130:1;38112:20;:::i;:::-;38107:25;;38146:20;38164:1;38146:20;:::i;:::-;38141:25;;38334:1;38266:66;38262:74;38259:1;38256:81;38251:1;38244:9;38237:17;38233:105;38230:131;;;38341:18;;:::i;:::-;38230:131;38389:1;38386;38382:9;38371:20;;38049:348;;;;:::o;38403:191::-;38443:4;38463:20;38481:1;38463:20;:::i;:::-;38458:25;;38497:20;38515:1;38497:20;:::i;:::-;38492:25;;38536:1;38533;38530:8;38527:34;;;38541:18;;:::i;:::-;38527:34;38586:1;38583;38579:9;38571:17;;38403:191;;;;:::o;38600:96::-;38637:7;38666:24;38684:5;38666:24;:::i;:::-;38655:35;;38600:96;;;:::o;38702:90::-;38736:7;38779:5;38772:13;38765:21;38754:32;;38702:90;;;:::o;38798:149::-;38834:7;38874:66;38867:5;38863:78;38852:89;;38798:149;;;:::o;38953:126::-;38990:7;39030:42;39023:5;39019:54;39008:65;;38953:126;;;:::o;39085:77::-;39122:7;39151:5;39140:16;;39085:77;;;:::o;39168:154::-;39252:6;39247:3;39242;39229:30;39314:1;39305:6;39300:3;39296:16;39289:27;39168:154;;;:::o;39328:307::-;39396:1;39406:113;39420:6;39417:1;39414:13;39406:113;;;39505:1;39500:3;39496:11;39490:18;39486:1;39481:3;39477:11;39470:39;39442:2;39439:1;39435:10;39430:15;;39406:113;;;39537:6;39534:1;39531:13;39528:101;;;39617:1;39608:6;39603:3;39599:16;39592:27;39528:101;39377:258;39328:307;;;:::o;39641:171::-;39680:3;39703:24;39721:5;39703:24;:::i;:::-;39694:33;;39749:4;39742:5;39739:15;39736:41;;;39757:18;;:::i;:::-;39736:41;39804:1;39797:5;39793:13;39786:20;;39641:171;;;:::o;39818:320::-;39862:6;39899:1;39893:4;39889:12;39879:22;;39946:1;39940:4;39936:12;39967:18;39957:81;;40023:4;40015:6;40011:17;40001:27;;39957:81;40085:2;40077:6;40074:14;40054:18;40051:38;40048:84;;;40104:18;;:::i;:::-;40048:84;39869:269;39818:320;;;:::o;40144:281::-;40227:27;40249:4;40227:27;:::i;:::-;40219:6;40215:40;40357:6;40345:10;40342:22;40321:18;40309:10;40306:34;40303:62;40300:88;;;40368:18;;:::i;:::-;40300:88;40408:10;40404:2;40397:22;40187:238;40144:281;;:::o;40431:233::-;40470:3;40493:24;40511:5;40493:24;:::i;:::-;40484:33;;40539:66;40532:5;40529:77;40526:103;;;40609:18;;:::i;:::-;40526:103;40656:1;40649:5;40645:13;40638:20;;40431:233;;;:::o;40670:176::-;40702:1;40719:20;40737:1;40719:20;:::i;:::-;40714:25;;40753:20;40771:1;40753:20;:::i;:::-;40748:25;;40792:1;40782:35;;40797:18;;:::i;:::-;40782:35;40838:1;40835;40831:9;40826:14;;40670:176;;;;:::o;40852:180::-;40900:77;40897:1;40890:88;40997:4;40994:1;40987:15;41021:4;41018:1;41011:15;41038:180;41086:77;41083:1;41076:88;41183:4;41180:1;41173:15;41207:4;41204:1;41197:15;41224:180;41272:77;41269:1;41262:88;41369:4;41366:1;41359:15;41393:4;41390:1;41383:15;41410:180;41458:77;41455:1;41448:88;41555:4;41552:1;41545:15;41579:4;41576:1;41569:15;41596:180;41644:77;41641:1;41634:88;41741:4;41738:1;41731:15;41765:4;41762:1;41755:15;41782:180;41830:77;41827:1;41820:88;41927:4;41924:1;41917:15;41951:4;41948:1;41941:15;41968:117;42077:1;42074;42067:12;42091:117;42200:1;42197;42190:12;42214:117;42323:1;42320;42313:12;42337:117;42446:1;42443;42436:12;42460:117;42569:1;42566;42559:12;42583:102;42624:6;42675:2;42671:7;42666:2;42659:5;42655:14;42651:28;42641:38;;42583:102;;;:::o;42691:::-;42733:8;42780:5;42777:1;42773:13;42752:34;;42691:102;;;:::o;42799:182::-;42939:34;42935:1;42927:6;42923:14;42916:58;42799:182;:::o;42987:230::-;43127:34;43123:1;43115:6;43111:14;43104:58;43196:13;43191:2;43183:6;43179:15;43172:38;42987:230;:::o;43223:237::-;43363:34;43359:1;43351:6;43347:14;43340:58;43432:20;43427:2;43419:6;43415:15;43408:45;43223:237;:::o;43466:225::-;43606:34;43602:1;43594:6;43590:14;43583:58;43675:8;43670:2;43662:6;43658:15;43651:33;43466:225;:::o;43697:178::-;43837:30;43833:1;43825:6;43821:14;43814:54;43697:178;:::o;43881:231::-;44021:34;44017:1;44009:6;44005:14;43998:58;44090:14;44085:2;44077:6;44073:15;44066:39;43881:231;:::o;44118:223::-;44258:34;44254:1;44246:6;44242:14;44235:58;44327:6;44322:2;44314:6;44310:15;44303:31;44118:223;:::o;44347:175::-;44487:27;44483:1;44475:6;44471:14;44464:51;44347:175;:::o;44528:181::-;44668:33;44664:1;44656:6;44652:14;44645:57;44528:181;:::o;44715:176::-;44855:28;44851:1;44843:6;44839:14;44832:52;44715:176;:::o;44897:231::-;45037:34;45033:1;45025:6;45021:14;45014:58;45106:14;45101:2;45093:6;45089:15;45082:39;44897:231;:::o;45134:155::-;45274:7;45270:1;45262:6;45258:14;45251:31;45134:155;:::o;45295:221::-;45435:34;45431:1;45423:6;45419:14;45412:58;45504:4;45499:2;45491:6;45487:15;45480:29;45295:221;:::o;45522:243::-;45662:34;45658:1;45650:6;45646:14;45639:58;45731:26;45726:2;45718:6;45714:15;45707:51;45522:243;:::o;45771:229::-;45911:34;45907:1;45899:6;45895:14;45888:58;45980:12;45975:2;45967:6;45963:15;45956:37;45771:229;:::o;46006:228::-;46146:34;46142:1;46134:6;46130:14;46123:58;46215:11;46210:2;46202:6;46198:15;46191:36;46006:228;:::o;46240:182::-;46380:34;46376:1;46368:6;46364:14;46357:58;46240:182;:::o;46428:231::-;46568:34;46564:1;46556:6;46552:14;46545:58;46637:14;46632:2;46624:6;46620:15;46613:39;46428:231;:::o;46665:182::-;46805:34;46801:1;46793:6;46789:14;46782:58;46665:182;:::o;46853:166::-;46993:18;46989:1;46981:6;46977:14;46970:42;46853:166;:::o;47025:228::-;47165:34;47161:1;47153:6;47149:14;47142:58;47234:11;47229:2;47221:6;47217:15;47210:36;47025:228;:::o;47259:230::-;47399:34;47395:1;47387:6;47383:14;47376:58;47468:13;47463:2;47455:6;47451:15;47444:38;47259:230;:::o;47495:220::-;47635:34;47631:1;47623:6;47619:14;47612:58;47704:3;47699:2;47691:6;47687:15;47680:28;47495:220;:::o;47721:236::-;47861:34;47857:1;47849:6;47845:14;47838:58;47930:19;47925:2;47917:6;47913:15;47906:44;47721:236;:::o;47963:231::-;48103:34;48099:1;48091:6;48087:14;48080:58;48172:14;48167:2;48159:6;48155:15;48148:39;47963:231;:::o;48200:181::-;48340:33;48336:1;48328:6;48324:14;48317:57;48200:181;:::o;48387:151::-;48527:3;48523:1;48515:6;48511:14;48504:27;48387:151;:::o;48544:122::-;48617:24;48635:5;48617:24;:::i;:::-;48610:5;48607:35;48597:63;;48656:1;48653;48646:12;48597:63;48544:122;:::o;48672:116::-;48742:21;48757:5;48742:21;:::i;:::-;48735:5;48732:32;48722:60;;48778:1;48775;48768:12;48722:60;48672:116;:::o;48794:120::-;48866:23;48883:5;48866:23;:::i;:::-;48859:5;48856:34;48846:62;;48904:1;48901;48894:12;48846:62;48794:120;:::o;48920:122::-;48993:24;49011:5;48993:24;:::i;:::-;48986:5;48983:35;48973:63;;49032:1;49029;49022:12;48973:63;48920:122;:::o

Swarm Source

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