ETH Price: $2,602.25 (+1.04%)

Token

Three Dice Rolls (3DICE)
 

Overview

Max Total Supply

38 3DICE

Holders

16

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
kementari.eth
Balance
14 3DICE
0x5115c67f5621440fd8413cdad36fdf89b8ac4c01
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:
ThreeDiceEthMain

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

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


contract ThreeDiceEthMain is ERC721Enumerable, ReentrancyGuard, Ownable {
    uint256 public publicPrice = 30000000000000000; // 0.03 ETH
    
    address public parentAddress = 0x05a46f1E545526FB803FF974C790aCeA34D1f2D6; // N
    IERC721Enumerable parentToken = IERC721Enumerable(parentAddress);
    uint256 public parentTokenSupply = 8888;
    uint256 public publicMintSupply = 8888;
    
    using Counters for Counters.Counter;
    Counters.Counter private _purchasedTokens;
    
    string[] private diceFaces = [
      hex"E29A80",  
      hex"E29A81",  
      hex"E29A82",  
      hex"E29A83",  
      hex"E29A84",  
      hex"E29A85"  
    ];
    
    string private randomizer = "";
    
    function random(string memory input) internal view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(randomizer, input)));
    }
    
    function getRandomNum(uint256 tokenId, string memory keyPrefix, uint256 lower, uint256 upper) internal view returns (uint256) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        return (rand % (upper - lower + 1)) + lower; 
    }
    
    function getDice(uint256 tokenId, uint256 roll, uint256 dice) public view returns(uint256) {
        return getRandomNum(tokenId, string(abi.encodePacked(toString(roll), "DICE", toString(dice))), 1, 6);
    }
    
    function getThreeDiceSum(uint256 tokenId, uint256 roll) public view returns (uint256) {
        return getDice(tokenId, roll, 0) + getDice(tokenId, roll, 1) + getDice(tokenId, roll, 2);
    }
    
    function getRollValue(uint256 tokenId, uint256 roll) public view returns(uint256) {
        return getThreeDiceSum(tokenId, roll);
    }
    
    function getDiceString(uint256 tokenId, uint256 roll, uint256 dice) public view returns(string memory) {
        return diceFaces[getDice(tokenId, roll, dice) - 1];
    }
    
    function getRollString(uint256 tokenId, uint256 roll) public view returns(string memory) {
        return string(abi.encodePacked(
            getDiceString(tokenId, roll, 0),
            getDiceString(tokenId, roll, 1),
            getDiceString(tokenId, roll, 2)
        ));
    }
    
    function getRollStringExtended(uint256 tokenId, uint256 roll) public view returns(string memory) {
        return string(abi.encodePacked(
            getRollString(tokenId, roll),
            " = ",
            toString(getThreeDiceSum(tokenId, roll))
        ));
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[19] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 42px; }</style><rect width="100%" height="100%" fill="black" /><text x="20" y="50" class="base">';

        parts[1] = getRollStringExtended(tokenId, 0);

        parts[2] = '</text><text x="20" y="90" class="base">';

        parts[3] = getRollStringExtended(tokenId, 1);

        parts[4] = '</text><text x="20" y="130" class="base">';

        parts[5] = getRollStringExtended(tokenId, 2);

        parts[6] = '</text><text x="20" y="170" class="base">';

        parts[7] = getRollStringExtended(tokenId, 3);

        parts[8] = '</text><text x="20" y="210" class="base">';

        parts[9] = getRollStringExtended(tokenId, 4);

        parts[10] = '</text><text x="20" y="250" class="base">';

        parts[11] = getRollStringExtended(tokenId, 5);

        parts[12] = '</text><text x="20" y="290" class="base">';

        parts[13] = getRollStringExtended(tokenId, 6);

        parts[14] = '</text><text x="20" y="330" class="base">';

        parts[15] = getRollStringExtended(tokenId, 7);

        parts[16] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        {
            output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16]));
        }
        
        string memory json;
        
        {
            json = string(abi.encodePacked('{"name": "Three Dice #', toString(tokenId), '", "description": "Eight rolls of three dice", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '",'));
        }
        {
            json =  string(abi.encodePacked(json, 
                '"attributes":[{"trait_type": "Roll 1", "display_type": "number", "value": ', toString(getThreeDiceSum(tokenId, 0)), 
                '},{"trait_type": "Roll 2", "display_type": "number", "value": ', toString(getThreeDiceSum(tokenId, 1)), 
                '},{"trait_type": "Roll 3", "display_type": "number", "value": ', toString(getThreeDiceSum(tokenId, 2)), 
                '},{"trait_type": "Roll 4", "display_type": "number", "value": ', toString(getThreeDiceSum(tokenId, 3)), 
                '},{"trait_type": "Roll 5", "display_type": "number", "value": ', toString(getThreeDiceSum(tokenId, 4)), 
                '},{"trait_type": "Roll 6", "display_type": "number", "value": ', toString(getThreeDiceSum(tokenId, 5)), 
                '},{"trait_type": "Roll 7", "display_type": "number", "value": ', toString(getThreeDiceSum(tokenId, 6)), 
                '},{"trait_type": "Roll 8", "display_type": "number", "value": ', toString(getThreeDiceSum(tokenId, 7)), 
                '}]}'));
        }
        
        output = string(abi.encodePacked('data:application/json;base64,', Base64.encode(bytes(json))));

        return output;
    }
    
    // Mint all free tokens for an owner
    function rollAllForOwner() external nonReentrant {
        uint256 tokenBalanceOwner = parentToken.balanceOf(msg.sender);
        require(tokenBalanceOwner > 0, "No tokens owned");

        // Will iterate over parent tokens owned and mint available ones
        for (uint256 i = 0; i < tokenBalanceOwner; i++) {
            uint256 tokenId = parentToken.tokenOfOwnerByIndex(msg.sender, i);
            // Only mint those that haven't been minted yet, but no throws
            // in case some have
            if (!_exists(tokenId)) {
                _safeMint(msg.sender, tokenId);
            }
        }
    }
    
    
    // Checks if owner can claim anything at all
    function isAnythingRollable(address owner) view external returns (bool) {
        uint256 tokenBalanceOwner = parentToken.balanceOf(owner);
        if (tokenBalanceOwner == 0) {
            // Nothing to mint
            return false;
        }
        
        // Will iterate over parent tokens owned and check if can mint
        for (uint256 i = 0; i < tokenBalanceOwner; i++) {
            uint256 tokenId = parentToken.tokenOfOwnerByIndex(owner, i);
            if (!_exists(tokenId)) {
                return true;
            }
        }
        
        // No familiar available was found
        return false;
    }
    
    
    function rollRangeForOwner(uint256 ownerIndexStart, uint256 ownerIndexEnd)
        external nonReentrant
    {
        uint256 tokenBalanceOwner = parentToken.balanceOf(msg.sender);
        require(tokenBalanceOwner > 0, "No tokens owned");

        require(
            ownerIndexStart >= 0 && ownerIndexEnd < tokenBalanceOwner,
            "Indexes are out of range"
        );
        
        // Will iterate over parent tokens owned and mint available ones
        for (uint256 i = ownerIndexStart; i <= ownerIndexEnd; i++) {
            uint256 tokenId = parentToken.tokenOfOwnerByIndex(msg.sender, i);
            // Only mint those that haven't been minted yet, but no throws
            // in case some have
            if (!_exists(tokenId)) {
                _safeMint(msg.sender, tokenId);
            }
        }
    }
    
    
    function roll(uint256 amount) public payable nonReentrant {
        require(amount <= 20, "Can only mint up to 20");
        require(_purchasedTokens.current() + amount <= publicMintSupply, "Max supply exceeded");
        require(publicPrice * amount <= msg.value, "Value sent is too low");
        
        for (uint256 i=0; i < amount; i++) {
            _purchasedTokens.increment(); 
            uint256 newItemId = _purchasedTokens.current() + parentTokenSupply;
            _safeMint(_msgSender(), newItemId);
        } 
    }
    
    function withdraw() public onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
    
    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("Three Dice Rolls", "3DICE") Ownable() {
        randomizer = toString(block.timestamp);
    }
}

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


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

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

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

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

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

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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"roll","type":"uint256"},{"internalType":"uint256","name":"dice","type":"uint256"}],"name":"getDice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"roll","type":"uint256"},{"internalType":"uint256","name":"dice","type":"uint256"}],"name":"getDiceString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"roll","type":"uint256"}],"name":"getRollString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"roll","type":"uint256"}],"name":"getRollStringExtended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"roll","type":"uint256"}],"name":"getRollValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"roll","type":"uint256"}],"name":"getThreeDiceSum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"isAnythingRollable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parentTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"amount","type":"uint256"}],"name":"roll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rollAllForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ownerIndexStart","type":"uint256"},{"internalType":"uint256","name":"ownerIndexEnd","type":"uint256"}],"name":"rollRangeForOwner","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052666a94d74f430000600c557305a46f1e545526fb803ff974c790acea34d1f2d6600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506122b8600f556122b86010556040518060c001604052806040518060400160405280600381526020017fe29a80000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017fe29a81000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017fe29a82000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017fe29a83000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017fe29a84000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017fe29a850000000000000000000000000000000000000000000000000000000000815250815250601290600662000250929190620005c6565b506040518060200160405280600081525060139080519060200190620002789291906200062d565b503480156200028657600080fd5b506040518060400160405280601081526020017f5468726565204469636520526f6c6c73000000000000000000000000000000008152506040518060400160405280600581526020017f334449434500000000000000000000000000000000000000000000000000000081525081600090805190602001906200030b9291906200062d565b508060019080519060200190620003249291906200062d565b5050506001600a819055506200034f620003436200037e60201b60201c565b6200038660201b60201c565b62000360426200044c60201b60201c565b60139080519060200190620003779291906200062d565b50620009cc565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060600082141562000496576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050620005c1565b600082905060005b60008214620004ce578080620004b4906200085b565b915050600a82620004c69190620007a8565b91506200049e565b60008167ffffffffffffffff811115620004ed57620004ec6200099d565b5b6040519080825280601f01601f191660200182016040528015620005205781602001600182028036833780820191505090505b5090505b60008514620005ba576001826200053c9190620007e0565b9150600a856200054d9190620008a9565b60306200055b91906200074b565b60f81b8183815181106200057457620005736200096e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85620005b29190620007a8565b945062000524565b8093505050505b919050565b8280548282559060005260206000209081019282156200061a579160200282015b8281111562000619578251829080519060200190620006089291906200062d565b5091602001919060010190620005e7565b5b509050620006299190620006be565b5090565b8280546200063b9062000825565b90600052602060002090601f0160209004810192826200065f5760008555620006ab565b82601f106200067a57805160ff1916838001178555620006ab565b82800160010185558215620006ab579182015b82811115620006aa5782518255916020019190600101906200068d565b5b509050620006ba9190620006e6565b5090565b5b80821115620006e25760008181620006d8919062000705565b50600101620006bf565b5090565b5b8082111562000701576000816000905550600101620006e7565b5090565b508054620007139062000825565b6000825580601f1062000727575062000748565b601f016020900490600052602060002090810190620007479190620006e6565b5b50565b600062000758826200081b565b915062000765836200081b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200079d576200079c620008e1565b5b828201905092915050565b6000620007b5826200081b565b9150620007c2836200081b565b925082620007d557620007d462000910565b5b828204905092915050565b6000620007ed826200081b565b9150620007fa836200081b565b92508282101562000810576200080f620008e1565b5b828203905092915050565b6000819050919050565b600060028204905060018216806200083e57607f821691505b602082108114156200085557620008546200093f565b5b50919050565b600062000868826200081b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200089e576200089d620008e1565b5b600182019050919050565b6000620008b6826200081b565b9150620008c3836200081b565b925082620008d657620008d562000910565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61592180620009dc6000396000f3fe6080604052600436106101f85760003560e01c806370a082311161010d578063b74f74ed116100a0578063e8c1a35f1161006f578063e8c1a35f14610771578063e985e9c5146107ae578063eafcfebc146107eb578063ee0bd4a014610828578063f2fde38b1461083f576101f8565b8063b74f74ed14610691578063b88d4fde146106ce578063c87b56dd146106f7578063d30069d114610734576101f8565b806395d89b41116100dc57806395d89b41146105e7578063a22cb46514610612578063a945bf801461063b578063a96a789f14610666576101f8565b806370a082311461053d578063715018a61461057a57806385f29ca8146105915780638da5cb5b146105bc576101f8565b806323b872dd1161019057806342842e0e1161015f57806342842e0e146104345780634f6ccce71461045d578063558814191461049a5780636352211e146104d75780636ec21af814610514576101f8565b806323b872dd1461037a5780632adc9faa146103a35780632f745c59146103e05780633ccfd60b1461041d576101f8565b8063095ea7b3116101cc578063095ea7b3146102cd5780630b8dc873146102f657806318160ddd146103335780631f7b4f301461035e576101f8565b8062821de3146101fd57806301ffc9a71461022857806306fdde0314610265578063081812fc14610290575b600080fd5b34801561020957600080fd5b50610212610868565b60405161021f9190614431565b60405180910390f35b34801561023457600080fd5b5061024f600480360381019061024a91906139ca565b61088e565b60405161025c91906144c1565b60405180910390f35b34801561027157600080fd5b5061027a610908565b60405161028791906144dc565b60405180910390f35b34801561029c57600080fd5b506102b760048036038101906102b29190613a24565b61099a565b6040516102c49190614431565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef919061398a565b610a1f565b005b34801561030257600080fd5b5061031d60048036038101906103189190613a7e565b610b37565b60405161032a91906147de565b60405180910390f35b34801561033f57600080fd5b50610348610b4b565b60405161035591906147de565b60405180910390f35b61037860048036038101906103739190613a24565b610b58565b005b34801561038657600080fd5b506103a1600480360381019061039c9190613874565b610cf4565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613a7e565b610d54565b6040516103d791906144dc565b60405180910390f35b3480156103ec57600080fd5b506104076004803603810190610402919061398a565b610da3565b60405161041491906147de565b60405180910390f35b34801561042957600080fd5b50610432610e48565b005b34801561044057600080fd5b5061045b60048036038101906104569190613874565b610f14565b005b34801561046957600080fd5b50610484600480360381019061047f9190613a24565b610f34565b60405161049191906147de565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190613abe565b610fa5565b6040516104ce91906144dc565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613a24565b61106d565b60405161050b9190614431565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190613a7e565b61111f565b005b34801561054957600080fd5b50610564600480360381019061055f9190613807565b6113a6565b60405161057191906147de565b60405180910390f35b34801561058657600080fd5b5061058f61145e565b005b34801561059d57600080fd5b506105a66114e6565b6040516105b391906147de565b60405180910390f35b3480156105c857600080fd5b506105d16114ec565b6040516105de9190614431565b60405180910390f35b3480156105f357600080fd5b506105fc611516565b60405161060991906144dc565b60405180910390f35b34801561061e57600080fd5b506106396004803603810190610634919061394a565b6115a8565b005b34801561064757600080fd5b50610650611729565b60405161065d91906147de565b60405180910390f35b34801561067257600080fd5b5061067b61172f565b60405161068891906147de565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613807565b611735565b6040516106c591906144c1565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f091906138c7565b6118ed565b005b34801561070357600080fd5b5061071e60048036038101906107199190613a24565b61194f565b60405161072b91906144dc565b60405180910390f35b34801561074057600080fd5b5061075b60048036038101906107569190613a7e565b611fb7565b60405161076891906147de565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190613a7e565b611ff9565b6040516107a591906144dc565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613834565b61203f565b6040516107e291906144c1565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613abe565b6120d3565b60405161081f91906147de565b60405180910390f35b34801561083457600080fd5b5061083d61211d565b005b34801561084b57600080fd5b5061086660048036038101906108619190613807565b612351565b005b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610901575061090082612449565b5b9050919050565b60606000805461091790614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461094390614a72565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050905090565b60006109a58261252b565b6109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db906146be565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2a8261106d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a929061473e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aba612597565b73ffffffffffffffffffffffffffffffffffffffff161480610ae95750610ae881610ae3612597565b61203f565b5b610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f9061463e565b60405180910390fd5b610b32838361259f565b505050565b6000610b438383611fb7565b905092915050565b6000600880549050905090565b6002600a541415610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b959061479e565b60405180910390fd5b6002600a819055506014811115610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be19061451e565b60405180910390fd5b60105481610bf86011612658565b610c0291906148a7565b1115610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a906144fe565b60405180910390fd5b3481600c54610c52919061492e565b1115610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a9061471e565b60405180910390fd5b60005b81811015610ce857610ca86011612666565b6000600f54610cb76011612658565b610cc191906148a7565b9050610cd4610cce612597565b8261267c565b508080610ce090614ad5565b915050610c96565b506001600a8190555050565b610d05610cff612597565b8261269a565b610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b9061475e565b60405180910390fd5b610d4f838383612778565b505050565b6060610d6283836000610fa5565b610d6e84846001610fa5565b610d7a85856002610fa5565b604051602001610d8c939291906141b6565b604051602081830303815290604052905092915050565b6000610dae836113a6565b8210610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de69061453e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e50612597565b73ffffffffffffffffffffffffffffffffffffffff16610e6e6114ec565b73ffffffffffffffffffffffffffffffffffffffff1614610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb906146de565b60405180910390fd5b610ecc6114ec565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f11573d6000803e3d6000fd5b50565b610f2f838383604051806020016040528060008152506118ed565b505050565b6000610f3e610b4b565b8210610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f769061477e565b60405180910390fd5b60088281548110610f9357610f92614c0b565b5b90600052602060002001549050919050565b606060126001610fb68686866120d3565b610fc09190614988565b81548110610fd157610fd0614c0b565b5b906000526020600020018054610fe690614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461101290614a72565b801561105f5780601f106110345761010080835404028352916020019161105f565b820191906000526020600020905b81548152906001019060200180831161104257829003601f168201915b505050505090509392505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110d9061467e565b60405180910390fd5b80915050919050565b6002600a541415611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115c9061479e565b60405180910390fd5b6002600a819055506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016111ca9190614431565b60206040518083038186803b1580156111e257600080fd5b505afa1580156111f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121a9190613a51565b90506000811161125f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611256906147be565b60405180910390fd5b6000831015801561126f57508082105b6112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a5906145fe565b60405180910390fd5b60008390505b828111611398576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b815260040161131a929190614498565b60206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a9190613a51565b90506113758161252b565b61138457611383338261267c565b5b50808061139090614ad5565b9150506112b4565b50506001600a819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e9061465e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611466612597565b73ffffffffffffffffffffffffffffffffffffffff166114846114ec565b73ffffffffffffffffffffffffffffffffffffffff16146114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d1906146de565b60405180910390fd5b6114e460006129d4565b565b60105481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461152590614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461155190614a72565b801561159e5780601f106115735761010080835404028352916020019161159e565b820191906000526020600020905b81548152906001019060200180831161158157829003601f168201915b5050505050905090565b6115b0612597565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611615906145de565b60405180910390fd5b806005600061162b612597565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116d8612597565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161171d91906144c1565b60405180910390a35050565b600c5481565b600f5481565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016117939190614431565b60206040518083038186803b1580156117ab57600080fd5b505afa1580156117bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e39190613a51565b905060008114156117f85760009150506118e8565b60005b818110156118e1576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5986846040518363ffffffff1660e01b8152600401611862929190614498565b60206040518083038186803b15801561187a57600080fd5b505afa15801561188e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b29190613a51565b90506118bd8161252b565b6118cd57600193505050506118e8565b5080806118d990614ad5565b9150506117fb565b5060009150505b919050565b6118fe6118f8612597565b8361269a565b61193d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119349061475e565b60405180910390fd5b61194984848484612a9a565b50505050565b60606119596136f1565b60405180610120016040528060fd815260200161579e60fd91398160006013811061198757611986614c0b565b5b602002018190525061199a836000611ff9565b816001601381106119ae576119ad614c0b565b5b60200201819052506040518060600160405280602881526020016158c460289139816002601381106119e3576119e2614c0b565b5b60200201819052506119f6836001611ff9565b81600360138110611a0a57611a09614c0b565b5b60200201819052506040518060600160405280602981526020016157236029913981600460138110611a3f57611a3e614c0b565b5b6020020181905250611a52836002611ff9565b81600560138110611a6657611a65614c0b565b5b602002018190525060405180606001604052806029815260200161589b6029913981600660138110611a9b57611a9a614c0b565b5b6020020181905250611aae836003611ff9565b81600760138110611ac257611ac1614c0b565b5b60200201819052506040518060600160405280602981526020016156916029913981600860138110611af757611af6614c0b565b5b6020020181905250611b0a836004611ff9565b81600960138110611b1e57611b1d614c0b565b5b60200201819052506040518060600160405280602981526020016156ba6029913981600a60138110611b5357611b52614c0b565b5b6020020181905250611b66836005611ff9565b81600b60138110611b7a57611b79614c0b565b5b60200201819052506040518060600160405280602981526020016157756029913981600c60138110611baf57611bae614c0b565b5b6020020181905250611bc2836006611ff9565b81600d60138110611bd657611bd5614c0b565b5b602002018190525060405180606001604052806029815260200161574c6029913981600e60138110611c0b57611c0a614c0b565b5b6020020181905250611c1e836007611ff9565b81600f60138110611c3257611c31614c0b565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601060138110611c8457611c83614c0b565b5b6020020181905250600081600060138110611ca257611ca1614c0b565b5b602002015182600160138110611cbb57611cba614c0b565b5b602002015183600260138110611cd457611cd3614c0b565b5b602002015184600360138110611ced57611cec614c0b565b5b602002015185600460138110611d0657611d05614c0b565b5b602002015186600560138110611d1f57611d1e614c0b565b5b602002015187600660138110611d3857611d37614c0b565b5b602002015188600760138110611d5157611d50614c0b565b5b602002015189600860138110611d6a57611d69614c0b565b5b6020020151604051602001611d87999897969594939291906141e7565b60405160208183030381529060405290508082600960138110611dad57611dac614c0b565b5b602002015183600a60138110611dc657611dc5614c0b565b5b602002015184600b60138110611ddf57611dde614c0b565b5b602002015185600c60138110611df857611df7614c0b565b5b602002015186600d60138110611e1157611e10614c0b565b5b602002015187600e60138110611e2a57611e29614c0b565b5b602002015188600f60138110611e4357611e42614c0b565b5b602002015189601060138110611e5c57611e5b614c0b565b5b6020020151604051602001611e79999897969594939291906141e7565b60405160208183030381529060405290506060611e9585612af6565b611e9e83612c57565b604051602001611eaf9291906143ca565b604051602081830303815290604052905080611ed4611ecf876000611fb7565b612af6565b611ee7611ee2886001611fb7565b612af6565b611efa611ef5896002611fb7565b612af6565b611f0d611f088a6003611fb7565b612af6565b611f20611f1b8b6004611fb7565b612af6565b611f33611f2e8c6005611fb7565b612af6565b611f46611f418d6006611fb7565b612af6565b611f59611f548e6007611fb7565b612af6565b604051602001611f7199989796959493929190614295565b6040516020818303038152906040529050611f8b81612c57565b604051602001611f9b919061440f565b6040516020818303038152906040529150819350505050919050565b6000611fc5838360026120d3565b611fd1848460016120d3565b611fdd858560006120d3565b611fe791906148a7565b611ff191906148a7565b905092915050565b60606120058383610d54565b6120176120128585611fb7565b612af6565b604051602001612028929190614377565b604051602081830303815290604052905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612114846120e285612af6565b6120eb85612af6565b6040516020016120fc929190614266565b60405160208183030381529060405260016006612def565b90509392505050565b6002600a541415612163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a9061479e565b60405180910390fd5b6002600a819055506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016121c89190614431565b60206040518083038186803b1580156121e057600080fd5b505afa1580156121f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122189190613a51565b90506000811161225d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612254906147be565b60405180910390fd5b60005b81811015612345576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b81526004016122c7929190614498565b60206040518083038186803b1580156122df57600080fd5b505afa1580156122f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123179190613a51565b90506123228161252b565b61233157612330338261267c565b5b50808061233d90614ad5565b915050612260565b50506001600a81905550565b612359612597565b73ffffffffffffffffffffffffffffffffffffffff166123776114ec565b73ffffffffffffffffffffffffffffffffffffffff16146123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c4906146de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061457e565b60405180910390fd5b612446816129d4565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061251457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612524575061252382612e5f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126128361106d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612696828260405180602001604052806000815250612ec9565b5050565b60006126a58261252b565b6126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db9061461e565b60405180910390fd5b60006126ef8361106d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061275e57508373ffffffffffffffffffffffffffffffffffffffff166127468461099a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061276f575061276e818561203f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127988261106d565b73ffffffffffffffffffffffffffffffffffffffff16146127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e5906146fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561285e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612855906145be565b60405180910390fd5b612869838383612f24565b61287460008261259f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128c49190614988565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461291b91906148a7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aa5848484612778565b612ab184848484613038565b612af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae79061455e565b60405180910390fd5b50505050565b60606000821415612b3e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c52565b600082905060005b60008214612b70578080612b5990614ad5565b915050600a82612b6991906148fd565b9150612b46565b60008167ffffffffffffffff811115612b8c57612b8b614c3a565b5b6040519080825280601f01601f191660200182016040528015612bbe5781602001600182028036833780820191505090505b5090505b60008514612c4b57600182612bd79190614988565b9150600a85612be69190614b1e565b6030612bf291906148a7565b60f81b818381518110612c0857612c07614c0b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c4491906148fd565b9450612bc2565b8093505050505b919050565b60606000825190506000811415612c805760405180602001604052806000815250915050612dea565b60006003600283612c9191906148a7565b612c9b91906148fd565b6004612ca7919061492e565b90506000602082612cb891906148a7565b67ffffffffffffffff811115612cd157612cd0614c3a565b5b6040519080825280601f01601f191660200182016040528015612d035781602001600182028036833780820191505090505b50905060006040518060600160405280604081526020016156e3604091399050600181016020830160005b86811015612da75760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612d2e565b506003860660018114612dc15760028114612dd157612ddc565b613d3d60f01b6002830352612ddc565b603d60f81b60018303525b508484525050819450505050505b919050565b600080612e2485612dff88612af6565b604051602001612e10929190614192565b6040516020818303038152906040526131cf565b90508360018585612e359190614988565b612e3f91906148a7565b82612e4a9190614b1e565b612e5491906148a7565b915050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ed38383613205565b612ee06000848484613038565b612f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f169061455e565b60405180910390fd5b505050565b612f2f8383836133d3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f7257612f6d816133d8565b612fb1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fb057612faf8382613421565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff457612fef8161358e565b613033565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461303257613031828261365f565b5b5b505050565b60006130598473ffffffffffffffffffffffffffffffffffffffff166136de565b156131c2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613082612597565b8786866040518563ffffffff1660e01b81526004016130a4949392919061444c565b602060405180830381600087803b1580156130be57600080fd5b505af19250505080156130ef57506040513d601f19601f820116820180604052508101906130ec91906139f7565b60015b613172573d806000811461311f576040519150601f19603f3d011682016040523d82523d6000602084013e613124565b606091505b5060008151141561316a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131619061455e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131c7565b600190505b949350505050565b60006013826040516020016131e59291906143a6565b6040516020818303038152906040528051906020012060001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326c9061469e565b60405180910390fd5b61327e8161252b565b156132be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b59061459e565b60405180910390fd5b6132ca60008383612f24565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461331a91906148a7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161342e846113a6565b6134389190614988565b905060006007600084815260200190815260200160002054905081811461351d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135a29190614988565b90506000600960008481526020019081526020016000205490506000600883815481106135d2576135d1614c0b565b5b9060005260206000200154905080600883815481106135f4576135f3614c0b565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061364357613642614bdc565b5b6001900381819060005260206000200160009055905550505050565b600061366a836113a6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6040518061026001604052806013905b60608152602001906001900390816137015790505090565b600061372c6137278461481e565b6147f9565b90508281526020810184848401111561374857613747614c6e565b5b613753848285614a30565b509392505050565b60008135905061376a81615634565b92915050565b60008135905061377f8161564b565b92915050565b60008135905061379481615662565b92915050565b6000815190506137a981615662565b92915050565b600082601f8301126137c4576137c3614c69565b5b81356137d4848260208601613719565b91505092915050565b6000813590506137ec81615679565b92915050565b60008151905061380181615679565b92915050565b60006020828403121561381d5761381c614c78565b5b600061382b8482850161375b565b91505092915050565b6000806040838503121561384b5761384a614c78565b5b60006138598582860161375b565b925050602061386a8582860161375b565b9150509250929050565b60008060006060848603121561388d5761388c614c78565b5b600061389b8682870161375b565b93505060206138ac8682870161375b565b92505060406138bd868287016137dd565b9150509250925092565b600080600080608085870312156138e1576138e0614c78565b5b60006138ef8782880161375b565b94505060206139008782880161375b565b9350506040613911878288016137dd565b925050606085013567ffffffffffffffff81111561393257613931614c73565b5b61393e878288016137af565b91505092959194509250565b6000806040838503121561396157613960614c78565b5b600061396f8582860161375b565b925050602061398085828601613770565b9150509250929050565b600080604083850312156139a1576139a0614c78565b5b60006139af8582860161375b565b92505060206139c0858286016137dd565b9150509250929050565b6000602082840312156139e0576139df614c78565b5b60006139ee84828501613785565b91505092915050565b600060208284031215613a0d57613a0c614c78565b5b6000613a1b8482850161379a565b91505092915050565b600060208284031215613a3a57613a39614c78565b5b6000613a48848285016137dd565b91505092915050565b600060208284031215613a6757613a66614c78565b5b6000613a75848285016137f2565b91505092915050565b60008060408385031215613a9557613a94614c78565b5b6000613aa3858286016137dd565b9250506020613ab4858286016137dd565b9150509250929050565b600080600060608486031215613ad757613ad6614c78565b5b6000613ae5868287016137dd565b9350506020613af6868287016137dd565b9250506040613b07868287016137dd565b9150509250925092565b613b1a816149bc565b82525050565b613b29816149ce565b82525050565b6000613b3a82614864565b613b44818561487a565b9350613b54818560208601614a3f565b613b5d81614c7d565b840191505092915050565b6000613b738261486f565b613b7d818561488b565b9350613b8d818560208601614a3f565b613b9681614c7d565b840191505092915050565b6000613bac8261486f565b613bb6818561489c565b9350613bc6818560208601614a3f565b80840191505092915050565b60008154613bdf81614a72565b613be9818661489c565b94506001821660008114613c045760018114613c1557613c48565b60ff19831686528186019350613c48565b613c1e8561484f565b60005b83811015613c4057815481890152600182019150602081019050613c21565b838801955050505b50505092915050565b6000613c5e603e8361489c565b9150613c6982614c8e565b603e82019050919050565b6000613c81603e8361489c565b9150613c8c82614cdd565b603e82019050919050565b6000613ca460138361488b565b9150613caf82614d2c565b602082019050919050565b6000613cc760168361488b565b9150613cd282614d55565b602082019050919050565b6000613cea60168361489c565b9150613cf582614d7e565b601682019050919050565b6000613d0d602b8361488b565b9150613d1882614da7565b604082019050919050565b6000613d3060328361488b565b9150613d3b82614df6565b604082019050919050565b6000613d5360268361488b565b9150613d5e82614e45565b604082019050919050565b6000613d7660028361489c565b9150613d8182614e94565b600282019050919050565b6000613d99601c8361488b565b9150613da482614ebd565b602082019050919050565b6000613dbc603e8361489c565b9150613dc782614ee6565b603e82019050919050565b6000613ddf603e8361489c565b9150613dea82614f35565b603e82019050919050565b6000613e0260248361488b565b9150613e0d82614f84565b604082019050919050565b6000613e2560538361489c565b9150613e3082614fd3565b605382019050919050565b6000613e4860198361488b565b9150613e5382615048565b602082019050919050565b6000613e6b60188361488b565b9150613e7682615071565b602082019050919050565b6000613e8e602c8361488b565b9150613e998261509a565b604082019050919050565b6000613eb160388361488b565b9150613ebc826150e9565b604082019050919050565b6000613ed4602a8361488b565b9150613edf82615138565b604082019050919050565b6000613ef760298361488b565b9150613f0282615187565b604082019050919050565b6000613f1a60208361488b565b9150613f25826151d6565b602082019050919050565b6000613f3d60038361489c565b9150613f48826151ff565b600382019050919050565b6000613f6060048361489c565b9150613f6b82615228565b600482019050919050565b6000613f83602c8361488b565b9150613f8e82615251565b604082019050919050565b6000613fa660208361488b565b9150613fb1826152a0565b602082019050919050565b6000613fc9603e8361489c565b9150613fd4826152c9565b603e82019050919050565b6000613fec60298361488b565b9150613ff782615318565b604082019050919050565b600061400f60158361488b565b915061401a82615367565b602082019050919050565b6000614032603e8361489c565b915061403d82615390565b603e82019050919050565b600061405560218361488b565b9150614060826153df565b604082019050919050565b6000614078604a8361489c565b91506140838261542e565b604a82019050919050565b600061409b601d8361489c565b91506140a6826154a3565b601d82019050919050565b60006140be603e8361489c565b91506140c9826154cc565b603e82019050919050565b60006140e160318361488b565b91506140ec8261551b565b604082019050919050565b6000614104602c8361488b565b915061410f8261556a565b604082019050919050565b6000614127601f8361488b565b9150614132826155b9565b602082019050919050565b600061414a60038361489c565b9150614155826155e2565b600382019050919050565b600061416d600f8361488b565b91506141788261560b565b602082019050919050565b61418c81614a26565b82525050565b600061419e8285613ba1565b91506141aa8284613ba1565b91508190509392505050565b60006141c28286613ba1565b91506141ce8285613ba1565b91506141da8284613ba1565b9150819050949350505050565b60006141f3828c613ba1565b91506141ff828b613ba1565b915061420b828a613ba1565b91506142178289613ba1565b91506142238288613ba1565b915061422f8287613ba1565b915061423b8286613ba1565b91506142478285613ba1565b91506142538284613ba1565b91508190509a9950505050505050505050565b60006142728285613ba1565b915061427d82613f53565b91506142898284613ba1565b91508190509392505050565b60006142a1828c613ba1565b91506142ac8261406b565b91506142b8828b613ba1565b91506142c3826140b1565b91506142cf828a613ba1565b91506142da82613c74565b91506142e68289613ba1565b91506142f182613dd2565b91506142fd8288613ba1565b915061430882613c51565b91506143148287613ba1565b915061431f82613fbc565b915061432b8286613ba1565b915061433682613daf565b91506143428285613ba1565b915061434d82614025565b91506143598284613ba1565b915061436482613f30565b91508190509a9950505050505050505050565b60006143838285613ba1565b915061438e8261413d565b915061439a8284613ba1565b91508190509392505050565b60006143b28285613bd2565b91506143be8284613ba1565b91508190509392505050565b60006143d582613cdd565b91506143e18285613ba1565b91506143ec82613e18565b91506143f88284613ba1565b915061440382613d69565b91508190509392505050565b600061441a8261408e565b91506144268284613ba1565b915081905092915050565b60006020820190506144466000830184613b11565b92915050565b60006080820190506144616000830187613b11565b61446e6020830186613b11565b61447b6040830185614183565b818103606083015261448d8184613b2f565b905095945050505050565b60006040820190506144ad6000830185613b11565b6144ba6020830184614183565b9392505050565b60006020820190506144d66000830184613b20565b92915050565b600060208201905081810360008301526144f68184613b68565b905092915050565b6000602082019050818103600083015261451781613c97565b9050919050565b6000602082019050818103600083015261453781613cba565b9050919050565b6000602082019050818103600083015261455781613d00565b9050919050565b6000602082019050818103600083015261457781613d23565b9050919050565b6000602082019050818103600083015261459781613d46565b9050919050565b600060208201905081810360008301526145b781613d8c565b9050919050565b600060208201905081810360008301526145d781613df5565b9050919050565b600060208201905081810360008301526145f781613e3b565b9050919050565b6000602082019050818103600083015261461781613e5e565b9050919050565b6000602082019050818103600083015261463781613e81565b9050919050565b6000602082019050818103600083015261465781613ea4565b9050919050565b6000602082019050818103600083015261467781613ec7565b9050919050565b6000602082019050818103600083015261469781613eea565b9050919050565b600060208201905081810360008301526146b781613f0d565b9050919050565b600060208201905081810360008301526146d781613f76565b9050919050565b600060208201905081810360008301526146f781613f99565b9050919050565b6000602082019050818103600083015261471781613fdf565b9050919050565b6000602082019050818103600083015261473781614002565b9050919050565b6000602082019050818103600083015261475781614048565b9050919050565b60006020820190508181036000830152614777816140d4565b9050919050565b60006020820190508181036000830152614797816140f7565b9050919050565b600060208201905081810360008301526147b78161411a565b9050919050565b600060208201905081810360008301526147d781614160565b9050919050565b60006020820190506147f36000830184614183565b92915050565b6000614803614814565b905061480f8282614aa4565b919050565b6000604051905090565b600067ffffffffffffffff82111561483957614838614c3a565b5b61484282614c7d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148b282614a26565b91506148bd83614a26565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148f2576148f1614b4f565b5b828201905092915050565b600061490882614a26565b915061491383614a26565b92508261492357614922614b7e565b5b828204905092915050565b600061493982614a26565b915061494483614a26565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561497d5761497c614b4f565b5b828202905092915050565b600061499382614a26565b915061499e83614a26565b9250828210156149b1576149b0614b4f565b5b828203905092915050565b60006149c782614a06565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a5d578082015181840152602081019050614a42565b83811115614a6c576000848401525b50505050565b60006002820490506001821680614a8a57607f821691505b60208210811415614a9e57614a9d614bad565b5b50919050565b614aad82614c7d565b810181811067ffffffffffffffff82111715614acc57614acb614c3a565b5b80604052505050565b6000614ae082614a26565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b1357614b12614b4f565b5b600182019050919050565b6000614b2982614a26565b9150614b3483614a26565b925082614b4457614b43614b7e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2035222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2033222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e7420757020746f20323000000000000000000000600082015250565b7f7b226e616d65223a202254687265652044696365202300000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2037222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2034222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022456967687420726f6c6c73206f60008201527f662074687265652064696365222c2022696d616765223a2022646174613a696d60208201527f6167652f7376672b786d6c3b6261736536342c00000000000000000000000000604082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e646578657320617265206f7574206f662072616e67650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d5d7d0000000000000000000000000000000000000000000000000000000000600082015250565b7f4449434500000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2036222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f56616c75652073656e7420697320746f6f206c6f770000000000000000000000600082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2038222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f2261747472696275746573223a5b7b2274726169745f74797065223a2022526f60008201527f6c6c2031222c2022646973706c61795f74797065223a20226e756d626572222c60208201527f202276616c7565223a2000000000000000000000000000000000000000000000604082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2032222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f203d200000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f20746f6b656e73206f776e65640000000000000000000000000000000000600082015250565b61563d816149bc565b811461564857600080fd5b50565b615654816149ce565b811461565f57600080fd5b50565b61566b816149da565b811461567657600080fd5b50565b61568281614a26565b811461568d57600080fd5b5056fe3c2f746578743e3c7465787420783d2232302220793d223231302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d223235302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2232302220793d223133302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d223333302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d223239302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20343270783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2232302220793d2235302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d223137302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d2239302220636c6173733d2262617365223ea2646970667358221220aa25970f4f8dc663656b66062e92656c944fcc2d3e1b6ed3491dbe24ce5a0fa164736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101f85760003560e01c806370a082311161010d578063b74f74ed116100a0578063e8c1a35f1161006f578063e8c1a35f14610771578063e985e9c5146107ae578063eafcfebc146107eb578063ee0bd4a014610828578063f2fde38b1461083f576101f8565b8063b74f74ed14610691578063b88d4fde146106ce578063c87b56dd146106f7578063d30069d114610734576101f8565b806395d89b41116100dc57806395d89b41146105e7578063a22cb46514610612578063a945bf801461063b578063a96a789f14610666576101f8565b806370a082311461053d578063715018a61461057a57806385f29ca8146105915780638da5cb5b146105bc576101f8565b806323b872dd1161019057806342842e0e1161015f57806342842e0e146104345780634f6ccce71461045d578063558814191461049a5780636352211e146104d75780636ec21af814610514576101f8565b806323b872dd1461037a5780632adc9faa146103a35780632f745c59146103e05780633ccfd60b1461041d576101f8565b8063095ea7b3116101cc578063095ea7b3146102cd5780630b8dc873146102f657806318160ddd146103335780631f7b4f301461035e576101f8565b8062821de3146101fd57806301ffc9a71461022857806306fdde0314610265578063081812fc14610290575b600080fd5b34801561020957600080fd5b50610212610868565b60405161021f9190614431565b60405180910390f35b34801561023457600080fd5b5061024f600480360381019061024a91906139ca565b61088e565b60405161025c91906144c1565b60405180910390f35b34801561027157600080fd5b5061027a610908565b60405161028791906144dc565b60405180910390f35b34801561029c57600080fd5b506102b760048036038101906102b29190613a24565b61099a565b6040516102c49190614431565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef919061398a565b610a1f565b005b34801561030257600080fd5b5061031d60048036038101906103189190613a7e565b610b37565b60405161032a91906147de565b60405180910390f35b34801561033f57600080fd5b50610348610b4b565b60405161035591906147de565b60405180910390f35b61037860048036038101906103739190613a24565b610b58565b005b34801561038657600080fd5b506103a1600480360381019061039c9190613874565b610cf4565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613a7e565b610d54565b6040516103d791906144dc565b60405180910390f35b3480156103ec57600080fd5b506104076004803603810190610402919061398a565b610da3565b60405161041491906147de565b60405180910390f35b34801561042957600080fd5b50610432610e48565b005b34801561044057600080fd5b5061045b60048036038101906104569190613874565b610f14565b005b34801561046957600080fd5b50610484600480360381019061047f9190613a24565b610f34565b60405161049191906147de565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190613abe565b610fa5565b6040516104ce91906144dc565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613a24565b61106d565b60405161050b9190614431565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190613a7e565b61111f565b005b34801561054957600080fd5b50610564600480360381019061055f9190613807565b6113a6565b60405161057191906147de565b60405180910390f35b34801561058657600080fd5b5061058f61145e565b005b34801561059d57600080fd5b506105a66114e6565b6040516105b391906147de565b60405180910390f35b3480156105c857600080fd5b506105d16114ec565b6040516105de9190614431565b60405180910390f35b3480156105f357600080fd5b506105fc611516565b60405161060991906144dc565b60405180910390f35b34801561061e57600080fd5b506106396004803603810190610634919061394a565b6115a8565b005b34801561064757600080fd5b50610650611729565b60405161065d91906147de565b60405180910390f35b34801561067257600080fd5b5061067b61172f565b60405161068891906147de565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613807565b611735565b6040516106c591906144c1565b60405180910390f35b3480156106da57600080fd5b506106f560048036038101906106f091906138c7565b6118ed565b005b34801561070357600080fd5b5061071e60048036038101906107199190613a24565b61194f565b60405161072b91906144dc565b60405180910390f35b34801561074057600080fd5b5061075b60048036038101906107569190613a7e565b611fb7565b60405161076891906147de565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190613a7e565b611ff9565b6040516107a591906144dc565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613834565b61203f565b6040516107e291906144c1565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613abe565b6120d3565b60405161081f91906147de565b60405180910390f35b34801561083457600080fd5b5061083d61211d565b005b34801561084b57600080fd5b5061086660048036038101906108619190613807565b612351565b005b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610901575061090082612449565b5b9050919050565b60606000805461091790614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461094390614a72565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b5050505050905090565b60006109a58261252b565b6109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db906146be565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a2a8261106d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a929061473e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aba612597565b73ffffffffffffffffffffffffffffffffffffffff161480610ae95750610ae881610ae3612597565b61203f565b5b610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f9061463e565b60405180910390fd5b610b32838361259f565b505050565b6000610b438383611fb7565b905092915050565b6000600880549050905090565b6002600a541415610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b959061479e565b60405180910390fd5b6002600a819055506014811115610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be19061451e565b60405180910390fd5b60105481610bf86011612658565b610c0291906148a7565b1115610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a906144fe565b60405180910390fd5b3481600c54610c52919061492e565b1115610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a9061471e565b60405180910390fd5b60005b81811015610ce857610ca86011612666565b6000600f54610cb76011612658565b610cc191906148a7565b9050610cd4610cce612597565b8261267c565b508080610ce090614ad5565b915050610c96565b506001600a8190555050565b610d05610cff612597565b8261269a565b610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b9061475e565b60405180910390fd5b610d4f838383612778565b505050565b6060610d6283836000610fa5565b610d6e84846001610fa5565b610d7a85856002610fa5565b604051602001610d8c939291906141b6565b604051602081830303815290604052905092915050565b6000610dae836113a6565b8210610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de69061453e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e50612597565b73ffffffffffffffffffffffffffffffffffffffff16610e6e6114ec565b73ffffffffffffffffffffffffffffffffffffffff1614610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb906146de565b60405180910390fd5b610ecc6114ec565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f11573d6000803e3d6000fd5b50565b610f2f838383604051806020016040528060008152506118ed565b505050565b6000610f3e610b4b565b8210610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f769061477e565b60405180910390fd5b60088281548110610f9357610f92614c0b565b5b90600052602060002001549050919050565b606060126001610fb68686866120d3565b610fc09190614988565b81548110610fd157610fd0614c0b565b5b906000526020600020018054610fe690614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461101290614a72565b801561105f5780601f106110345761010080835404028352916020019161105f565b820191906000526020600020905b81548152906001019060200180831161104257829003601f168201915b505050505090509392505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110d9061467e565b60405180910390fd5b80915050919050565b6002600a541415611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115c9061479e565b60405180910390fd5b6002600a819055506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016111ca9190614431565b60206040518083038186803b1580156111e257600080fd5b505afa1580156111f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121a9190613a51565b90506000811161125f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611256906147be565b60405180910390fd5b6000831015801561126f57508082105b6112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a5906145fe565b60405180910390fd5b60008390505b828111611398576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b815260040161131a929190614498565b60206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a9190613a51565b90506113758161252b565b61138457611383338261267c565b5b50808061139090614ad5565b9150506112b4565b50506001600a819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e9061465e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611466612597565b73ffffffffffffffffffffffffffffffffffffffff166114846114ec565b73ffffffffffffffffffffffffffffffffffffffff16146114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d1906146de565b60405180910390fd5b6114e460006129d4565b565b60105481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461152590614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461155190614a72565b801561159e5780601f106115735761010080835404028352916020019161159e565b820191906000526020600020905b81548152906001019060200180831161158157829003601f168201915b5050505050905090565b6115b0612597565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611615906145de565b60405180910390fd5b806005600061162b612597565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116d8612597565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161171d91906144c1565b60405180910390a35050565b600c5481565b600f5481565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016117939190614431565b60206040518083038186803b1580156117ab57600080fd5b505afa1580156117bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e39190613a51565b905060008114156117f85760009150506118e8565b60005b818110156118e1576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5986846040518363ffffffff1660e01b8152600401611862929190614498565b60206040518083038186803b15801561187a57600080fd5b505afa15801561188e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b29190613a51565b90506118bd8161252b565b6118cd57600193505050506118e8565b5080806118d990614ad5565b9150506117fb565b5060009150505b919050565b6118fe6118f8612597565b8361269a565b61193d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119349061475e565b60405180910390fd5b61194984848484612a9a565b50505050565b60606119596136f1565b60405180610120016040528060fd815260200161579e60fd91398160006013811061198757611986614c0b565b5b602002018190525061199a836000611ff9565b816001601381106119ae576119ad614c0b565b5b60200201819052506040518060600160405280602881526020016158c460289139816002601381106119e3576119e2614c0b565b5b60200201819052506119f6836001611ff9565b81600360138110611a0a57611a09614c0b565b5b60200201819052506040518060600160405280602981526020016157236029913981600460138110611a3f57611a3e614c0b565b5b6020020181905250611a52836002611ff9565b81600560138110611a6657611a65614c0b565b5b602002018190525060405180606001604052806029815260200161589b6029913981600660138110611a9b57611a9a614c0b565b5b6020020181905250611aae836003611ff9565b81600760138110611ac257611ac1614c0b565b5b60200201819052506040518060600160405280602981526020016156916029913981600860138110611af757611af6614c0b565b5b6020020181905250611b0a836004611ff9565b81600960138110611b1e57611b1d614c0b565b5b60200201819052506040518060600160405280602981526020016156ba6029913981600a60138110611b5357611b52614c0b565b5b6020020181905250611b66836005611ff9565b81600b60138110611b7a57611b79614c0b565b5b60200201819052506040518060600160405280602981526020016157756029913981600c60138110611baf57611bae614c0b565b5b6020020181905250611bc2836006611ff9565b81600d60138110611bd657611bd5614c0b565b5b602002018190525060405180606001604052806029815260200161574c6029913981600e60138110611c0b57611c0a614c0b565b5b6020020181905250611c1e836007611ff9565b81600f60138110611c3257611c31614c0b565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601060138110611c8457611c83614c0b565b5b6020020181905250600081600060138110611ca257611ca1614c0b565b5b602002015182600160138110611cbb57611cba614c0b565b5b602002015183600260138110611cd457611cd3614c0b565b5b602002015184600360138110611ced57611cec614c0b565b5b602002015185600460138110611d0657611d05614c0b565b5b602002015186600560138110611d1f57611d1e614c0b565b5b602002015187600660138110611d3857611d37614c0b565b5b602002015188600760138110611d5157611d50614c0b565b5b602002015189600860138110611d6a57611d69614c0b565b5b6020020151604051602001611d87999897969594939291906141e7565b60405160208183030381529060405290508082600960138110611dad57611dac614c0b565b5b602002015183600a60138110611dc657611dc5614c0b565b5b602002015184600b60138110611ddf57611dde614c0b565b5b602002015185600c60138110611df857611df7614c0b565b5b602002015186600d60138110611e1157611e10614c0b565b5b602002015187600e60138110611e2a57611e29614c0b565b5b602002015188600f60138110611e4357611e42614c0b565b5b602002015189601060138110611e5c57611e5b614c0b565b5b6020020151604051602001611e79999897969594939291906141e7565b60405160208183030381529060405290506060611e9585612af6565b611e9e83612c57565b604051602001611eaf9291906143ca565b604051602081830303815290604052905080611ed4611ecf876000611fb7565b612af6565b611ee7611ee2886001611fb7565b612af6565b611efa611ef5896002611fb7565b612af6565b611f0d611f088a6003611fb7565b612af6565b611f20611f1b8b6004611fb7565b612af6565b611f33611f2e8c6005611fb7565b612af6565b611f46611f418d6006611fb7565b612af6565b611f59611f548e6007611fb7565b612af6565b604051602001611f7199989796959493929190614295565b6040516020818303038152906040529050611f8b81612c57565b604051602001611f9b919061440f565b6040516020818303038152906040529150819350505050919050565b6000611fc5838360026120d3565b611fd1848460016120d3565b611fdd858560006120d3565b611fe791906148a7565b611ff191906148a7565b905092915050565b60606120058383610d54565b6120176120128585611fb7565b612af6565b604051602001612028929190614377565b604051602081830303815290604052905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612114846120e285612af6565b6120eb85612af6565b6040516020016120fc929190614266565b60405160208183030381529060405260016006612def565b90509392505050565b6002600a541415612163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a9061479e565b60405180910390fd5b6002600a819055506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016121c89190614431565b60206040518083038186803b1580156121e057600080fd5b505afa1580156121f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122189190613a51565b90506000811161225d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612254906147be565b60405180910390fd5b60005b81811015612345576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b81526004016122c7929190614498565b60206040518083038186803b1580156122df57600080fd5b505afa1580156122f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123179190613a51565b90506123228161252b565b61233157612330338261267c565b5b50808061233d90614ad5565b915050612260565b50506001600a81905550565b612359612597565b73ffffffffffffffffffffffffffffffffffffffff166123776114ec565b73ffffffffffffffffffffffffffffffffffffffff16146123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c4906146de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061457e565b60405180910390fd5b612446816129d4565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061251457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612524575061252382612e5f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126128361106d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612696828260405180602001604052806000815250612ec9565b5050565b60006126a58261252b565b6126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db9061461e565b60405180910390fd5b60006126ef8361106d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061275e57508373ffffffffffffffffffffffffffffffffffffffff166127468461099a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061276f575061276e818561203f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127988261106d565b73ffffffffffffffffffffffffffffffffffffffff16146127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e5906146fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561285e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612855906145be565b60405180910390fd5b612869838383612f24565b61287460008261259f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128c49190614988565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461291b91906148a7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aa5848484612778565b612ab184848484613038565b612af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae79061455e565b60405180910390fd5b50505050565b60606000821415612b3e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c52565b600082905060005b60008214612b70578080612b5990614ad5565b915050600a82612b6991906148fd565b9150612b46565b60008167ffffffffffffffff811115612b8c57612b8b614c3a565b5b6040519080825280601f01601f191660200182016040528015612bbe5781602001600182028036833780820191505090505b5090505b60008514612c4b57600182612bd79190614988565b9150600a85612be69190614b1e565b6030612bf291906148a7565b60f81b818381518110612c0857612c07614c0b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c4491906148fd565b9450612bc2565b8093505050505b919050565b60606000825190506000811415612c805760405180602001604052806000815250915050612dea565b60006003600283612c9191906148a7565b612c9b91906148fd565b6004612ca7919061492e565b90506000602082612cb891906148a7565b67ffffffffffffffff811115612cd157612cd0614c3a565b5b6040519080825280601f01601f191660200182016040528015612d035781602001600182028036833780820191505090505b50905060006040518060600160405280604081526020016156e3604091399050600181016020830160005b86811015612da75760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612d2e565b506003860660018114612dc15760028114612dd157612ddc565b613d3d60f01b6002830352612ddc565b603d60f81b60018303525b508484525050819450505050505b919050565b600080612e2485612dff88612af6565b604051602001612e10929190614192565b6040516020818303038152906040526131cf565b90508360018585612e359190614988565b612e3f91906148a7565b82612e4a9190614b1e565b612e5491906148a7565b915050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ed38383613205565b612ee06000848484613038565b612f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f169061455e565b60405180910390fd5b505050565b612f2f8383836133d3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f7257612f6d816133d8565b612fb1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fb057612faf8382613421565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff457612fef8161358e565b613033565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461303257613031828261365f565b5b5b505050565b60006130598473ffffffffffffffffffffffffffffffffffffffff166136de565b156131c2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613082612597565b8786866040518563ffffffff1660e01b81526004016130a4949392919061444c565b602060405180830381600087803b1580156130be57600080fd5b505af19250505080156130ef57506040513d601f19601f820116820180604052508101906130ec91906139f7565b60015b613172573d806000811461311f576040519150601f19603f3d011682016040523d82523d6000602084013e613124565b606091505b5060008151141561316a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131619061455e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131c7565b600190505b949350505050565b60006013826040516020016131e59291906143a6565b6040516020818303038152906040528051906020012060001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326c9061469e565b60405180910390fd5b61327e8161252b565b156132be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b59061459e565b60405180910390fd5b6132ca60008383612f24565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461331a91906148a7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161342e846113a6565b6134389190614988565b905060006007600084815260200190815260200160002054905081811461351d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135a29190614988565b90506000600960008481526020019081526020016000205490506000600883815481106135d2576135d1614c0b565b5b9060005260206000200154905080600883815481106135f4576135f3614c0b565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061364357613642614bdc565b5b6001900381819060005260206000200160009055905550505050565b600061366a836113a6565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6040518061026001604052806013905b60608152602001906001900390816137015790505090565b600061372c6137278461481e565b6147f9565b90508281526020810184848401111561374857613747614c6e565b5b613753848285614a30565b509392505050565b60008135905061376a81615634565b92915050565b60008135905061377f8161564b565b92915050565b60008135905061379481615662565b92915050565b6000815190506137a981615662565b92915050565b600082601f8301126137c4576137c3614c69565b5b81356137d4848260208601613719565b91505092915050565b6000813590506137ec81615679565b92915050565b60008151905061380181615679565b92915050565b60006020828403121561381d5761381c614c78565b5b600061382b8482850161375b565b91505092915050565b6000806040838503121561384b5761384a614c78565b5b60006138598582860161375b565b925050602061386a8582860161375b565b9150509250929050565b60008060006060848603121561388d5761388c614c78565b5b600061389b8682870161375b565b93505060206138ac8682870161375b565b92505060406138bd868287016137dd565b9150509250925092565b600080600080608085870312156138e1576138e0614c78565b5b60006138ef8782880161375b565b94505060206139008782880161375b565b9350506040613911878288016137dd565b925050606085013567ffffffffffffffff81111561393257613931614c73565b5b61393e878288016137af565b91505092959194509250565b6000806040838503121561396157613960614c78565b5b600061396f8582860161375b565b925050602061398085828601613770565b9150509250929050565b600080604083850312156139a1576139a0614c78565b5b60006139af8582860161375b565b92505060206139c0858286016137dd565b9150509250929050565b6000602082840312156139e0576139df614c78565b5b60006139ee84828501613785565b91505092915050565b600060208284031215613a0d57613a0c614c78565b5b6000613a1b8482850161379a565b91505092915050565b600060208284031215613a3a57613a39614c78565b5b6000613a48848285016137dd565b91505092915050565b600060208284031215613a6757613a66614c78565b5b6000613a75848285016137f2565b91505092915050565b60008060408385031215613a9557613a94614c78565b5b6000613aa3858286016137dd565b9250506020613ab4858286016137dd565b9150509250929050565b600080600060608486031215613ad757613ad6614c78565b5b6000613ae5868287016137dd565b9350506020613af6868287016137dd565b9250506040613b07868287016137dd565b9150509250925092565b613b1a816149bc565b82525050565b613b29816149ce565b82525050565b6000613b3a82614864565b613b44818561487a565b9350613b54818560208601614a3f565b613b5d81614c7d565b840191505092915050565b6000613b738261486f565b613b7d818561488b565b9350613b8d818560208601614a3f565b613b9681614c7d565b840191505092915050565b6000613bac8261486f565b613bb6818561489c565b9350613bc6818560208601614a3f565b80840191505092915050565b60008154613bdf81614a72565b613be9818661489c565b94506001821660008114613c045760018114613c1557613c48565b60ff19831686528186019350613c48565b613c1e8561484f565b60005b83811015613c4057815481890152600182019150602081019050613c21565b838801955050505b50505092915050565b6000613c5e603e8361489c565b9150613c6982614c8e565b603e82019050919050565b6000613c81603e8361489c565b9150613c8c82614cdd565b603e82019050919050565b6000613ca460138361488b565b9150613caf82614d2c565b602082019050919050565b6000613cc760168361488b565b9150613cd282614d55565b602082019050919050565b6000613cea60168361489c565b9150613cf582614d7e565b601682019050919050565b6000613d0d602b8361488b565b9150613d1882614da7565b604082019050919050565b6000613d3060328361488b565b9150613d3b82614df6565b604082019050919050565b6000613d5360268361488b565b9150613d5e82614e45565b604082019050919050565b6000613d7660028361489c565b9150613d8182614e94565b600282019050919050565b6000613d99601c8361488b565b9150613da482614ebd565b602082019050919050565b6000613dbc603e8361489c565b9150613dc782614ee6565b603e82019050919050565b6000613ddf603e8361489c565b9150613dea82614f35565b603e82019050919050565b6000613e0260248361488b565b9150613e0d82614f84565b604082019050919050565b6000613e2560538361489c565b9150613e3082614fd3565b605382019050919050565b6000613e4860198361488b565b9150613e5382615048565b602082019050919050565b6000613e6b60188361488b565b9150613e7682615071565b602082019050919050565b6000613e8e602c8361488b565b9150613e998261509a565b604082019050919050565b6000613eb160388361488b565b9150613ebc826150e9565b604082019050919050565b6000613ed4602a8361488b565b9150613edf82615138565b604082019050919050565b6000613ef760298361488b565b9150613f0282615187565b604082019050919050565b6000613f1a60208361488b565b9150613f25826151d6565b602082019050919050565b6000613f3d60038361489c565b9150613f48826151ff565b600382019050919050565b6000613f6060048361489c565b9150613f6b82615228565b600482019050919050565b6000613f83602c8361488b565b9150613f8e82615251565b604082019050919050565b6000613fa660208361488b565b9150613fb1826152a0565b602082019050919050565b6000613fc9603e8361489c565b9150613fd4826152c9565b603e82019050919050565b6000613fec60298361488b565b9150613ff782615318565b604082019050919050565b600061400f60158361488b565b915061401a82615367565b602082019050919050565b6000614032603e8361489c565b915061403d82615390565b603e82019050919050565b600061405560218361488b565b9150614060826153df565b604082019050919050565b6000614078604a8361489c565b91506140838261542e565b604a82019050919050565b600061409b601d8361489c565b91506140a6826154a3565b601d82019050919050565b60006140be603e8361489c565b91506140c9826154cc565b603e82019050919050565b60006140e160318361488b565b91506140ec8261551b565b604082019050919050565b6000614104602c8361488b565b915061410f8261556a565b604082019050919050565b6000614127601f8361488b565b9150614132826155b9565b602082019050919050565b600061414a60038361489c565b9150614155826155e2565b600382019050919050565b600061416d600f8361488b565b91506141788261560b565b602082019050919050565b61418c81614a26565b82525050565b600061419e8285613ba1565b91506141aa8284613ba1565b91508190509392505050565b60006141c28286613ba1565b91506141ce8285613ba1565b91506141da8284613ba1565b9150819050949350505050565b60006141f3828c613ba1565b91506141ff828b613ba1565b915061420b828a613ba1565b91506142178289613ba1565b91506142238288613ba1565b915061422f8287613ba1565b915061423b8286613ba1565b91506142478285613ba1565b91506142538284613ba1565b91508190509a9950505050505050505050565b60006142728285613ba1565b915061427d82613f53565b91506142898284613ba1565b91508190509392505050565b60006142a1828c613ba1565b91506142ac8261406b565b91506142b8828b613ba1565b91506142c3826140b1565b91506142cf828a613ba1565b91506142da82613c74565b91506142e68289613ba1565b91506142f182613dd2565b91506142fd8288613ba1565b915061430882613c51565b91506143148287613ba1565b915061431f82613fbc565b915061432b8286613ba1565b915061433682613daf565b91506143428285613ba1565b915061434d82614025565b91506143598284613ba1565b915061436482613f30565b91508190509a9950505050505050505050565b60006143838285613ba1565b915061438e8261413d565b915061439a8284613ba1565b91508190509392505050565b60006143b28285613bd2565b91506143be8284613ba1565b91508190509392505050565b60006143d582613cdd565b91506143e18285613ba1565b91506143ec82613e18565b91506143f88284613ba1565b915061440382613d69565b91508190509392505050565b600061441a8261408e565b91506144268284613ba1565b915081905092915050565b60006020820190506144466000830184613b11565b92915050565b60006080820190506144616000830187613b11565b61446e6020830186613b11565b61447b6040830185614183565b818103606083015261448d8184613b2f565b905095945050505050565b60006040820190506144ad6000830185613b11565b6144ba6020830184614183565b9392505050565b60006020820190506144d66000830184613b20565b92915050565b600060208201905081810360008301526144f68184613b68565b905092915050565b6000602082019050818103600083015261451781613c97565b9050919050565b6000602082019050818103600083015261453781613cba565b9050919050565b6000602082019050818103600083015261455781613d00565b9050919050565b6000602082019050818103600083015261457781613d23565b9050919050565b6000602082019050818103600083015261459781613d46565b9050919050565b600060208201905081810360008301526145b781613d8c565b9050919050565b600060208201905081810360008301526145d781613df5565b9050919050565b600060208201905081810360008301526145f781613e3b565b9050919050565b6000602082019050818103600083015261461781613e5e565b9050919050565b6000602082019050818103600083015261463781613e81565b9050919050565b6000602082019050818103600083015261465781613ea4565b9050919050565b6000602082019050818103600083015261467781613ec7565b9050919050565b6000602082019050818103600083015261469781613eea565b9050919050565b600060208201905081810360008301526146b781613f0d565b9050919050565b600060208201905081810360008301526146d781613f76565b9050919050565b600060208201905081810360008301526146f781613f99565b9050919050565b6000602082019050818103600083015261471781613fdf565b9050919050565b6000602082019050818103600083015261473781614002565b9050919050565b6000602082019050818103600083015261475781614048565b9050919050565b60006020820190508181036000830152614777816140d4565b9050919050565b60006020820190508181036000830152614797816140f7565b9050919050565b600060208201905081810360008301526147b78161411a565b9050919050565b600060208201905081810360008301526147d781614160565b9050919050565b60006020820190506147f36000830184614183565b92915050565b6000614803614814565b905061480f8282614aa4565b919050565b6000604051905090565b600067ffffffffffffffff82111561483957614838614c3a565b5b61484282614c7d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148b282614a26565b91506148bd83614a26565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148f2576148f1614b4f565b5b828201905092915050565b600061490882614a26565b915061491383614a26565b92508261492357614922614b7e565b5b828204905092915050565b600061493982614a26565b915061494483614a26565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561497d5761497c614b4f565b5b828202905092915050565b600061499382614a26565b915061499e83614a26565b9250828210156149b1576149b0614b4f565b5b828203905092915050565b60006149c782614a06565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a5d578082015181840152602081019050614a42565b83811115614a6c576000848401525b50505050565b60006002820490506001821680614a8a57607f821691505b60208210811415614a9e57614a9d614bad565b5b50919050565b614aad82614c7d565b810181811067ffffffffffffffff82111715614acc57614acb614c3a565b5b80604052505050565b6000614ae082614a26565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b1357614b12614b4f565b5b600182019050919050565b6000614b2982614a26565b9150614b3483614a26565b925082614b4457614b43614b7e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2035222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2033222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e7420757020746f20323000000000000000000000600082015250565b7f7b226e616d65223a202254687265652044696365202300000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2037222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2034222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022456967687420726f6c6c73206f60008201527f662074687265652064696365222c2022696d616765223a2022646174613a696d60208201527f6167652f7376672b786d6c3b6261736536342c00000000000000000000000000604082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e646578657320617265206f7574206f662072616e67650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d5d7d0000000000000000000000000000000000000000000000000000000000600082015250565b7f4449434500000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2036222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f56616c75652073656e7420697320746f6f206c6f770000000000000000000000600082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2038222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f2261747472696275746573223a5b7b2274726169745f74797065223a2022526f60008201527f6c6c2031222c2022646973706c61795f74797065223a20226e756d626572222c60208201527f202276616c7565223a2000000000000000000000000000000000000000000000604082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f7d2c7b2274726169745f74797065223a2022526f6c6c2032222c20226469737060008201527f6c61795f74797065223a20226e756d626572222c202276616c7565223a200000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f203d200000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f20746f6b656e73206f776e65640000000000000000000000000000000000600082015250565b61563d816149bc565b811461564857600080fd5b50565b615654816149ce565b811461565f57600080fd5b50565b61566b816149da565b811461567657600080fd5b50565b61568281614a26565b811461568d57600080fd5b5056fe3c2f746578743e3c7465787420783d2232302220793d223231302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d223235302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2232302220793d223133302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d223333302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d223239302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20343270783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2232302220793d2235302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d223137302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2232302220793d2239302220636c6173733d2262617365223ea2646970667358221220aa25970f4f8dc663656b66062e92656c944fcc2d3e1b6ed3491dbe24ce5a0fa164736f6c63430008070033

Deployed Bytecode Sourcemap

44571:9519:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44721:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38421:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25535:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27094:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26617:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46172:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39061:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52573:542;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27984:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46506:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38729:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53127:104;;;;;;;;;;;;;:::i;:::-;;28394:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39251:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46322:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25229:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51704:851;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24959:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9927:94;;;;;;;;;;;;;:::i;:::-;;44923:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9276:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25704:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27387:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44650:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44877:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51044:642;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28650:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47090:3206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45967:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46806:276;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27753:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45745:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50350:626;;;;;;;;;;;;;:::i;:::-;;10176:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44721:73;;;;;;;;;;;;;:::o;38421:224::-;38523:4;38562:35;38547:50;;;:11;:50;;;;:90;;;;38601:36;38625:11;38601:23;:36::i;:::-;38547:90;38540:97;;38421:224;;;:::o;25535:100::-;25589:13;25622:5;25615:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25535:100;:::o;27094:221::-;27170:7;27198:16;27206:7;27198;:16::i;:::-;27190:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27283:15;:24;27299:7;27283:24;;;;;;;;;;;;;;;;;;;;;27276:31;;27094:221;;;:::o;26617:411::-;26698:13;26714:23;26729:7;26714:14;:23::i;:::-;26698:39;;26762:5;26756:11;;:2;:11;;;;26748:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26856:5;26840:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26865:37;26882:5;26889:12;:10;:12::i;:::-;26865:16;:37::i;:::-;26840:62;26818:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26999:21;27008:2;27012:7;26999:8;:21::i;:::-;26687:341;26617:411;;:::o;46172:138::-;46245:7;46272:30;46288:7;46297:4;46272:15;:30::i;:::-;46265:37;;46172:138;;;;:::o;39061:113::-;39122:7;39149:10;:17;;;;39142:24;;39061:113;:::o;52573:542::-;12215:1;12811:7;;:19;;12803:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12215:1;12944:7;:18;;;;52660:2:::1;52650:6;:12;;52642:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;52747:16;;52737:6;52708:26;:16;:24;:26::i;:::-;:35;;;;:::i;:::-;:55;;52700:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;52830:9;52820:6;52806:11;;:20;;;;:::i;:::-;:33;;52798:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52891:9;52886:221;52908:6;52904:1;:10;52886:221;;;52936:28;:16;:26;:28::i;:::-;52980:17;53029;;53000:26;:16;:24;:26::i;:::-;:46;;;;:::i;:::-;52980:66;;53061:34;53071:12;:10;:12::i;:::-;53085:9;53061;:34::i;:::-;52921:186;52916:3;;;;;:::i;:::-;;;;52886:221;;;;12171:1:::0;13123:7;:22;;;;52573:542;:::o;27984:339::-;28179:41;28198:12;:10;:12::i;:::-;28212:7;28179:18;:41::i;:::-;28171:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28287:28;28297:4;28303:2;28307:7;28287:9;:28::i;:::-;27984:339;;;:::o;46506:288::-;46580:13;46651:31;46665:7;46674:4;46680:1;46651:13;:31::i;:::-;46697;46711:7;46720:4;46726:1;46697:13;:31::i;:::-;46743;46757:7;46766:4;46772:1;46743:13;:31::i;:::-;46620:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46606:180;;46506:288;;;;:::o;38729:256::-;38826:7;38862:23;38879:5;38862:16;:23::i;:::-;38854:5;:31;38846:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38951:12;:19;38964:5;38951:19;;;;;;;;;;;;;;;:26;38971:5;38951:26;;;;;;;;;;;;38944:33;;38729:256;;;;:::o;53127:104::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53183:7:::1;:5;:7::i;:::-;53175:25;;:48;53201:21;53175:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53127:104::o:0;28394:185::-;28532:39;28549:4;28555:2;28559:7;28532:39;;;;;;;;;;;;:16;:39::i;:::-;28394:185;;;:::o;39251:233::-;39326:7;39362:30;:28;:30::i;:::-;39354:5;:38;39346:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39459:10;39470:5;39459:17;;;;;;;;:::i;:::-;;;;;;;;;;39452:24;;39251:233;;;:::o;46322:172::-;46410:13;46443:9;46484:1;46453:28;46461:7;46470:4;46476;46453:7;:28::i;:::-;:32;;;;:::i;:::-;46443:43;;;;;;;;:::i;:::-;;;;;;;;;46436:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46322:172;;;;;:::o;25229:239::-;25301:7;25321:13;25337:7;:16;25345:7;25337:16;;;;;;;;;;;;;;;;;;;;;25321:32;;25389:1;25372:19;;:5;:19;;;;25364:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25455:5;25448:12;;;25229:239;;;:::o;51704:851::-;12215:1;12811:7;;:19;;12803:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12215:1;12944:7;:18;;;;51826:25:::1;51854:11;;;;;;;;;;;:21;;;51876:10;51854:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51826:61;;51926:1;51906:17;:21;51898:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;52001:1;51982:15;:20;;:57;;;;;52022:17;52006:13;:33;51982:57;51960:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;52191:9;52203:15;52191:27;;52186:362;52225:13;52220:1;:18;52186:362;;52260:15;52278:11;;;;;;;;;;;:31;;;52310:10;52322:1;52278:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52260:64;;52454:16;52462:7;52454;:16::i;:::-;52449:88;;52491:30;52501:10;52513:7;52491:9;:30::i;:::-;52449:88;52245:303;52240:3;;;;;:::i;:::-;;;;52186:362;;;;51815:740;12171:1:::0;13123:7;:22;;;;51704:851;;:::o;24959:208::-;25031:7;25076:1;25059:19;;:5;:19;;;;25051:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25143:9;:16;25153:5;25143:16;;;;;;;;;;;;;;;;25136:23;;24959:208;;;:::o;9927:94::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9992:21:::1;10010:1;9992:9;:21::i;:::-;9927:94::o:0;44923:38::-;;;;:::o;9276:87::-;9322:7;9349:6;;;;;;;;;;;9342:13;;9276:87;:::o;25704:104::-;25760:13;25793:7;25786:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25704:104;:::o;27387:295::-;27502:12;:10;:12::i;:::-;27490:24;;:8;:24;;;;27482:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27602:8;27557:18;:32;27576:12;:10;:12::i;:::-;27557:32;;;;;;;;;;;;;;;:42;27590:8;27557:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27655:8;27626:48;;27641:12;:10;:12::i;:::-;27626:48;;;27665:8;27626:48;;;;;;:::i;:::-;;;;;;;;27387:295;;:::o;44650:46::-;;;;:::o;44877:39::-;;;;:::o;51044:642::-;51110:4;51127:25;51155:11;;;;;;;;;;;:21;;;51177:5;51155:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51127:56;;51219:1;51198:17;:22;51194:99;;;51276:5;51269:12;;;;;51194:99;51390:9;51385:217;51409:17;51405:1;:21;51385:217;;;51448:15;51466:11;;;;;;;;;;;:31;;;51498:5;51505:1;51466:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51448:59;;51527:16;51535:7;51527;:16::i;:::-;51522:69;;51571:4;51564:11;;;;;;;51522:69;51433:169;51428:3;;;;;:::i;:::-;;;;51385:217;;;;51673:5;51666:12;;;51044:642;;;;:::o;28650:328::-;28825:41;28844:12;:10;:12::i;:::-;28858:7;28825:18;:41::i;:::-;28817:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28931:39;28945:4;28951:2;28955:7;28964:5;28931:13;:39::i;:::-;28650:328;;;;:::o;47090:3206::-;47155:13;47181:23;;:::i;:::-;47215:266;;;;;;;;;;;;;;;;;:5;47221:1;47215:8;;;;;;;:::i;:::-;;;;;:266;;;;47505:33;47527:7;47536:1;47505:21;:33::i;:::-;47494:5;47500:1;47494:8;;;;;;;:::i;:::-;;;;;:44;;;;47551:53;;;;;;;;;;;;;;;;;:5;47557:1;47551:8;;;;;;;:::i;:::-;;;;;:53;;;;47628:33;47650:7;47659:1;47628:21;:33::i;:::-;47617:5;47623:1;47617:8;;;;;;;:::i;:::-;;;;;:44;;;;47674:54;;;;;;;;;;;;;;;;;:5;47680:1;47674:8;;;;;;;:::i;:::-;;;;;:54;;;;47752:33;47774:7;47783:1;47752:21;:33::i;:::-;47741:5;47747:1;47741:8;;;;;;;:::i;:::-;;;;;:44;;;;47798:54;;;;;;;;;;;;;;;;;:5;47804:1;47798:8;;;;;;;:::i;:::-;;;;;:54;;;;47876:33;47898:7;47907:1;47876:21;:33::i;:::-;47865:5;47871:1;47865:8;;;;;;;:::i;:::-;;;;;:44;;;;47922:54;;;;;;;;;;;;;;;;;:5;47928:1;47922:8;;;;;;;:::i;:::-;;;;;:54;;;;48000:33;48022:7;48031:1;48000:21;:33::i;:::-;47989:5;47995:1;47989:8;;;;;;;:::i;:::-;;;;;:44;;;;48046:55;;;;;;;;;;;;;;;;;:5;48052:2;48046:9;;;;;;;:::i;:::-;;;;;:55;;;;48126:33;48148:7;48157:1;48126:21;:33::i;:::-;48114:5;48120:2;48114:9;;;;;;;:::i;:::-;;;;;:45;;;;48172:55;;;;;;;;;;;;;;;;;:5;48178:2;48172:9;;;;;;;:::i;:::-;;;;;:55;;;;48252:33;48274:7;48283:1;48252:21;:33::i;:::-;48240:5;48246:2;48240:9;;;;;;;:::i;:::-;;;;;:45;;;;48298:55;;;;;;;;;;;;;;;;;:5;48304:2;48298:9;;;;;;;:::i;:::-;;;;;:55;;;;48378:33;48400:7;48409:1;48378:21;:33::i;:::-;48366:5;48372:2;48366:9;;;;;;;:::i;:::-;;;;;:45;;;;48424:27;;;;;;;;;;;;;;;;;:5;48430:2;48424:9;;;;;;;:::i;:::-;;;;;:27;;;;48464:20;48511:5;48517:1;48511:8;;;;;;;:::i;:::-;;;;;;48521:5;48527:1;48521:8;;;;;;;:::i;:::-;;;;;;48531:5;48537:1;48531:8;;;;;;;:::i;:::-;;;;;;48541:5;48547:1;48541:8;;;;;;;:::i;:::-;;;;;;48551:5;48557:1;48551:8;;;;;;;:::i;:::-;;;;;;48561:5;48567:1;48561:8;;;;;;;:::i;:::-;;;;;;48571:5;48577:1;48571:8;;;;;;;:::i;:::-;;;;;;48581:5;48587:1;48581:8;;;;;;;:::i;:::-;;;;;;48591:5;48597:1;48591:8;;;;;;;:::i;:::-;;;;;;48494:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48464:137;;48660:6;48668:5;48674:1;48668:8;;;;;;;:::i;:::-;;;;;;48678:5;48684:2;48678:9;;;;;;;:::i;:::-;;;;;;48689:5;48695:2;48689:9;;;;;;;:::i;:::-;;;;;;48700:5;48706:2;48700:9;;;;;;;:::i;:::-;;;;;;48711:5;48717:2;48711:9;;;;;;;:::i;:::-;;;;;;48722:5;48728:2;48722:9;;;;;;;:::i;:::-;;;;;;48733:5;48739:2;48733:9;;;;;;;:::i;:::-;;;;;;48744:5;48750:2;48744:9;;;;;;;:::i;:::-;;;;;;48643:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48627:128;;48787:18;48898:17;48907:7;48898:8;:17::i;:::-;49004:28;49024:6;49004:13;:28::i;:::-;48855:184;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48841:199;;49109:4;49211:37;49220:27;49236:7;49245:1;49220:15;:27::i;:::-;49211:8;:37::i;:::-;49334;49343:27;49359:7;49368:1;49343:15;:27::i;:::-;49334:8;:37::i;:::-;49457;49466:27;49482:7;49491:1;49466:15;:27::i;:::-;49457:8;:37::i;:::-;49580;49589:27;49605:7;49614:1;49589:15;:27::i;:::-;49580:8;:37::i;:::-;49703;49712:27;49728:7;49737:1;49712:15;:27::i;:::-;49703:8;:37::i;:::-;49826;49835:27;49851:7;49860:1;49835:15;:27::i;:::-;49826:8;:37::i;:::-;49949;49958:27;49974:7;49983:1;49958:15;:27::i;:::-;49949:8;:37::i;:::-;50072;50081:27;50097:7;50106:1;50081:15;:27::i;:::-;50072:8;:37::i;:::-;49092:1043;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49077:1059;;50234:26;50254:4;50234:13;:26::i;:::-;50184:77;;;;;;;;:::i;:::-;;;;;;;;;;;;;50168:94;;50282:6;50275:13;;;;;47090:3206;;;:::o;45967:193::-;46044:7;46127:25;46135:7;46144:4;46150:1;46127:7;:25::i;:::-;46099;46107:7;46116:4;46122:1;46099:7;:25::i;:::-;46071;46079:7;46088:4;46094:1;46071:7;:25::i;:::-;:53;;;;:::i;:::-;:81;;;;:::i;:::-;46064:88;;45967:193;;;;:::o;46806:276::-;46888:13;46959:28;46973:7;46982:4;46959:13;:28::i;:::-;47022:40;47031:30;47047:7;47056:4;47031:15;:30::i;:::-;47022:8;:40::i;:::-;46928:145;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46914:160;;46806:276;;;;:::o;27753:164::-;27850:4;27874:18;:25;27893:5;27874:25;;;;;;;;;;;;;;;:35;27900:8;27874:35;;;;;;;;;;;;;;;;;;;;;;;;;27867:42;;27753:164;;;;:::o;45745:210::-;45827:7;45854:93;45867:7;45900:14;45909:4;45900:8;:14::i;:::-;45924;45933:4;45924:8;:14::i;:::-;45883:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45942:1;45945;45854:12;:93::i;:::-;45847:100;;45745:210;;;;;:::o;50350:626::-;12215:1;12811:7;;:19;;12803:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12215:1;12944:7;:18;;;;50410:25:::1;50438:11;;;;;;;;;;;:21;;;50460:10;50438:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50410:61;;50510:1;50490:17;:21;50482:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50623:9;50618:351;50642:17;50638:1;:21;50618:351;;;50681:15;50699:11;;;;;;;;;;;:31;;;50731:10;50743:1;50699:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50681:64;;50875:16;50883:7;50875;:16::i;:::-;50870:88;;50912:30;50922:10;50934:7;50912:9;:30::i;:::-;50870:88;50666:303;50661:3;;;;;:::i;:::-;;;;50618:351;;;;50399:577;12171:1:::0;13123:7;:22;;;;50350:626::o;10176:192::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10285:1:::1;10265:22;;:8;:22;;;;10257:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10341:19;10351:8;10341:9;:19::i;:::-;10176:192:::0;:::o;24590:305::-;24692:4;24744:25;24729:40;;;:11;:40;;;;:105;;;;24801:33;24786:48;;;:11;:48;;;;24729:105;:158;;;;24851:36;24875:11;24851:23;:36::i;:::-;24729:158;24709:178;;24590:305;;;:::o;30488:127::-;30553:4;30605:1;30577:30;;:7;:16;30585:7;30577:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30570:37;;30488:127;;;:::o;8136:98::-;8189:7;8216:10;8209:17;;8136:98;:::o;34470:174::-;34572:2;34545:15;:24;34561:7;34545:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34628:7;34624:2;34590:46;;34599:23;34614:7;34599:14;:23::i;:::-;34590:46;;;;;;;;;;;;34470:174;;:::o;56816:114::-;56881:7;56908;:14;;;56901:21;;56816:114;;;:::o;56938:127::-;57045:1;57027:7;:14;;;:19;;;;;;;;;;;56938:127;:::o;31472:110::-;31548:26;31558:2;31562:7;31548:26;;;;;;;;;;;;:9;:26::i;:::-;31472:110;;:::o;30782:348::-;30875:4;30900:16;30908:7;30900;:16::i;:::-;30892:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30976:13;30992:23;31007:7;30992:14;:23::i;:::-;30976:39;;31045:5;31034:16;;:7;:16;;;:51;;;;31078:7;31054:31;;:20;31066:7;31054:11;:20::i;:::-;:31;;;31034:51;:87;;;;31089:32;31106:5;31113:7;31089:16;:32::i;:::-;31034:87;31026:96;;;30782:348;;;;:::o;33774:578::-;33933:4;33906:31;;:23;33921:7;33906:14;:23::i;:::-;:31;;;33898:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34016:1;34002:16;;:2;:16;;;;33994:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34072:39;34093:4;34099:2;34103:7;34072:20;:39::i;:::-;34176:29;34193:1;34197:7;34176:8;:29::i;:::-;34237:1;34218:9;:15;34228:4;34218:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34266:1;34249:9;:13;34259:2;34249:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34297:2;34278:7;:16;34286:7;34278:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34336:7;34332:2;34317:27;;34326:4;34317:27;;;;;;;;;;;;33774:578;;;:::o;10376:173::-;10432:16;10451:6;;;;;;;;;;;10432:25;;10477:8;10468:6;;:17;;;;;;;;;;;;;;;;;;10532:8;10501:40;;10522:8;10501:40;;;;;;;;;;;;10421:128;10376:173;:::o;29860:315::-;30017:28;30027:4;30033:2;30037:7;30017:9;:28::i;:::-;30064:48;30087:4;30093:2;30097:7;30106:5;30064:22;:48::i;:::-;30056:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29860:315;;;;:::o;53243:715::-;53299:13;53521:1;53512:5;:10;53508:53;;;53539:10;;;;;;;;;;;;;;;;;;;;;53508:53;53571:12;53586:5;53571:20;;53602:14;53627:78;53642:1;53634:4;:9;53627:78;;53660:8;;;;;:::i;:::-;;;;53691:2;53683:10;;;;;:::i;:::-;;;53627:78;;;53715:19;53747:6;53737:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53715:39;;53765:154;53781:1;53772:5;:10;53765:154;;53809:1;53799:11;;;;;:::i;:::-;;;53876:2;53868:5;:10;;;;:::i;:::-;53855:2;:24;;;;:::i;:::-;53842:39;;53825:6;53832;53825:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;53905:2;53896:11;;;;;:::i;:::-;;;53765:154;;;53943:6;53929:21;;;;;53243:715;;;;:::o;54441:1607::-;54499:13;54525:11;54539:4;:11;54525:25;;54572:1;54565:3;:8;54561:23;;;54575:9;;;;;;;;;;;;;;;;;54561:23;54636:18;54674:1;54669;54663:3;:7;;;;:::i;:::-;54662:13;;;;:::i;:::-;54657:1;:19;;;;:::i;:::-;54636:40;;54734:19;54779:2;54766:10;:15;;;;:::i;:::-;54756:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54734:48;;54795:18;54816:5;;;;;;;;;;;;;;;;;54795:26;;54885:1;54878:5;54874:13;54930:2;54922:6;54918:15;54981:1;54949:777;55004:3;55001:1;54998:10;54949:777;;;55059:1;55056;55052:9;55047:14;;55117:8;55112:1;55106:4;55102:12;55096:19;55092:34;55197:4;55189:5;55185:2;55181:14;55177:25;55167:8;55163:40;55157:47;55236:3;55233:1;55229:11;55222:18;;55327:4;55318;55310:5;55306:2;55302:14;55298:25;55288:8;55284:40;55278:47;55274:58;55269:3;55265:68;55258:75;;55365:3;55362:1;55358:11;55351:18;;55455:4;55446;55438:5;55435:1;55431:13;55427:24;55417:8;55413:39;55407:46;55403:57;55398:3;55394:67;55387:74;;55493:3;55490:1;55486:11;55479:18;;55575:4;55566;55559:5;55555:16;55545:8;55541:31;55535:38;55531:49;55526:3;55522:59;55515:66;;55615:3;55610;55606:13;55599:20;;55657:3;55646:9;55639:22;55709:1;55698:9;55694:17;55681:30;;55028:698;;54949:777;;;54953:44;55758:1;55753:3;55749:11;55779:1;55774:84;;;;55877:1;55872:82;;;;55742:212;;55774:84;55835:6;55830:3;55826:16;55822:1;55811:9;55807:17;55800:43;55774:84;;55872:82;55933:4;55928:3;55924:14;55920:1;55909:9;55905:17;55898:41;55742:212;;55985:10;55977:6;55970:26;54843:1164;;56033:6;56019:21;;;;;;54441:1607;;;;:::o;45456:277::-;45573:7;45593:12;45608:62;45639:9;45650:17;45659:7;45650:8;:17::i;:::-;45622:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45608:6;:62::i;:::-;45593:77;;45719:5;45713:1;45705:5;45697;:13;;;;:::i;:::-;:17;;;;:::i;:::-;45689:4;:26;;;;:::i;:::-;45688:36;;;;:::i;:::-;45681:43;;;45456:277;;;;;;:::o;23197:157::-;23282:4;23321:25;23306:40;;;:11;:40;;;;23299:47;;23197:157;;;:::o;31809:321::-;31939:18;31945:2;31949:7;31939:5;:18::i;:::-;31990:54;32021:1;32025:2;32029:7;32038:5;31990:22;:54::i;:::-;31968:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31809:321;;;:::o;40097:589::-;40241:45;40268:4;40274:2;40278:7;40241:26;:45::i;:::-;40319:1;40303:18;;:4;:18;;;40299:187;;;40338:40;40370:7;40338:31;:40::i;:::-;40299:187;;;40408:2;40400:10;;:4;:10;;;40396:90;;40427:47;40460:4;40466:7;40427:32;:47::i;:::-;40396:90;40299:187;40514:1;40500:16;;:2;:16;;;40496:183;;;40533:45;40570:7;40533:36;:45::i;:::-;40496:183;;;40606:4;40600:10;;:2;:10;;;40596:83;;40627:40;40655:2;40659:7;40627:27;:40::i;:::-;40596:83;40496:183;40097:589;;;:::o;35209:803::-;35364:4;35385:15;:2;:13;;;:15::i;:::-;35381:624;;;35437:2;35421:36;;;35458:12;:10;:12::i;:::-;35472:4;35478:7;35487:5;35421:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35417:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35684:1;35667:6;:13;:18;35663:272;;;35710:60;;;;;;;;;;:::i;:::-;;;;;;;;35663:272;35885:6;35879:13;35870:6;35866:2;35862:15;35855:38;35417:533;35554:45;;;35544:55;;;:6;:55;;;;35537:62;;;;;35381:624;35989:4;35982:11;;35209:803;;;;;;;:::o;45294:150::-;45354:7;45416:10;45428:5;45399:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45389:46;;;;;;45381:55;;45374:62;;45294:150;;;:::o;32466:382::-;32560:1;32546:16;;:2;:16;;;;32538:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32619:16;32627:7;32619;:16::i;:::-;32618:17;32610:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32681:45;32710:1;32714:2;32718:7;32681:20;:45::i;:::-;32756:1;32739:9;:13;32749:2;32739:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32787:2;32768:7;:16;32776:7;32768:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32832:7;32828:2;32807:33;;32824:1;32807:33;;;;;;;;;;;;32466:382;;:::o;36584:126::-;;;;:::o;41409:164::-;41513:10;:17;;;;41486:15;:24;41502:7;41486:24;;;;;;;;;;;:44;;;;41541:10;41557:7;41541:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41409:164;:::o;42200:988::-;42466:22;42516:1;42491:22;42508:4;42491:16;:22::i;:::-;:26;;;;:::i;:::-;42466:51;;42528:18;42549:17;:26;42567:7;42549:26;;;;;;;;;;;;42528:47;;42696:14;42682:10;:28;42678:328;;42727:19;42749:12;:18;42762:4;42749:18;;;;;;;;;;;;;;;:34;42768:14;42749:34;;;;;;;;;;;;42727:56;;42833:11;42800:12;:18;42813:4;42800:18;;;;;;;;;;;;;;;:30;42819:10;42800:30;;;;;;;;;;;:44;;;;42950:10;42917:17;:30;42935:11;42917:30;;;;;;;;;;;:43;;;;42712:294;42678:328;43102:17;:26;43120:7;43102:26;;;;;;;;;;;43095:33;;;43146:12;:18;43159:4;43146:18;;;;;;;;;;;;;;;:34;43165:14;43146:34;;;;;;;;;;;43139:41;;;42281:907;;42200:988;;:::o;43483:1079::-;43736:22;43781:1;43761:10;:17;;;;:21;;;;:::i;:::-;43736:46;;43793:18;43814:15;:24;43830:7;43814:24;;;;;;;;;;;;43793:45;;44165:19;44187:10;44198:14;44187:26;;;;;;;;:::i;:::-;;;;;;;;;;44165:48;;44251:11;44226:10;44237;44226:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44362:10;44331:15;:28;44347:11;44331:28;;;;;;;;;;;:41;;;;44503:15;:24;44519:7;44503:24;;;;;;;;;;;44496:31;;;44538:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43554:1008;;;43483:1079;:::o;40987:221::-;41072:14;41089:20;41106:2;41089:16;:20::i;:::-;41072:37;;41147:7;41120:12;:16;41133:2;41120:16;;;;;;;;;;;;;;;:24;41137:6;41120:24;;;;;;;;;;;:34;;;;41194:6;41165:17;:26;41183:7;41165:26;;;;;;;;;;;:35;;;;41061:147;40987:221;;:::o;15369:387::-;15429:4;15637:12;15704:7;15692:20;15684:28;;15747:1;15740:4;:8;15733:15;;;15369:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:143::-;1556:5;1587:6;1581:13;1572:22;;1603:33;1630:5;1603:33;:::i;:::-;1499:143;;;;:::o;1648:329::-;1707:6;1756:2;1744:9;1735:7;1731:23;1727:32;1724:119;;;1762:79;;:::i;:::-;1724:119;1882:1;1907:53;1952:7;1943:6;1932:9;1928:22;1907:53;:::i;:::-;1897:63;;1853:117;1648:329;;;;:::o;1983:474::-;2051:6;2059;2108:2;2096:9;2087:7;2083:23;2079:32;2076:119;;;2114:79;;:::i;:::-;2076:119;2234:1;2259:53;2304:7;2295:6;2284:9;2280:22;2259:53;:::i;:::-;2249:63;;2205:117;2361:2;2387:53;2432:7;2423:6;2412:9;2408:22;2387:53;:::i;:::-;2377:63;;2332:118;1983:474;;;;;:::o;2463:619::-;2540:6;2548;2556;2605:2;2593:9;2584:7;2580:23;2576:32;2573:119;;;2611:79;;:::i;:::-;2573:119;2731:1;2756:53;2801:7;2792:6;2781:9;2777:22;2756:53;:::i;:::-;2746:63;;2702:117;2858:2;2884:53;2929:7;2920:6;2909:9;2905:22;2884:53;:::i;:::-;2874:63;;2829:118;2986:2;3012:53;3057:7;3048:6;3037:9;3033:22;3012:53;:::i;:::-;3002:63;;2957:118;2463:619;;;;;:::o;3088:943::-;3183:6;3191;3199;3207;3256:3;3244:9;3235:7;3231:23;3227:33;3224:120;;;3263:79;;:::i;:::-;3224:120;3383:1;3408:53;3453:7;3444:6;3433:9;3429:22;3408:53;:::i;:::-;3398:63;;3354:117;3510:2;3536:53;3581:7;3572:6;3561:9;3557:22;3536:53;:::i;:::-;3526:63;;3481:118;3638:2;3664:53;3709:7;3700:6;3689:9;3685:22;3664:53;:::i;:::-;3654:63;;3609:118;3794:2;3783:9;3779:18;3766:32;3825:18;3817:6;3814:30;3811:117;;;3847:79;;:::i;:::-;3811:117;3952:62;4006:7;3997:6;3986:9;3982:22;3952:62;:::i;:::-;3942:72;;3737:287;3088:943;;;;;;;:::o;4037:468::-;4102:6;4110;4159:2;4147:9;4138:7;4134:23;4130:32;4127:119;;;4165:79;;:::i;:::-;4127:119;4285:1;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4256:117;4412:2;4438:50;4480:7;4471:6;4460:9;4456:22;4438:50;:::i;:::-;4428:60;;4383:115;4037:468;;;;;:::o;4511:474::-;4579:6;4587;4636:2;4624:9;4615:7;4611:23;4607:32;4604:119;;;4642:79;;:::i;:::-;4604:119;4762:1;4787:53;4832:7;4823:6;4812:9;4808:22;4787:53;:::i;:::-;4777:63;;4733:117;4889:2;4915:53;4960:7;4951:6;4940:9;4936:22;4915:53;:::i;:::-;4905:63;;4860:118;4511:474;;;;;:::o;4991:327::-;5049:6;5098:2;5086:9;5077:7;5073:23;5069:32;5066:119;;;5104:79;;:::i;:::-;5066:119;5224:1;5249:52;5293:7;5284:6;5273:9;5269:22;5249:52;:::i;:::-;5239:62;;5195:116;4991:327;;;;:::o;5324:349::-;5393:6;5442:2;5430:9;5421:7;5417:23;5413:32;5410:119;;;5448:79;;:::i;:::-;5410:119;5568:1;5593:63;5648:7;5639:6;5628:9;5624:22;5593:63;:::i;:::-;5583:73;;5539:127;5324:349;;;;:::o;5679:329::-;5738:6;5787:2;5775:9;5766:7;5762:23;5758:32;5755:119;;;5793:79;;:::i;:::-;5755:119;5913:1;5938:53;5983:7;5974:6;5963:9;5959:22;5938:53;:::i;:::-;5928:63;;5884:117;5679:329;;;;:::o;6014:351::-;6084:6;6133:2;6121:9;6112:7;6108:23;6104:32;6101:119;;;6139:79;;:::i;:::-;6101:119;6259:1;6284:64;6340:7;6331:6;6320:9;6316:22;6284:64;:::i;:::-;6274:74;;6230:128;6014:351;;;;:::o;6371:474::-;6439:6;6447;6496:2;6484:9;6475:7;6471:23;6467:32;6464:119;;;6502:79;;:::i;:::-;6464:119;6622:1;6647:53;6692:7;6683:6;6672:9;6668:22;6647:53;:::i;:::-;6637:63;;6593:117;6749:2;6775:53;6820:7;6811:6;6800:9;6796:22;6775:53;:::i;:::-;6765:63;;6720:118;6371:474;;;;;:::o;6851:619::-;6928:6;6936;6944;6993:2;6981:9;6972:7;6968:23;6964:32;6961:119;;;6999:79;;:::i;:::-;6961:119;7119:1;7144:53;7189:7;7180:6;7169:9;7165:22;7144:53;:::i;:::-;7134:63;;7090:117;7246:2;7272:53;7317:7;7308:6;7297:9;7293:22;7272:53;:::i;:::-;7262:63;;7217:118;7374:2;7400:53;7445:7;7436:6;7425:9;7421:22;7400:53;:::i;:::-;7390:63;;7345:118;6851:619;;;;;:::o;7476:118::-;7563:24;7581:5;7563:24;:::i;:::-;7558:3;7551:37;7476:118;;:::o;7600:109::-;7681:21;7696:5;7681:21;:::i;:::-;7676:3;7669:34;7600:109;;:::o;7715:360::-;7801:3;7829:38;7861:5;7829:38;:::i;:::-;7883:70;7946:6;7941:3;7883:70;:::i;:::-;7876:77;;7962:52;8007:6;8002:3;7995:4;7988:5;7984:16;7962:52;:::i;:::-;8039:29;8061:6;8039:29;:::i;:::-;8034:3;8030:39;8023:46;;7805:270;7715:360;;;;:::o;8081:364::-;8169:3;8197:39;8230:5;8197:39;:::i;:::-;8252:71;8316:6;8311:3;8252:71;:::i;:::-;8245:78;;8332:52;8377:6;8372:3;8365:4;8358:5;8354:16;8332:52;:::i;:::-;8409:29;8431:6;8409:29;:::i;:::-;8404:3;8400:39;8393:46;;8173:272;8081:364;;;;:::o;8451:377::-;8557:3;8585:39;8618:5;8585:39;:::i;:::-;8640:89;8722:6;8717:3;8640:89;:::i;:::-;8633:96;;8738:52;8783:6;8778:3;8771:4;8764:5;8760:16;8738:52;:::i;:::-;8815:6;8810:3;8806:16;8799:23;;8561:267;8451:377;;;;:::o;8858:845::-;8961:3;8998:5;8992:12;9027:36;9053:9;9027:36;:::i;:::-;9079:89;9161:6;9156:3;9079:89;:::i;:::-;9072:96;;9199:1;9188:9;9184:17;9215:1;9210:137;;;;9361:1;9356:341;;;;9177:520;;9210:137;9294:4;9290:9;9279;9275:25;9270:3;9263:38;9330:6;9325:3;9321:16;9314:23;;9210:137;;9356:341;9423:38;9455:5;9423:38;:::i;:::-;9483:1;9497:154;9511:6;9508:1;9505:13;9497:154;;;9585:7;9579:14;9575:1;9570:3;9566:11;9559:35;9635:1;9626:7;9622:15;9611:26;;9533:4;9530:1;9526:12;9521:17;;9497:154;;;9680:6;9675:3;9671:16;9664:23;;9363:334;;9177:520;;8965:738;;8858:845;;;;:::o;9709:402::-;9869:3;9890:85;9972:2;9967:3;9890:85;:::i;:::-;9883:92;;9984:93;10073:3;9984:93;:::i;:::-;10102:2;10097:3;10093:12;10086:19;;9709:402;;;:::o;10117:::-;10277:3;10298:85;10380:2;10375:3;10298:85;:::i;:::-;10291:92;;10392:93;10481:3;10392:93;:::i;:::-;10510:2;10505:3;10501:12;10494:19;;10117:402;;;:::o;10525:366::-;10667:3;10688:67;10752:2;10747:3;10688:67;:::i;:::-;10681:74;;10764:93;10853:3;10764:93;:::i;:::-;10882:2;10877:3;10873:12;10866:19;;10525:366;;;:::o;10897:::-;11039:3;11060:67;11124:2;11119:3;11060:67;:::i;:::-;11053:74;;11136:93;11225:3;11136:93;:::i;:::-;11254:2;11249:3;11245:12;11238:19;;10897:366;;;:::o;11269:402::-;11429:3;11450:85;11532:2;11527:3;11450:85;:::i;:::-;11443:92;;11544:93;11633:3;11544:93;:::i;:::-;11662:2;11657:3;11653:12;11646:19;;11269:402;;;:::o;11677:366::-;11819:3;11840:67;11904:2;11899:3;11840:67;:::i;:::-;11833:74;;11916:93;12005:3;11916:93;:::i;:::-;12034:2;12029:3;12025:12;12018:19;;11677:366;;;:::o;12049:::-;12191:3;12212:67;12276:2;12271:3;12212:67;:::i;:::-;12205:74;;12288:93;12377:3;12288:93;:::i;:::-;12406:2;12401:3;12397:12;12390:19;;12049:366;;;:::o;12421:::-;12563:3;12584:67;12648:2;12643:3;12584:67;:::i;:::-;12577:74;;12660:93;12749:3;12660:93;:::i;:::-;12778:2;12773:3;12769:12;12762:19;;12421:366;;;:::o;12793:400::-;12953:3;12974:84;13056:1;13051:3;12974:84;:::i;:::-;12967:91;;13067:93;13156:3;13067:93;:::i;:::-;13185:1;13180:3;13176:11;13169:18;;12793:400;;;:::o;13199:366::-;13341:3;13362:67;13426:2;13421:3;13362:67;:::i;:::-;13355:74;;13438:93;13527:3;13438:93;:::i;:::-;13556:2;13551:3;13547:12;13540:19;;13199:366;;;:::o;13571:402::-;13731:3;13752:85;13834:2;13829:3;13752:85;:::i;:::-;13745:92;;13846:93;13935:3;13846:93;:::i;:::-;13964:2;13959:3;13955:12;13948:19;;13571:402;;;:::o;13979:::-;14139:3;14160:85;14242:2;14237:3;14160:85;:::i;:::-;14153:92;;14254:93;14343:3;14254:93;:::i;:::-;14372:2;14367:3;14363:12;14356:19;;13979:402;;;:::o;14387:366::-;14529:3;14550:67;14614:2;14609:3;14550:67;:::i;:::-;14543:74;;14626:93;14715:3;14626:93;:::i;:::-;14744:2;14739:3;14735:12;14728:19;;14387:366;;;:::o;14759:402::-;14919:3;14940:85;15022:2;15017:3;14940:85;:::i;:::-;14933:92;;15034:93;15123:3;15034:93;:::i;:::-;15152:2;15147:3;15143:12;15136:19;;14759:402;;;:::o;15167:366::-;15309:3;15330:67;15394:2;15389:3;15330:67;:::i;:::-;15323:74;;15406:93;15495:3;15406:93;:::i;:::-;15524:2;15519:3;15515:12;15508:19;;15167:366;;;:::o;15539:::-;15681:3;15702:67;15766:2;15761:3;15702:67;:::i;:::-;15695:74;;15778:93;15867:3;15778:93;:::i;:::-;15896:2;15891:3;15887:12;15880:19;;15539:366;;;:::o;15911:::-;16053:3;16074:67;16138:2;16133:3;16074:67;:::i;:::-;16067:74;;16150:93;16239:3;16150:93;:::i;:::-;16268:2;16263:3;16259:12;16252:19;;15911:366;;;:::o;16283:::-;16425:3;16446:67;16510:2;16505:3;16446:67;:::i;:::-;16439:74;;16522:93;16611:3;16522:93;:::i;:::-;16640:2;16635:3;16631:12;16624:19;;16283:366;;;:::o;16655:::-;16797:3;16818:67;16882:2;16877:3;16818:67;:::i;:::-;16811:74;;16894:93;16983:3;16894:93;:::i;:::-;17012:2;17007:3;17003:12;16996:19;;16655:366;;;:::o;17027:::-;17169:3;17190:67;17254:2;17249:3;17190:67;:::i;:::-;17183:74;;17266:93;17355:3;17266:93;:::i;:::-;17384:2;17379:3;17375:12;17368:19;;17027:366;;;:::o;17399:::-;17541:3;17562:67;17626:2;17621:3;17562:67;:::i;:::-;17555:74;;17638:93;17727:3;17638:93;:::i;:::-;17756:2;17751:3;17747:12;17740:19;;17399:366;;;:::o;17771:400::-;17931:3;17952:84;18034:1;18029:3;17952:84;:::i;:::-;17945:91;;18045:93;18134:3;18045:93;:::i;:::-;18163:1;18158:3;18154:11;18147:18;;17771:400;;;:::o;18177:::-;18337:3;18358:84;18440:1;18435:3;18358:84;:::i;:::-;18351:91;;18451:93;18540:3;18451:93;:::i;:::-;18569:1;18564:3;18560:11;18553:18;;18177:400;;;:::o;18583:366::-;18725:3;18746:67;18810:2;18805:3;18746:67;:::i;:::-;18739:74;;18822:93;18911:3;18822:93;:::i;:::-;18940:2;18935:3;18931:12;18924:19;;18583:366;;;:::o;18955:::-;19097:3;19118:67;19182:2;19177:3;19118:67;:::i;:::-;19111:74;;19194:93;19283:3;19194:93;:::i;:::-;19312:2;19307:3;19303:12;19296:19;;18955:366;;;:::o;19327:402::-;19487:3;19508:85;19590:2;19585:3;19508:85;:::i;:::-;19501:92;;19602:93;19691:3;19602:93;:::i;:::-;19720:2;19715:3;19711:12;19704:19;;19327:402;;;:::o;19735:366::-;19877:3;19898:67;19962:2;19957:3;19898:67;:::i;:::-;19891:74;;19974:93;20063:3;19974:93;:::i;:::-;20092:2;20087:3;20083:12;20076:19;;19735:366;;;:::o;20107:::-;20249:3;20270:67;20334:2;20329:3;20270:67;:::i;:::-;20263:74;;20346:93;20435:3;20346:93;:::i;:::-;20464:2;20459:3;20455:12;20448:19;;20107:366;;;:::o;20479:402::-;20639:3;20660:85;20742:2;20737:3;20660:85;:::i;:::-;20653:92;;20754:93;20843:3;20754:93;:::i;:::-;20872:2;20867:3;20863:12;20856:19;;20479:402;;;:::o;20887:366::-;21029:3;21050:67;21114:2;21109:3;21050:67;:::i;:::-;21043:74;;21126:93;21215:3;21126:93;:::i;:::-;21244:2;21239:3;21235:12;21228:19;;20887:366;;;:::o;21259:402::-;21419:3;21440:85;21522:2;21517:3;21440:85;:::i;:::-;21433:92;;21534:93;21623:3;21534:93;:::i;:::-;21652:2;21647:3;21643:12;21636:19;;21259:402;;;:::o;21667:::-;21827:3;21848:85;21930:2;21925:3;21848:85;:::i;:::-;21841:92;;21942:93;22031:3;21942:93;:::i;:::-;22060:2;22055:3;22051:12;22044:19;;21667:402;;;:::o;22075:::-;22235:3;22256:85;22338:2;22333:3;22256:85;:::i;:::-;22249:92;;22350:93;22439:3;22350:93;:::i;:::-;22468:2;22463:3;22459:12;22452:19;;22075:402;;;:::o;22483:366::-;22625:3;22646:67;22710:2;22705:3;22646:67;:::i;:::-;22639:74;;22722:93;22811:3;22722:93;:::i;:::-;22840:2;22835:3;22831:12;22824:19;;22483:366;;;:::o;22855:::-;22997:3;23018:67;23082:2;23077:3;23018:67;:::i;:::-;23011:74;;23094:93;23183:3;23094:93;:::i;:::-;23212:2;23207:3;23203:12;23196:19;;22855:366;;;:::o;23227:::-;23369:3;23390:67;23454:2;23449:3;23390:67;:::i;:::-;23383:74;;23466:93;23555:3;23466:93;:::i;:::-;23584:2;23579:3;23575:12;23568:19;;23227:366;;;:::o;23599:400::-;23759:3;23780:84;23862:1;23857:3;23780:84;:::i;:::-;23773:91;;23873:93;23962:3;23873:93;:::i;:::-;23991:1;23986:3;23982:11;23975:18;;23599:400;;;:::o;24005:366::-;24147:3;24168:67;24232:2;24227:3;24168:67;:::i;:::-;24161:74;;24244:93;24333:3;24244:93;:::i;:::-;24362:2;24357:3;24353:12;24346:19;;24005:366;;;:::o;24377:118::-;24464:24;24482:5;24464:24;:::i;:::-;24459:3;24452:37;24377:118;;:::o;24501:435::-;24681:3;24703:95;24794:3;24785:6;24703:95;:::i;:::-;24696:102;;24815:95;24906:3;24897:6;24815:95;:::i;:::-;24808:102;;24927:3;24920:10;;24501:435;;;;;:::o;24942:595::-;25170:3;25192:95;25283:3;25274:6;25192:95;:::i;:::-;25185:102;;25304:95;25395:3;25386:6;25304:95;:::i;:::-;25297:102;;25416:95;25507:3;25498:6;25416:95;:::i;:::-;25409:102;;25528:3;25521:10;;24942:595;;;;;;:::o;25543:1555::-;26059:3;26081:95;26172:3;26163:6;26081:95;:::i;:::-;26074:102;;26193:95;26284:3;26275:6;26193:95;:::i;:::-;26186:102;;26305:95;26396:3;26387:6;26305:95;:::i;:::-;26298:102;;26417:95;26508:3;26499:6;26417:95;:::i;:::-;26410:102;;26529:95;26620:3;26611:6;26529:95;:::i;:::-;26522:102;;26641:95;26732:3;26723:6;26641:95;:::i;:::-;26634:102;;26753:95;26844:3;26835:6;26753:95;:::i;:::-;26746:102;;26865:95;26956:3;26947:6;26865:95;:::i;:::-;26858:102;;26977:95;27068:3;27059:6;26977:95;:::i;:::-;26970:102;;27089:3;27082:10;;25543:1555;;;;;;;;;;;;:::o;27104:701::-;27385:3;27407:95;27498:3;27489:6;27407:95;:::i;:::-;27400:102;;27519:148;27663:3;27519:148;:::i;:::-;27512:155;;27684:95;27775:3;27766:6;27684:95;:::i;:::-;27677:102;;27796:3;27789:10;;27104:701;;;;;:::o;27811:3949::-;29236:3;29258:95;29349:3;29340:6;29258:95;:::i;:::-;29251:102;;29370:148;29514:3;29370:148;:::i;:::-;29363:155;;29535:95;29626:3;29617:6;29535:95;:::i;:::-;29528:102;;29647:148;29791:3;29647:148;:::i;:::-;29640:155;;29812:95;29903:3;29894:6;29812:95;:::i;:::-;29805:102;;29924:148;30068:3;29924:148;:::i;:::-;29917:155;;30089:95;30180:3;30171:6;30089:95;:::i;:::-;30082:102;;30201:148;30345:3;30201:148;:::i;:::-;30194:155;;30366:95;30457:3;30448:6;30366:95;:::i;:::-;30359:102;;30478:148;30622:3;30478:148;:::i;:::-;30471:155;;30643:95;30734:3;30725:6;30643:95;:::i;:::-;30636:102;;30755:148;30899:3;30755:148;:::i;:::-;30748:155;;30920:95;31011:3;31002:6;30920:95;:::i;:::-;30913:102;;31032:148;31176:3;31032:148;:::i;:::-;31025:155;;31197:95;31288:3;31279:6;31197:95;:::i;:::-;31190:102;;31309:148;31453:3;31309:148;:::i;:::-;31302:155;;31474:95;31565:3;31556:6;31474:95;:::i;:::-;31467:102;;31586:148;31730:3;31586:148;:::i;:::-;31579:155;;31751:3;31744:10;;27811:3949;;;;;;;;;;;;:::o;31766:701::-;32047:3;32069:95;32160:3;32151:6;32069:95;:::i;:::-;32062:102;;32181:148;32325:3;32181:148;:::i;:::-;32174:155;;32346:95;32437:3;32428:6;32346:95;:::i;:::-;32339:102;;32458:3;32451:10;;31766:701;;;;;:::o;32473:429::-;32650:3;32672:92;32760:3;32751:6;32672:92;:::i;:::-;32665:99;;32781:95;32872:3;32863:6;32781:95;:::i;:::-;32774:102;;32893:3;32886:10;;32473:429;;;;;:::o;32908:1233::-;33391:3;33413:148;33557:3;33413:148;:::i;:::-;33406:155;;33578:95;33669:3;33660:6;33578:95;:::i;:::-;33571:102;;33690:148;33834:3;33690:148;:::i;:::-;33683:155;;33855:95;33946:3;33937:6;33855:95;:::i;:::-;33848:102;;33967:148;34111:3;33967:148;:::i;:::-;33960:155;;34132:3;34125:10;;32908:1233;;;;;:::o;34147:541::-;34380:3;34402:148;34546:3;34402:148;:::i;:::-;34395:155;;34567:95;34658:3;34649:6;34567:95;:::i;:::-;34560:102;;34679:3;34672:10;;34147:541;;;;:::o;34694:222::-;34787:4;34825:2;34814:9;34810:18;34802:26;;34838:71;34906:1;34895:9;34891:17;34882:6;34838:71;:::i;:::-;34694:222;;;;:::o;34922:640::-;35117:4;35155:3;35144:9;35140:19;35132:27;;35169:71;35237:1;35226:9;35222:17;35213:6;35169:71;:::i;:::-;35250:72;35318:2;35307:9;35303:18;35294:6;35250:72;:::i;:::-;35332;35400:2;35389:9;35385:18;35376:6;35332:72;:::i;:::-;35451:9;35445:4;35441:20;35436:2;35425:9;35421:18;35414:48;35479:76;35550:4;35541:6;35479:76;:::i;:::-;35471:84;;34922:640;;;;;;;:::o;35568:332::-;35689:4;35727:2;35716:9;35712:18;35704:26;;35740:71;35808:1;35797:9;35793:17;35784:6;35740:71;:::i;:::-;35821:72;35889:2;35878:9;35874:18;35865:6;35821:72;:::i;:::-;35568:332;;;;;:::o;35906:210::-;35993:4;36031:2;36020:9;36016:18;36008:26;;36044:65;36106:1;36095:9;36091:17;36082:6;36044:65;:::i;:::-;35906:210;;;;:::o;36122:313::-;36235:4;36273:2;36262:9;36258:18;36250:26;;36322:9;36316:4;36312:20;36308:1;36297:9;36293:17;36286:47;36350:78;36423:4;36414:6;36350:78;:::i;:::-;36342:86;;36122:313;;;;:::o;36441:419::-;36607:4;36645:2;36634:9;36630:18;36622:26;;36694:9;36688:4;36684:20;36680:1;36669:9;36665:17;36658:47;36722:131;36848:4;36722:131;:::i;:::-;36714:139;;36441:419;;;:::o;36866:::-;37032:4;37070:2;37059:9;37055:18;37047:26;;37119:9;37113:4;37109:20;37105:1;37094:9;37090:17;37083:47;37147:131;37273:4;37147:131;:::i;:::-;37139:139;;36866:419;;;:::o;37291:::-;37457:4;37495:2;37484:9;37480:18;37472:26;;37544:9;37538:4;37534:20;37530:1;37519:9;37515:17;37508:47;37572:131;37698:4;37572:131;:::i;:::-;37564:139;;37291:419;;;:::o;37716:::-;37882:4;37920:2;37909:9;37905:18;37897:26;;37969:9;37963:4;37959:20;37955:1;37944:9;37940:17;37933:47;37997:131;38123:4;37997:131;:::i;:::-;37989:139;;37716:419;;;:::o;38141:::-;38307:4;38345:2;38334:9;38330:18;38322:26;;38394:9;38388:4;38384:20;38380:1;38369:9;38365:17;38358:47;38422:131;38548:4;38422:131;:::i;:::-;38414:139;;38141:419;;;:::o;38566:::-;38732:4;38770:2;38759:9;38755:18;38747:26;;38819:9;38813:4;38809:20;38805:1;38794:9;38790:17;38783:47;38847:131;38973:4;38847:131;:::i;:::-;38839:139;;38566:419;;;:::o;38991:::-;39157:4;39195:2;39184:9;39180:18;39172:26;;39244:9;39238:4;39234:20;39230:1;39219:9;39215:17;39208:47;39272:131;39398:4;39272:131;:::i;:::-;39264:139;;38991:419;;;:::o;39416:::-;39582:4;39620:2;39609:9;39605:18;39597:26;;39669:9;39663:4;39659:20;39655:1;39644:9;39640:17;39633:47;39697:131;39823:4;39697:131;:::i;:::-;39689:139;;39416:419;;;:::o;39841:::-;40007:4;40045:2;40034:9;40030:18;40022:26;;40094:9;40088:4;40084:20;40080:1;40069:9;40065:17;40058:47;40122:131;40248:4;40122:131;:::i;:::-;40114:139;;39841:419;;;:::o;40266:::-;40432:4;40470:2;40459:9;40455:18;40447:26;;40519:9;40513:4;40509:20;40505:1;40494:9;40490:17;40483:47;40547:131;40673:4;40547:131;:::i;:::-;40539:139;;40266:419;;;:::o;40691:::-;40857:4;40895:2;40884:9;40880:18;40872:26;;40944:9;40938:4;40934:20;40930:1;40919:9;40915:17;40908:47;40972:131;41098:4;40972:131;:::i;:::-;40964:139;;40691:419;;;:::o;41116:::-;41282:4;41320:2;41309:9;41305:18;41297:26;;41369:9;41363:4;41359:20;41355:1;41344:9;41340:17;41333:47;41397:131;41523:4;41397:131;:::i;:::-;41389:139;;41116:419;;;:::o;41541:::-;41707:4;41745:2;41734:9;41730:18;41722:26;;41794:9;41788:4;41784:20;41780:1;41769:9;41765:17;41758:47;41822:131;41948:4;41822:131;:::i;:::-;41814:139;;41541:419;;;:::o;41966:::-;42132:4;42170:2;42159:9;42155:18;42147:26;;42219:9;42213:4;42209:20;42205:1;42194:9;42190:17;42183:47;42247:131;42373:4;42247:131;:::i;:::-;42239:139;;41966:419;;;:::o;42391:::-;42557:4;42595:2;42584:9;42580:18;42572:26;;42644:9;42638:4;42634:20;42630:1;42619:9;42615:17;42608:47;42672:131;42798:4;42672:131;:::i;:::-;42664:139;;42391:419;;;:::o;42816:::-;42982:4;43020:2;43009:9;43005:18;42997:26;;43069:9;43063:4;43059:20;43055:1;43044:9;43040:17;43033:47;43097:131;43223:4;43097:131;:::i;:::-;43089:139;;42816:419;;;:::o;43241:::-;43407:4;43445:2;43434:9;43430:18;43422:26;;43494:9;43488:4;43484:20;43480:1;43469:9;43465:17;43458:47;43522:131;43648:4;43522:131;:::i;:::-;43514:139;;43241:419;;;:::o;43666:::-;43832:4;43870:2;43859:9;43855:18;43847:26;;43919:9;43913:4;43909:20;43905:1;43894:9;43890:17;43883:47;43947:131;44073:4;43947:131;:::i;:::-;43939:139;;43666:419;;;:::o;44091:::-;44257:4;44295:2;44284:9;44280:18;44272:26;;44344:9;44338:4;44334:20;44330:1;44319:9;44315:17;44308:47;44372:131;44498:4;44372:131;:::i;:::-;44364:139;;44091:419;;;:::o;44516:::-;44682:4;44720:2;44709:9;44705:18;44697:26;;44769:9;44763:4;44759:20;44755:1;44744:9;44740:17;44733:47;44797:131;44923:4;44797:131;:::i;:::-;44789:139;;44516:419;;;:::o;44941:::-;45107:4;45145:2;45134:9;45130:18;45122:26;;45194:9;45188:4;45184:20;45180:1;45169:9;45165:17;45158:47;45222:131;45348:4;45222:131;:::i;:::-;45214:139;;44941:419;;;:::o;45366:::-;45532:4;45570:2;45559:9;45555:18;45547:26;;45619:9;45613:4;45609:20;45605:1;45594:9;45590:17;45583:47;45647:131;45773:4;45647:131;:::i;:::-;45639:139;;45366:419;;;:::o;45791:::-;45957:4;45995:2;45984:9;45980:18;45972:26;;46044:9;46038:4;46034:20;46030:1;46019:9;46015:17;46008:47;46072:131;46198:4;46072:131;:::i;:::-;46064:139;;45791:419;;;:::o;46216:222::-;46309:4;46347:2;46336:9;46332:18;46324:26;;46360:71;46428:1;46417:9;46413:17;46404:6;46360:71;:::i;:::-;46216:222;;;;:::o;46444:129::-;46478:6;46505:20;;:::i;:::-;46495:30;;46534:33;46562:4;46554:6;46534:33;:::i;:::-;46444:129;;;:::o;46579:75::-;46612:6;46645:2;46639:9;46629:19;;46579:75;:::o;46660:307::-;46721:4;46811:18;46803:6;46800:30;46797:56;;;46833:18;;:::i;:::-;46797:56;46871:29;46893:6;46871:29;:::i;:::-;46863:37;;46955:4;46949;46945:15;46937:23;;46660:307;;;:::o;46973:141::-;47022:4;47045:3;47037:11;;47068:3;47065:1;47058:14;47102:4;47099:1;47089:18;47081:26;;46973:141;;;:::o;47120:98::-;47171:6;47205:5;47199:12;47189:22;;47120:98;;;:::o;47224:99::-;47276:6;47310:5;47304:12;47294:22;;47224:99;;;:::o;47329:168::-;47412:11;47446:6;47441:3;47434:19;47486:4;47481:3;47477:14;47462:29;;47329:168;;;;:::o;47503:169::-;47587:11;47621:6;47616:3;47609:19;47661:4;47656:3;47652:14;47637:29;;47503:169;;;;:::o;47678:148::-;47780:11;47817:3;47802:18;;47678:148;;;;:::o;47832:305::-;47872:3;47891:20;47909:1;47891:20;:::i;:::-;47886:25;;47925:20;47943:1;47925:20;:::i;:::-;47920:25;;48079:1;48011:66;48007:74;48004:1;48001:81;47998:107;;;48085:18;;:::i;:::-;47998:107;48129:1;48126;48122:9;48115:16;;47832:305;;;;:::o;48143:185::-;48183:1;48200:20;48218:1;48200:20;:::i;:::-;48195:25;;48234:20;48252:1;48234:20;:::i;:::-;48229:25;;48273:1;48263:35;;48278:18;;:::i;:::-;48263:35;48320:1;48317;48313:9;48308:14;;48143:185;;;;:::o;48334:348::-;48374:7;48397:20;48415:1;48397:20;:::i;:::-;48392:25;;48431:20;48449:1;48431:20;:::i;:::-;48426:25;;48619:1;48551:66;48547:74;48544:1;48541:81;48536:1;48529:9;48522:17;48518:105;48515:131;;;48626:18;;:::i;:::-;48515:131;48674:1;48671;48667:9;48656:20;;48334:348;;;;:::o;48688:191::-;48728:4;48748:20;48766:1;48748:20;:::i;:::-;48743:25;;48782:20;48800:1;48782:20;:::i;:::-;48777:25;;48821:1;48818;48815:8;48812:34;;;48826:18;;:::i;:::-;48812:34;48871:1;48868;48864:9;48856:17;;48688:191;;;;:::o;48885:96::-;48922:7;48951:24;48969:5;48951:24;:::i;:::-;48940:35;;48885:96;;;:::o;48987:90::-;49021:7;49064:5;49057:13;49050:21;49039:32;;48987:90;;;:::o;49083:149::-;49119:7;49159:66;49152:5;49148:78;49137:89;;49083:149;;;:::o;49238:126::-;49275:7;49315:42;49308:5;49304:54;49293:65;;49238:126;;;:::o;49370:77::-;49407:7;49436:5;49425:16;;49370:77;;;:::o;49453:154::-;49537:6;49532:3;49527;49514:30;49599:1;49590:6;49585:3;49581:16;49574:27;49453:154;;;:::o;49613:307::-;49681:1;49691:113;49705:6;49702:1;49699:13;49691:113;;;49790:1;49785:3;49781:11;49775:18;49771:1;49766:3;49762:11;49755:39;49727:2;49724:1;49720:10;49715:15;;49691:113;;;49822:6;49819:1;49816:13;49813:101;;;49902:1;49893:6;49888:3;49884:16;49877:27;49813:101;49662:258;49613:307;;;:::o;49926:320::-;49970:6;50007:1;50001:4;49997:12;49987:22;;50054:1;50048:4;50044:12;50075:18;50065:81;;50131:4;50123:6;50119:17;50109:27;;50065:81;50193:2;50185:6;50182:14;50162:18;50159:38;50156:84;;;50212:18;;:::i;:::-;50156:84;49977:269;49926:320;;;:::o;50252:281::-;50335:27;50357:4;50335:27;:::i;:::-;50327:6;50323:40;50465:6;50453:10;50450:22;50429:18;50417:10;50414:34;50411:62;50408:88;;;50476:18;;:::i;:::-;50408:88;50516:10;50512:2;50505:22;50295:238;50252:281;;:::o;50539:233::-;50578:3;50601:24;50619:5;50601:24;:::i;:::-;50592:33;;50647:66;50640:5;50637:77;50634:103;;;50717:18;;:::i;:::-;50634:103;50764:1;50757:5;50753:13;50746:20;;50539:233;;;:::o;50778:176::-;50810:1;50827:20;50845:1;50827:20;:::i;:::-;50822:25;;50861:20;50879:1;50861:20;:::i;:::-;50856:25;;50900:1;50890:35;;50905:18;;:::i;:::-;50890:35;50946:1;50943;50939:9;50934:14;;50778:176;;;;:::o;50960:180::-;51008:77;51005:1;50998:88;51105:4;51102:1;51095:15;51129:4;51126:1;51119:15;51146:180;51194:77;51191:1;51184:88;51291:4;51288:1;51281:15;51315:4;51312:1;51305:15;51332:180;51380:77;51377:1;51370:88;51477:4;51474:1;51467:15;51501:4;51498:1;51491:15;51518:180;51566:77;51563:1;51556:88;51663:4;51660:1;51653:15;51687:4;51684:1;51677:15;51704:180;51752:77;51749:1;51742:88;51849:4;51846:1;51839:15;51873:4;51870:1;51863:15;51890:180;51938:77;51935:1;51928:88;52035:4;52032:1;52025:15;52059:4;52056:1;52049:15;52076:117;52185:1;52182;52175:12;52199:117;52308:1;52305;52298:12;52322:117;52431:1;52428;52421:12;52445:117;52554:1;52551;52544:12;52568:102;52609:6;52660:2;52656:7;52651:2;52644:5;52640:14;52636:28;52626:38;;52568:102;;;:::o;52676:315::-;52816:66;52812:1;52804:6;52800:14;52793:90;52917:66;52912:2;52904:6;52900:15;52893:91;52676:315;:::o;52997:::-;53137:66;53133:1;53125:6;53121:14;53114:90;53238:66;53233:2;53225:6;53221:15;53214:91;52997:315;:::o;53318:169::-;53458:21;53454:1;53446:6;53442:14;53435:45;53318:169;:::o;53493:172::-;53633:24;53629:1;53621:6;53617:14;53610:48;53493:172;:::o;53671:214::-;53811:66;53807:1;53799:6;53795:14;53788:90;53671:214;:::o;53891:230::-;54031:34;54027:1;54019:6;54015:14;54008:58;54100:13;54095:2;54087:6;54083:15;54076:38;53891:230;:::o;54127:237::-;54267:34;54263:1;54255:6;54251:14;54244:58;54336:20;54331:2;54323:6;54319:15;54312:45;54127:237;:::o;54370:225::-;54510:34;54506:1;54498:6;54494:14;54487:58;54579:8;54574:2;54566:6;54562:15;54555:33;54370:225;:::o;54601:214::-;54741:66;54737:1;54729:6;54725:14;54718:90;54601:214;:::o;54821:178::-;54961:30;54957:1;54949:6;54945:14;54938:54;54821:178;:::o;55005:315::-;55145:66;55141:1;55133:6;55129:14;55122:90;55246:66;55241:2;55233:6;55229:15;55222:91;55005:315;:::o;55326:::-;55466:66;55462:1;55454:6;55450:14;55443:90;55567:66;55562:2;55554:6;55550:15;55543:91;55326:315;:::o;55647:223::-;55787:34;55783:1;55775:6;55771:14;55764:58;55856:6;55851:2;55843:6;55839:15;55832:31;55647:223;:::o;55876:371::-;56016:66;56012:1;56004:6;56000:14;55993:90;56117:66;56112:2;56104:6;56100:15;56093:91;56218:21;56213:2;56205:6;56201:15;56194:46;55876:371;:::o;56253:175::-;56393:27;56389:1;56381:6;56377:14;56370:51;56253:175;:::o;56434:174::-;56574:26;56570:1;56562:6;56558:14;56551:50;56434:174;:::o;56614:231::-;56754:34;56750:1;56742:6;56738:14;56731:58;56823:14;56818:2;56810:6;56806:15;56799:39;56614:231;:::o;56851:243::-;56991:34;56987:1;56979:6;56975:14;56968:58;57060:26;57055:2;57047:6;57043:15;57036:51;56851:243;:::o;57100:229::-;57240:34;57236:1;57228:6;57224:14;57217:58;57309:12;57304:2;57296:6;57292:15;57285:37;57100:229;:::o;57335:228::-;57475:34;57471:1;57463:6;57459:14;57452:58;57544:11;57539:2;57531:6;57527:15;57520:36;57335:228;:::o;57569:182::-;57709:34;57705:1;57697:6;57693:14;57686:58;57569:182;:::o;57757:141::-;57889:5;57885:1;57877:6;57873:14;57866:29;57757:141;:::o;57900:142::-;58032:6;58028:1;58020:6;58016:14;58009:30;57900:142;:::o;58044:211::-;58176:34;58172:1;58164:6;58160:14;58153:58;58237:14;58232:2;58224:6;58220:15;58213:39;58044:211;:::o;58257:170::-;58389:34;58385:1;58377:6;58373:14;58366:58;58257:170;:::o;58429:295::-;58561:66;58557:1;58549:6;58545:14;58538:90;58654:66;58649:2;58641:6;58637:15;58630:91;58429:295;:::o;58726:208::-;58858:34;58854:1;58846:6;58842:14;58835:58;58919:11;58914:2;58906:6;58902:15;58895:36;58726:208;:::o;58936:159::-;59068:23;59064:1;59056:6;59052:14;59045:47;58936:159;:::o;59097:295::-;59229:66;59225:1;59217:6;59213:14;59206:90;59322:66;59317:2;59309:6;59305:15;59298:91;59097:295;:::o;59394:200::-;59526:34;59522:1;59514:6;59510:14;59503:58;59587:3;59582:2;59574:6;59570:15;59563:28;59394:200;:::o;59596:388::-;59728:66;59724:1;59716:6;59712:14;59705:90;59821:66;59816:2;59808:6;59804:15;59797:91;59914:66;59909:2;59901:6;59897:15;59890:91;59596:388;:::o;59986:167::-;60118:31;60114:1;60106:6;60102:14;60095:55;59986:167;:::o;60155:295::-;60287:66;60283:1;60275:6;60271:14;60264:90;60380:66;60375:2;60367:6;60363:15;60356:91;60155:295;:::o;60452:216::-;60584:34;60580:1;60572:6;60568:14;60561:58;60645:19;60640:2;60632:6;60628:15;60621:44;60452:216;:::o;60670:211::-;60802:34;60798:1;60790:6;60786:14;60779:58;60863:14;60858:2;60850:6;60846:15;60839:39;60670:211;:::o;60883:169::-;61015:33;61011:1;61003:6;60999:14;60992:57;60883:169;:::o;61054:141::-;61186:5;61182:1;61174:6;61170:14;61163:29;61054:141;:::o;61197:153::-;61329:17;61325:1;61317:6;61313:14;61306:41;61197:153;:::o;61352:110::-;61417:24;61435:5;61417:24;:::i;:::-;61410:5;61407:35;61397:63;;61456:1;61453;61446:12;61397:63;61352:110;:::o;61464:104::-;61526:21;61541:5;61526:21;:::i;:::-;61519:5;61516:32;61506:60;;61562:1;61559;61552:12;61506:60;61464:104;:::o;61570:108::-;61634:23;61651:5;61634:23;:::i;:::-;61627:5;61624:34;61614:62;;61672:1;61669;61662:12;61614:62;61570:108;:::o;61680:110::-;61745:24;61763:5;61745:24;:::i;:::-;61738:5;61735:35;61725:63;;61784:1;61781;61774:12;61725:63;61680:110;:::o

Swarm Source

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