ETH Price: $3,251.44 (+2.15%)
Gas: 2 Gwei

Token

Joker is Joking (JJ)
 

Overview

Max Total Supply

387 JJ

Holders

190

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 JJ
0xba55a4ad8b09c532fd5f330768a5c415e5cd689b
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:
JokerNFT

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-02
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

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

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


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

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

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

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

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

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

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

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

// ERC721A.sol
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 1;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: 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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, 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('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract JokerNFT is ERC721A, Ownable {
    
    uint256 MAX_SUPPLY = 4444;
    uint256 Allremain = 4444;
    uint256 public mintRate = 0.006 ether;
    uint256 MintForWallet = 4444;
    string public base_URI = "ipfs://QmQvBbLsfE9AFLAPT5E7vDVyrmU73NvhRcC9K5A3Fww8NN/";
    string public baseExtension = ".json";
    bool public start = true;

    mapping (address => uint256) private MintedBalance;

    constructor() ERC721A("Joker is Joking", "JJ") {}



    function reveal(string memory url) external onlyOwner {
		base_URI = url;
	}

    function withdraw() external payable onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

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


    function pauseStartSwitch() public onlyOwner {
        start = !start;
    }

    function RemainingItem() public view returns (uint256) {
        return Allremain;
    }



    function mint(uint256 quantity) public payable {
        require(start, "Sorry, Minting is paused.");
        require(quantity<=20 , "Sorry, there are only 20 items allowed for each minting.");
        require((totalSupply() + quantity) <= MAX_SUPPLY, "Sorry, There is no more items.");
        
        uint payforNum = quantity;

        if(MintedBalance[msg.sender] == 0){
            payforNum = payforNum - 1;
        }

        require(msg.value >= payforNum * mintRate, "Ether is not enough.");


        _safeMint(msg.sender, quantity);
        MintedBalance[msg.sender] = MintedBalance[msg.sender] + quantity;
        Allremain -= quantity;
    }

    function setRate(uint256 newRate) external onlyOwner {
        mintRate = newRate;
    }
    
    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
        tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
    {
        require(
        _exists(tokenId),
        "ERC721AMetadata: URI query for nonexistent token"
        );
        

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"RemainingItem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"base_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseStartSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600160005561115c60085561115c600955661550f7dca70000600a5561115c600b5560405180606001604052806036815260200162004b2060369139600c9081620000509190620004c1565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d9081620000979190620004c1565b506001600e60006101000a81548160ff021916908315150217905550348015620000c057600080fd5b506040518060400160405280600f81526020017f4a6f6b6572206973204a6f6b696e6700000000000000000000000000000000008152506040518060400160405280600281526020017f4a4a00000000000000000000000000000000000000000000000000000000000081525081600190816200013e9190620004c1565b508060029081620001509190620004c1565b50505062000173620001676200017960201b60201c565b6200018160201b60201c565b620005a8565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002c957607f821691505b602082108103620002df57620002de62000281565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030a565b6200035586836200030a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a26200039c62000396846200036d565b62000377565b6200036d565b9050919050565b6000819050919050565b620003be8362000381565b620003d6620003cd82620003a9565b84845462000317565b825550505050565b600090565b620003ed620003de565b620003fa818484620003b3565b505050565b5b81811015620004225762000416600082620003e3565b60018101905062000400565b5050565b601f82111562000471576200043b81620002e5565b6200044684620002fa565b8101602085101562000456578190505b6200046e6200046585620002fa565b830182620003ff565b50505b505050565b600082821c905092915050565b6000620004966000198460080262000476565b1980831691505092915050565b6000620004b1838362000483565b9150826002028217905092915050565b620004cc8262000247565b67ffffffffffffffff811115620004e857620004e762000252565b5b620004f48254620002b0565b6200050182828562000426565b600060209050601f83116001811462000539576000841562000524578287015190505b620005308582620004a3565b865550620005a0565b601f1984166200054986620002e5565b60005b8281101562000573578489015182556001820191506020850194506020810190506200054c565b868310156200059357848901516200058f601f89168262000483565b8355505b6001600288020188555050505b505050505050565b61456880620005b86000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f7578063a95a91e111610095578063c87b56dd11610064578063c87b56dd14610648578063ca0dcf1614610685578063e985e9c5146106b0578063f2fde38b146106ed576101cd565b8063a95a91e11461059e578063b88d4fde146105c9578063be9a6555146105f2578063c66828621461061d576101cd565b806395d89b41116100d157806395d89b41146105035780639e8903351461052e578063a0712d6814610559578063a22cb46514610575576101cd565b806370a0823114610484578063715018a6146104c15780638da5cb5b146104d8576101cd565b80632f745c591161016f578063438b63001161013e578063438b6300146103a45780634c261247146103e15780634f6ccce71461040a5780636352211e14610447576101cd565b80632f745c591461030b57806334fcf437146103485780633ccfd60b1461037157806342842e0e1461037b576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632e84d90e146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612ae5565b610716565b6040516102069190612b2d565b60405180910390f35b34801561021b57600080fd5b50610224610860565b6040516102319190612be1565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612c39565b6108f2565b60405161026e9190612ca7565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612cee565b610977565b005b3480156102ac57600080fd5b506102b5610a8f565b6040516102c29190612d3d565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612d58565b610aa5565b005b34801561030057600080fd5b50610309610ab5565b005b34801561031757600080fd5b50610332600480360381019061032d9190612cee565b610b5d565b60405161033f9190612d3d565b60405180910390f35b34801561035457600080fd5b5061036f600480360381019061036a9190612c39565b610d4d565b005b610379610dd3565b005b34801561038757600080fd5b506103a2600480360381019061039d9190612d58565b610e9f565b005b3480156103b057600080fd5b506103cb60048036038101906103c69190612dab565b610ebf565b6040516103d89190612e96565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190612fed565b610f6d565b005b34801561041657600080fd5b50610431600480360381019061042c9190612c39565b610ffc565b60405161043e9190612d3d565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190612c39565b61104f565b60405161047b9190612ca7565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190612dab565b611065565b6040516104b89190612d3d565b60405180910390f35b3480156104cd57600080fd5b506104d661114d565b005b3480156104e457600080fd5b506104ed6111d5565b6040516104fa9190612ca7565b60405180910390f35b34801561050f57600080fd5b506105186111ff565b6040516105259190612be1565b60405180910390f35b34801561053a57600080fd5b50610543611291565b6040516105509190612be1565b60405180910390f35b610573600480360381019061056e9190612c39565b61131f565b005b34801561058157600080fd5b5061059c60048036038101906105979190613062565b61156a565b005b3480156105aa57600080fd5b506105b36116ea565b6040516105c09190612d3d565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190613143565b6116f4565b005b3480156105fe57600080fd5b50610607611750565b6040516106149190612b2d565b60405180910390f35b34801561062957600080fd5b50610632611763565b60405161063f9190612be1565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190612c39565b6117f1565b60405161067c9190612be1565b60405180910390f35b34801561069157600080fd5b5061069a61189b565b6040516106a79190612d3d565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d291906131c6565b6118a1565b6040516106e49190612b2d565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190612dab565b611935565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107e157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061084957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610859575061085882611a2c565b5b9050919050565b60606001805461086f90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461089b90613235565b80156108e85780601f106108bd576101008083540402835291602001916108e8565b820191906000526020600020905b8154815290600101906020018083116108cb57829003601f168201915b5050505050905090565b60006108fd82611a96565b61093c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610933906132d8565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109828261104f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e99061336a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a11611aa3565b73ffffffffffffffffffffffffffffffffffffffff161480610a405750610a3f81610a3a611aa3565b6118a1565b5b610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a76906133fc565b60405180910390fd5b610a8a838383611aab565b505050565b60006001600054610aa0919061344b565b905090565b610ab0838383611b5d565b505050565b610abd611aa3565b73ffffffffffffffffffffffffffffffffffffffff16610adb6111d5565b73ffffffffffffffffffffffffffffffffffffffff1614610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906134cb565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6000610b6883611065565b8210610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba09061355d565b60405180910390fd5b6000610bb3610a8f565b905060008060005b83811015610d0b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cad57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cfd57868403610cf4578195505050505050610d47565b83806001019450505b508080600101915050610bbb565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e906135ef565b60405180910390fd5b92915050565b610d55611aa3565b73ffffffffffffffffffffffffffffffffffffffff16610d736111d5565b73ffffffffffffffffffffffffffffffffffffffff1614610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906134cb565b60405180910390fd5b80600a8190555050565b610ddb611aa3565b73ffffffffffffffffffffffffffffffffffffffff16610df96111d5565b73ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e46906134cb565b60405180910390fd5b610e576111d5565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e9c573d6000803e3d6000fd5b50565b610eba838383604051806020016040528060008152506116f4565b505050565b60606000610ecc83611065565b905060008167ffffffffffffffff811115610eea57610ee9612ec2565b5b604051908082528060200260200182016040528015610f185781602001602082028036833780820191505090505b50905060005b82811015610f6257610f308582610b5d565b828281518110610f4357610f4261360f565b5b6020026020010181815250508080610f5a9061363e565b915050610f1e565b508092505050919050565b610f75611aa3565b73ffffffffffffffffffffffffffffffffffffffff16610f936111d5565b73ffffffffffffffffffffffffffffffffffffffff1614610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe0906134cb565b60405180910390fd5b80600c9081610ff89190613832565b5050565b6000611006610a8f565b8210611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90613976565b60405180910390fd5b819050919050565b600061105a8261209b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc90613a08565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611155611aa3565b73ffffffffffffffffffffffffffffffffffffffff166111736111d5565b73ffffffffffffffffffffffffffffffffffffffff16146111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c0906134cb565b60405180910390fd5b6111d36000612235565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461120e90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461123a90613235565b80156112875780601f1061125c57610100808354040283529160200191611287565b820191906000526020600020905b81548152906001019060200180831161126a57829003601f168201915b5050505050905090565b600c805461129e90613235565b80601f01602080910402602001604051908101604052809291908181526020018280546112ca90613235565b80156113175780601f106112ec57610100808354040283529160200191611317565b820191906000526020600020905b8154815290600101906020018083116112fa57829003601f168201915b505050505081565b600e60009054906101000a900460ff1661136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590613a74565b60405180910390fd5b60148111156113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a990613b06565b60405180910390fd5b600854816113be610a8f565b6113c89190613b26565b1115611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090613bc8565b60405180910390fd5b60008190506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540361146557600181611462919061344b565b90505b600a54816114739190613be8565b3410156114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90613c8e565b60405180910390fd5b6114bf33836122fb565b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461150a9190613b26565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816009600082825461155f919061344b565b925050819055505050565b611572611aa3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690613cfa565b60405180910390fd5b80600660006115ec611aa3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611699611aa3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116de9190612b2d565b60405180910390a35050565b6000600954905090565b6116ff848484611b5d565b61170b84848484612319565b61174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174190613d8c565b60405180910390fd5b50505050565b600e60009054906101000a900460ff1681565b600d805461177090613235565b80601f016020809104026020016040519081016040528092919081815260200182805461179c90613235565b80156117e95780601f106117be576101008083540402835291602001916117e9565b820191906000526020600020905b8154815290600101906020018083116117cc57829003601f168201915b505050505081565b60606117fc82611a96565b61183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290613e1e565b60405180910390fd5b60006118456124a0565b905060008151116118655760405180602001604052806000815250611893565b8061186f84612532565b600d60405160200161188393929190613efd565b6040516020818303038152906040525b915050919050565b600a5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61193d611aa3565b73ffffffffffffffffffffffffffffffffffffffff1661195b6111d5565b73ffffffffffffffffffffffffffffffffffffffff16146119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a8906134cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1790613fa0565b60405180910390fd5b611a2981612235565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611b688261209b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611b8f611aa3565b73ffffffffffffffffffffffffffffffffffffffff161480611beb5750611bb4611aa3565b73ffffffffffffffffffffffffffffffffffffffff16611bd3846108f2565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c075750611c068260000151611c01611aa3565b6118a1565b5b905080611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090614032565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb2906140c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2190614156565b60405180910390fd5b611d378585856001612692565b611d476000848460000151611aab565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361202b57611f8a81611a96565b1561202a5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120948585856001612698565b5050505050565b6120a3612a3f565b6120ac82611a96565b6120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e2906141e8565b60405180910390fd5b60008290505b600081106121f4576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121e5578092505050612230565b508080600190039150506120f1565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122279061427a565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61231582826040518060200160405280600081525061269e565b5050565b600061233a8473ffffffffffffffffffffffffffffffffffffffff166126b0565b15612493578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612363611aa3565b8786866040518563ffffffff1660e01b815260040161238594939291906142ef565b6020604051808303816000875af19250505080156123c157506040513d601f19601f820116820180604052508101906123be9190614350565b60015b612443573d80600081146123f1576040519150601f19603f3d011682016040523d82523d6000602084013e6123f6565b606091505b50600081510361243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243290613d8c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612498565b600190505b949350505050565b6060600c80546124af90613235565b80601f01602080910402602001604051908101604052809291908181526020018280546124db90613235565b80156125285780601f106124fd57610100808354040283529160200191612528565b820191906000526020600020905b81548152906001019060200180831161250b57829003601f168201915b5050505050905090565b606060008203612579576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061268d565b600082905060005b600082146125ab5780806125949061363e565b915050600a826125a491906143ac565b9150612581565b60008167ffffffffffffffff8111156125c7576125c6612ec2565b5b6040519080825280601f01601f1916602001820160405280156125f95781602001600182028036833780820191505090505b5090505b6000851461268657600182612612919061344b565b9150600a8561262191906143dd565b603061262d9190613b26565b60f81b8183815181106126435761264261360f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561267f91906143ac565b94506125fd565b8093505050505b919050565b50505050565b50505050565b6126ab83838360016126c3565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90614480565b60405180910390fd5b6000840361277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614512565b60405180910390fd5b6127886000868387612692565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612a2257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612a0d576129cd6000888488612319565b612a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0390613d8c565b60405180910390fd5b5b81806001019250508080600101915050612956565b508060008190555050612a386000868387612698565b5050505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ac281612a8d565b8114612acd57600080fd5b50565b600081359050612adf81612ab9565b92915050565b600060208284031215612afb57612afa612a83565b5b6000612b0984828501612ad0565b91505092915050565b60008115159050919050565b612b2781612b12565b82525050565b6000602082019050612b426000830184612b1e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b82578082015181840152602081019050612b67565b83811115612b91576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bb382612b48565b612bbd8185612b53565b9350612bcd818560208601612b64565b612bd681612b97565b840191505092915050565b60006020820190508181036000830152612bfb8184612ba8565b905092915050565b6000819050919050565b612c1681612c03565b8114612c2157600080fd5b50565b600081359050612c3381612c0d565b92915050565b600060208284031215612c4f57612c4e612a83565b5b6000612c5d84828501612c24565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c9182612c66565b9050919050565b612ca181612c86565b82525050565b6000602082019050612cbc6000830184612c98565b92915050565b612ccb81612c86565b8114612cd657600080fd5b50565b600081359050612ce881612cc2565b92915050565b60008060408385031215612d0557612d04612a83565b5b6000612d1385828601612cd9565b9250506020612d2485828601612c24565b9150509250929050565b612d3781612c03565b82525050565b6000602082019050612d526000830184612d2e565b92915050565b600080600060608486031215612d7157612d70612a83565b5b6000612d7f86828701612cd9565b9350506020612d9086828701612cd9565b9250506040612da186828701612c24565b9150509250925092565b600060208284031215612dc157612dc0612a83565b5b6000612dcf84828501612cd9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e0d81612c03565b82525050565b6000612e1f8383612e04565b60208301905092915050565b6000602082019050919050565b6000612e4382612dd8565b612e4d8185612de3565b9350612e5883612df4565b8060005b83811015612e89578151612e708882612e13565b9750612e7b83612e2b565b925050600181019050612e5c565b5085935050505092915050565b60006020820190508181036000830152612eb08184612e38565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612efa82612b97565b810181811067ffffffffffffffff82111715612f1957612f18612ec2565b5b80604052505050565b6000612f2c612a79565b9050612f388282612ef1565b919050565b600067ffffffffffffffff821115612f5857612f57612ec2565b5b612f6182612b97565b9050602081019050919050565b82818337600083830152505050565b6000612f90612f8b84612f3d565b612f22565b905082815260208101848484011115612fac57612fab612ebd565b5b612fb7848285612f6e565b509392505050565b600082601f830112612fd457612fd3612eb8565b5b8135612fe4848260208601612f7d565b91505092915050565b60006020828403121561300357613002612a83565b5b600082013567ffffffffffffffff81111561302157613020612a88565b5b61302d84828501612fbf565b91505092915050565b61303f81612b12565b811461304a57600080fd5b50565b60008135905061305c81613036565b92915050565b6000806040838503121561307957613078612a83565b5b600061308785828601612cd9565b92505060206130988582860161304d565b9150509250929050565b600067ffffffffffffffff8211156130bd576130bc612ec2565b5b6130c682612b97565b9050602081019050919050565b60006130e66130e1846130a2565b612f22565b90508281526020810184848401111561310257613101612ebd565b5b61310d848285612f6e565b509392505050565b600082601f83011261312a57613129612eb8565b5b813561313a8482602086016130d3565b91505092915050565b6000806000806080858703121561315d5761315c612a83565b5b600061316b87828801612cd9565b945050602061317c87828801612cd9565b935050604061318d87828801612c24565b925050606085013567ffffffffffffffff8111156131ae576131ad612a88565b5b6131ba87828801613115565b91505092959194509250565b600080604083850312156131dd576131dc612a83565b5b60006131eb85828601612cd9565b92505060206131fc85828601612cd9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061324d57607f821691505b6020821081036132605761325f613206565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006132c2602d83612b53565b91506132cd82613266565b604082019050919050565b600060208201905081810360008301526132f1816132b5565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613354602283612b53565b915061335f826132f8565b604082019050919050565b6000602082019050818103600083015261338381613347565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006133e6603983612b53565b91506133f18261338a565b604082019050919050565b60006020820190508181036000830152613415816133d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061345682612c03565b915061346183612c03565b9250828210156134745761347361341c565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134b5602083612b53565b91506134c08261347f565b602082019050919050565b600060208201905081810360008301526134e4816134a8565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613547602283612b53565b9150613552826134eb565b604082019050919050565b600060208201905081810360008301526135768161353a565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006135d9602e83612b53565b91506135e48261357d565b604082019050919050565b60006020820190508181036000830152613608816135cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061364982612c03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361367b5761367a61341c565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136ab565b6136f286836136ab565b95508019841693508086168417925050509392505050565b6000819050919050565b600061372f61372a61372584612c03565b61370a565b612c03565b9050919050565b6000819050919050565b61374983613714565b61375d61375582613736565b8484546136b8565b825550505050565b600090565b613772613765565b61377d818484613740565b505050565b5b818110156137a15761379660008261376a565b600181019050613783565b5050565b601f8211156137e6576137b781613686565b6137c08461369b565b810160208510156137cf578190505b6137e36137db8561369b565b830182613782565b50505b505050565b600082821c905092915050565b6000613809600019846008026137eb565b1980831691505092915050565b600061382283836137f8565b9150826002028217905092915050565b61383b82612b48565b67ffffffffffffffff81111561385457613853612ec2565b5b61385e8254613235565b6138698282856137a5565b600060209050601f83116001811461389c576000841561388a578287015190505b6138948582613816565b8655506138fc565b601f1984166138aa86613686565b60005b828110156138d2578489015182556001820191506020850194506020810190506138ad565b868310156138ef57848901516138eb601f8916826137f8565b8355505b6001600288020188555050505b505050505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613960602383612b53565b915061396b82613904565b604082019050919050565b6000602082019050818103600083015261398f81613953565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006139f2602b83612b53565b91506139fd82613996565b604082019050919050565b60006020820190508181036000830152613a21816139e5565b9050919050565b7f536f7272792c204d696e74696e67206973207061757365642e00000000000000600082015250565b6000613a5e601983612b53565b9150613a6982613a28565b602082019050919050565b60006020820190508181036000830152613a8d81613a51565b9050919050565b7f536f7272792c20746865726520617265206f6e6c79203230206974656d73206160008201527f6c6c6f77656420666f722065616368206d696e74696e672e0000000000000000602082015250565b6000613af0603883612b53565b9150613afb82613a94565b604082019050919050565b60006020820190508181036000830152613b1f81613ae3565b9050919050565b6000613b3182612c03565b9150613b3c83612c03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b7157613b7061341c565b5b828201905092915050565b7f536f7272792c205468657265206973206e6f206d6f7265206974656d732e0000600082015250565b6000613bb2601e83612b53565b9150613bbd82613b7c565b602082019050919050565b60006020820190508181036000830152613be181613ba5565b9050919050565b6000613bf382612c03565b9150613bfe83612c03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3757613c3661341c565b5b828202905092915050565b7f4574686572206973206e6f7420656e6f7567682e000000000000000000000000600082015250565b6000613c78601483612b53565b9150613c8382613c42565b602082019050919050565b60006020820190508181036000830152613ca781613c6b565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613ce4601a83612b53565b9150613cef82613cae565b602082019050919050565b60006020820190508181036000830152613d1381613cd7565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613d76603383612b53565b9150613d8182613d1a565b604082019050919050565b60006020820190508181036000830152613da581613d69565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000613e08603083612b53565b9150613e1382613dac565b604082019050919050565b60006020820190508181036000830152613e3781613dfb565b9050919050565b600081905092915050565b6000613e5482612b48565b613e5e8185613e3e565b9350613e6e818560208601612b64565b80840191505092915050565b60008154613e8781613235565b613e918186613e3e565b94506001821660008114613eac5760018114613ec157613ef4565b60ff1983168652811515820286019350613ef4565b613eca85613686565b60005b83811015613eec57815481890152600182019150602081019050613ecd565b838801955050505b50505092915050565b6000613f098286613e49565b9150613f158285613e49565b9150613f218284613e7a565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f8a602683612b53565b9150613f9582613f2e565b604082019050919050565b60006020820190508181036000830152613fb981613f7d565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061401c603283612b53565b915061402782613fc0565b604082019050919050565b6000602082019050818103600083015261404b8161400f565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006140ae602683612b53565b91506140b982614052565b604082019050919050565b600060208201905081810360008301526140dd816140a1565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614140602583612b53565b915061414b826140e4565b604082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006141d2602a83612b53565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614264602f83612b53565b915061426f82614208565b604082019050919050565b6000602082019050818103600083015261429381614257565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006142c18261429a565b6142cb81856142a5565b93506142db818560208601612b64565b6142e481612b97565b840191505092915050565b60006080820190506143046000830187612c98565b6143116020830186612c98565b61431e6040830185612d2e565b818103606083015261433081846142b6565b905095945050505050565b60008151905061434a81612ab9565b92915050565b60006020828403121561436657614365612a83565b5b60006143748482850161433b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143b782612c03565b91506143c283612c03565b9250826143d2576143d161437d565b5b828204905092915050565b60006143e882612c03565b91506143f383612c03565b9250826144035761440261437d565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061446a602183612b53565b91506144758261440e565b604082019050919050565b600060208201905081810360008301526144998161445d565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b60006144fc602883612b53565b9150614507826144a0565b604082019050919050565b6000602082019050818103600083015261452b816144ef565b905091905056fea2646970667358221220f211b43aec843b2aa7705d00891ec8de0f7648f3a35c4d598d7edcdedf6bf68f64736f6c634300080f0033697066733a2f2f516d517642624c7366453941464c41505435453776445679726d5537334e7668526343394b354133467777384e4e2f

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806370a08231116100f7578063a95a91e111610095578063c87b56dd11610064578063c87b56dd14610648578063ca0dcf1614610685578063e985e9c5146106b0578063f2fde38b146106ed576101cd565b8063a95a91e11461059e578063b88d4fde146105c9578063be9a6555146105f2578063c66828621461061d576101cd565b806395d89b41116100d157806395d89b41146105035780639e8903351461052e578063a0712d6814610559578063a22cb46514610575576101cd565b806370a0823114610484578063715018a6146104c15780638da5cb5b146104d8576101cd565b80632f745c591161016f578063438b63001161013e578063438b6300146103a45780634c261247146103e15780634f6ccce71461040a5780636352211e14610447576101cd565b80632f745c591461030b57806334fcf437146103485780633ccfd60b1461037157806342842e0e1461037b576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632e84d90e146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612ae5565b610716565b6040516102069190612b2d565b60405180910390f35b34801561021b57600080fd5b50610224610860565b6040516102319190612be1565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612c39565b6108f2565b60405161026e9190612ca7565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612cee565b610977565b005b3480156102ac57600080fd5b506102b5610a8f565b6040516102c29190612d3d565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612d58565b610aa5565b005b34801561030057600080fd5b50610309610ab5565b005b34801561031757600080fd5b50610332600480360381019061032d9190612cee565b610b5d565b60405161033f9190612d3d565b60405180910390f35b34801561035457600080fd5b5061036f600480360381019061036a9190612c39565b610d4d565b005b610379610dd3565b005b34801561038757600080fd5b506103a2600480360381019061039d9190612d58565b610e9f565b005b3480156103b057600080fd5b506103cb60048036038101906103c69190612dab565b610ebf565b6040516103d89190612e96565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190612fed565b610f6d565b005b34801561041657600080fd5b50610431600480360381019061042c9190612c39565b610ffc565b60405161043e9190612d3d565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190612c39565b61104f565b60405161047b9190612ca7565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190612dab565b611065565b6040516104b89190612d3d565b60405180910390f35b3480156104cd57600080fd5b506104d661114d565b005b3480156104e457600080fd5b506104ed6111d5565b6040516104fa9190612ca7565b60405180910390f35b34801561050f57600080fd5b506105186111ff565b6040516105259190612be1565b60405180910390f35b34801561053a57600080fd5b50610543611291565b6040516105509190612be1565b60405180910390f35b610573600480360381019061056e9190612c39565b61131f565b005b34801561058157600080fd5b5061059c60048036038101906105979190613062565b61156a565b005b3480156105aa57600080fd5b506105b36116ea565b6040516105c09190612d3d565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190613143565b6116f4565b005b3480156105fe57600080fd5b50610607611750565b6040516106149190612b2d565b60405180910390f35b34801561062957600080fd5b50610632611763565b60405161063f9190612be1565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190612c39565b6117f1565b60405161067c9190612be1565b60405180910390f35b34801561069157600080fd5b5061069a61189b565b6040516106a79190612d3d565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d291906131c6565b6118a1565b6040516106e49190612b2d565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190612dab565b611935565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107e157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061084957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610859575061085882611a2c565b5b9050919050565b60606001805461086f90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461089b90613235565b80156108e85780601f106108bd576101008083540402835291602001916108e8565b820191906000526020600020905b8154815290600101906020018083116108cb57829003601f168201915b5050505050905090565b60006108fd82611a96565b61093c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610933906132d8565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109828261104f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e99061336a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a11611aa3565b73ffffffffffffffffffffffffffffffffffffffff161480610a405750610a3f81610a3a611aa3565b6118a1565b5b610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a76906133fc565b60405180910390fd5b610a8a838383611aab565b505050565b60006001600054610aa0919061344b565b905090565b610ab0838383611b5d565b505050565b610abd611aa3565b73ffffffffffffffffffffffffffffffffffffffff16610adb6111d5565b73ffffffffffffffffffffffffffffffffffffffff1614610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906134cb565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6000610b6883611065565b8210610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba09061355d565b60405180910390fd5b6000610bb3610a8f565b905060008060005b83811015610d0b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cad57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cfd57868403610cf4578195505050505050610d47565b83806001019450505b508080600101915050610bbb565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e906135ef565b60405180910390fd5b92915050565b610d55611aa3565b73ffffffffffffffffffffffffffffffffffffffff16610d736111d5565b73ffffffffffffffffffffffffffffffffffffffff1614610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906134cb565b60405180910390fd5b80600a8190555050565b610ddb611aa3565b73ffffffffffffffffffffffffffffffffffffffff16610df96111d5565b73ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e46906134cb565b60405180910390fd5b610e576111d5565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e9c573d6000803e3d6000fd5b50565b610eba838383604051806020016040528060008152506116f4565b505050565b60606000610ecc83611065565b905060008167ffffffffffffffff811115610eea57610ee9612ec2565b5b604051908082528060200260200182016040528015610f185781602001602082028036833780820191505090505b50905060005b82811015610f6257610f308582610b5d565b828281518110610f4357610f4261360f565b5b6020026020010181815250508080610f5a9061363e565b915050610f1e565b508092505050919050565b610f75611aa3565b73ffffffffffffffffffffffffffffffffffffffff16610f936111d5565b73ffffffffffffffffffffffffffffffffffffffff1614610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe0906134cb565b60405180910390fd5b80600c9081610ff89190613832565b5050565b6000611006610a8f565b8210611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90613976565b60405180910390fd5b819050919050565b600061105a8261209b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc90613a08565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611155611aa3565b73ffffffffffffffffffffffffffffffffffffffff166111736111d5565b73ffffffffffffffffffffffffffffffffffffffff16146111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c0906134cb565b60405180910390fd5b6111d36000612235565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461120e90613235565b80601f016020809104026020016040519081016040528092919081815260200182805461123a90613235565b80156112875780601f1061125c57610100808354040283529160200191611287565b820191906000526020600020905b81548152906001019060200180831161126a57829003601f168201915b5050505050905090565b600c805461129e90613235565b80601f01602080910402602001604051908101604052809291908181526020018280546112ca90613235565b80156113175780601f106112ec57610100808354040283529160200191611317565b820191906000526020600020905b8154815290600101906020018083116112fa57829003601f168201915b505050505081565b600e60009054906101000a900460ff1661136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590613a74565b60405180910390fd5b60148111156113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a990613b06565b60405180910390fd5b600854816113be610a8f565b6113c89190613b26565b1115611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090613bc8565b60405180910390fd5b60008190506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540361146557600181611462919061344b565b90505b600a54816114739190613be8565b3410156114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90613c8e565b60405180910390fd5b6114bf33836122fb565b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461150a9190613b26565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816009600082825461155f919061344b565b925050819055505050565b611572611aa3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690613cfa565b60405180910390fd5b80600660006115ec611aa3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611699611aa3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116de9190612b2d565b60405180910390a35050565b6000600954905090565b6116ff848484611b5d565b61170b84848484612319565b61174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174190613d8c565b60405180910390fd5b50505050565b600e60009054906101000a900460ff1681565b600d805461177090613235565b80601f016020809104026020016040519081016040528092919081815260200182805461179c90613235565b80156117e95780601f106117be576101008083540402835291602001916117e9565b820191906000526020600020905b8154815290600101906020018083116117cc57829003601f168201915b505050505081565b60606117fc82611a96565b61183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290613e1e565b60405180910390fd5b60006118456124a0565b905060008151116118655760405180602001604052806000815250611893565b8061186f84612532565b600d60405160200161188393929190613efd565b6040516020818303038152906040525b915050919050565b600a5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61193d611aa3565b73ffffffffffffffffffffffffffffffffffffffff1661195b6111d5565b73ffffffffffffffffffffffffffffffffffffffff16146119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a8906134cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1790613fa0565b60405180910390fd5b611a2981612235565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611b688261209b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611b8f611aa3565b73ffffffffffffffffffffffffffffffffffffffff161480611beb5750611bb4611aa3565b73ffffffffffffffffffffffffffffffffffffffff16611bd3846108f2565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c075750611c068260000151611c01611aa3565b6118a1565b5b905080611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090614032565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb2906140c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2190614156565b60405180910390fd5b611d378585856001612692565b611d476000848460000151611aab565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361202b57611f8a81611a96565b1561202a5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120948585856001612698565b5050505050565b6120a3612a3f565b6120ac82611a96565b6120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e2906141e8565b60405180910390fd5b60008290505b600081106121f4576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121e5578092505050612230565b508080600190039150506120f1565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122279061427a565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61231582826040518060200160405280600081525061269e565b5050565b600061233a8473ffffffffffffffffffffffffffffffffffffffff166126b0565b15612493578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612363611aa3565b8786866040518563ffffffff1660e01b815260040161238594939291906142ef565b6020604051808303816000875af19250505080156123c157506040513d601f19601f820116820180604052508101906123be9190614350565b60015b612443573d80600081146123f1576040519150601f19603f3d011682016040523d82523d6000602084013e6123f6565b606091505b50600081510361243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243290613d8c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612498565b600190505b949350505050565b6060600c80546124af90613235565b80601f01602080910402602001604051908101604052809291908181526020018280546124db90613235565b80156125285780601f106124fd57610100808354040283529160200191612528565b820191906000526020600020905b81548152906001019060200180831161250b57829003601f168201915b5050505050905090565b606060008203612579576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061268d565b600082905060005b600082146125ab5780806125949061363e565b915050600a826125a491906143ac565b9150612581565b60008167ffffffffffffffff8111156125c7576125c6612ec2565b5b6040519080825280601f01601f1916602001820160405280156125f95781602001600182028036833780820191505090505b5090505b6000851461268657600182612612919061344b565b9150600a8561262191906143dd565b603061262d9190613b26565b60f81b8183815181106126435761264261360f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561267f91906143ac565b94506125fd565b8093505050505b919050565b50505050565b50505050565b6126ab83838360016126c3565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90614480565b60405180910390fd5b6000840361277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614512565b60405180910390fd5b6127886000868387612692565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612a2257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612a0d576129cd6000888488612319565b612a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0390613d8c565b60405180910390fd5b5b81806001019250508080600101915050612956565b508060008190555050612a386000868387612698565b5050505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ac281612a8d565b8114612acd57600080fd5b50565b600081359050612adf81612ab9565b92915050565b600060208284031215612afb57612afa612a83565b5b6000612b0984828501612ad0565b91505092915050565b60008115159050919050565b612b2781612b12565b82525050565b6000602082019050612b426000830184612b1e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b82578082015181840152602081019050612b67565b83811115612b91576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bb382612b48565b612bbd8185612b53565b9350612bcd818560208601612b64565b612bd681612b97565b840191505092915050565b60006020820190508181036000830152612bfb8184612ba8565b905092915050565b6000819050919050565b612c1681612c03565b8114612c2157600080fd5b50565b600081359050612c3381612c0d565b92915050565b600060208284031215612c4f57612c4e612a83565b5b6000612c5d84828501612c24565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c9182612c66565b9050919050565b612ca181612c86565b82525050565b6000602082019050612cbc6000830184612c98565b92915050565b612ccb81612c86565b8114612cd657600080fd5b50565b600081359050612ce881612cc2565b92915050565b60008060408385031215612d0557612d04612a83565b5b6000612d1385828601612cd9565b9250506020612d2485828601612c24565b9150509250929050565b612d3781612c03565b82525050565b6000602082019050612d526000830184612d2e565b92915050565b600080600060608486031215612d7157612d70612a83565b5b6000612d7f86828701612cd9565b9350506020612d9086828701612cd9565b9250506040612da186828701612c24565b9150509250925092565b600060208284031215612dc157612dc0612a83565b5b6000612dcf84828501612cd9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e0d81612c03565b82525050565b6000612e1f8383612e04565b60208301905092915050565b6000602082019050919050565b6000612e4382612dd8565b612e4d8185612de3565b9350612e5883612df4565b8060005b83811015612e89578151612e708882612e13565b9750612e7b83612e2b565b925050600181019050612e5c565b5085935050505092915050565b60006020820190508181036000830152612eb08184612e38565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612efa82612b97565b810181811067ffffffffffffffff82111715612f1957612f18612ec2565b5b80604052505050565b6000612f2c612a79565b9050612f388282612ef1565b919050565b600067ffffffffffffffff821115612f5857612f57612ec2565b5b612f6182612b97565b9050602081019050919050565b82818337600083830152505050565b6000612f90612f8b84612f3d565b612f22565b905082815260208101848484011115612fac57612fab612ebd565b5b612fb7848285612f6e565b509392505050565b600082601f830112612fd457612fd3612eb8565b5b8135612fe4848260208601612f7d565b91505092915050565b60006020828403121561300357613002612a83565b5b600082013567ffffffffffffffff81111561302157613020612a88565b5b61302d84828501612fbf565b91505092915050565b61303f81612b12565b811461304a57600080fd5b50565b60008135905061305c81613036565b92915050565b6000806040838503121561307957613078612a83565b5b600061308785828601612cd9565b92505060206130988582860161304d565b9150509250929050565b600067ffffffffffffffff8211156130bd576130bc612ec2565b5b6130c682612b97565b9050602081019050919050565b60006130e66130e1846130a2565b612f22565b90508281526020810184848401111561310257613101612ebd565b5b61310d848285612f6e565b509392505050565b600082601f83011261312a57613129612eb8565b5b813561313a8482602086016130d3565b91505092915050565b6000806000806080858703121561315d5761315c612a83565b5b600061316b87828801612cd9565b945050602061317c87828801612cd9565b935050604061318d87828801612c24565b925050606085013567ffffffffffffffff8111156131ae576131ad612a88565b5b6131ba87828801613115565b91505092959194509250565b600080604083850312156131dd576131dc612a83565b5b60006131eb85828601612cd9565b92505060206131fc85828601612cd9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061324d57607f821691505b6020821081036132605761325f613206565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006132c2602d83612b53565b91506132cd82613266565b604082019050919050565b600060208201905081810360008301526132f1816132b5565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613354602283612b53565b915061335f826132f8565b604082019050919050565b6000602082019050818103600083015261338381613347565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006133e6603983612b53565b91506133f18261338a565b604082019050919050565b60006020820190508181036000830152613415816133d9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061345682612c03565b915061346183612c03565b9250828210156134745761347361341c565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134b5602083612b53565b91506134c08261347f565b602082019050919050565b600060208201905081810360008301526134e4816134a8565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613547602283612b53565b9150613552826134eb565b604082019050919050565b600060208201905081810360008301526135768161353a565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006135d9602e83612b53565b91506135e48261357d565b604082019050919050565b60006020820190508181036000830152613608816135cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061364982612c03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361367b5761367a61341c565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136ab565b6136f286836136ab565b95508019841693508086168417925050509392505050565b6000819050919050565b600061372f61372a61372584612c03565b61370a565b612c03565b9050919050565b6000819050919050565b61374983613714565b61375d61375582613736565b8484546136b8565b825550505050565b600090565b613772613765565b61377d818484613740565b505050565b5b818110156137a15761379660008261376a565b600181019050613783565b5050565b601f8211156137e6576137b781613686565b6137c08461369b565b810160208510156137cf578190505b6137e36137db8561369b565b830182613782565b50505b505050565b600082821c905092915050565b6000613809600019846008026137eb565b1980831691505092915050565b600061382283836137f8565b9150826002028217905092915050565b61383b82612b48565b67ffffffffffffffff81111561385457613853612ec2565b5b61385e8254613235565b6138698282856137a5565b600060209050601f83116001811461389c576000841561388a578287015190505b6138948582613816565b8655506138fc565b601f1984166138aa86613686565b60005b828110156138d2578489015182556001820191506020850194506020810190506138ad565b868310156138ef57848901516138eb601f8916826137f8565b8355505b6001600288020188555050505b505050505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613960602383612b53565b915061396b82613904565b604082019050919050565b6000602082019050818103600083015261398f81613953565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006139f2602b83612b53565b91506139fd82613996565b604082019050919050565b60006020820190508181036000830152613a21816139e5565b9050919050565b7f536f7272792c204d696e74696e67206973207061757365642e00000000000000600082015250565b6000613a5e601983612b53565b9150613a6982613a28565b602082019050919050565b60006020820190508181036000830152613a8d81613a51565b9050919050565b7f536f7272792c20746865726520617265206f6e6c79203230206974656d73206160008201527f6c6c6f77656420666f722065616368206d696e74696e672e0000000000000000602082015250565b6000613af0603883612b53565b9150613afb82613a94565b604082019050919050565b60006020820190508181036000830152613b1f81613ae3565b9050919050565b6000613b3182612c03565b9150613b3c83612c03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b7157613b7061341c565b5b828201905092915050565b7f536f7272792c205468657265206973206e6f206d6f7265206974656d732e0000600082015250565b6000613bb2601e83612b53565b9150613bbd82613b7c565b602082019050919050565b60006020820190508181036000830152613be181613ba5565b9050919050565b6000613bf382612c03565b9150613bfe83612c03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c3757613c3661341c565b5b828202905092915050565b7f4574686572206973206e6f7420656e6f7567682e000000000000000000000000600082015250565b6000613c78601483612b53565b9150613c8382613c42565b602082019050919050565b60006020820190508181036000830152613ca781613c6b565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613ce4601a83612b53565b9150613cef82613cae565b602082019050919050565b60006020820190508181036000830152613d1381613cd7565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613d76603383612b53565b9150613d8182613d1a565b604082019050919050565b60006020820190508181036000830152613da581613d69565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000613e08603083612b53565b9150613e1382613dac565b604082019050919050565b60006020820190508181036000830152613e3781613dfb565b9050919050565b600081905092915050565b6000613e5482612b48565b613e5e8185613e3e565b9350613e6e818560208601612b64565b80840191505092915050565b60008154613e8781613235565b613e918186613e3e565b94506001821660008114613eac5760018114613ec157613ef4565b60ff1983168652811515820286019350613ef4565b613eca85613686565b60005b83811015613eec57815481890152600182019150602081019050613ecd565b838801955050505b50505092915050565b6000613f098286613e49565b9150613f158285613e49565b9150613f218284613e7a565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f8a602683612b53565b9150613f9582613f2e565b604082019050919050565b60006020820190508181036000830152613fb981613f7d565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061401c603283612b53565b915061402782613fc0565b604082019050919050565b6000602082019050818103600083015261404b8161400f565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006140ae602683612b53565b91506140b982614052565b604082019050919050565b600060208201905081810360008301526140dd816140a1565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614140602583612b53565b915061414b826140e4565b604082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006141d2602a83612b53565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614264602f83612b53565b915061426f82614208565b604082019050919050565b6000602082019050818103600083015261429381614257565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006142c18261429a565b6142cb81856142a5565b93506142db818560208601612b64565b6142e481612b97565b840191505092915050565b60006080820190506143046000830187612c98565b6143116020830186612c98565b61431e6040830185612d2e565b818103606083015261433081846142b6565b905095945050505050565b60008151905061434a81612ab9565b92915050565b60006020828403121561436657614365612a83565b5b60006143748482850161433b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143b782612c03565b91506143c283612c03565b9250826143d2576143d161437d565b5b828204905092915050565b60006143e882612c03565b91506143f383612c03565b9250826144035761440261437d565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061446a602183612b53565b91506144758261440e565b604082019050919050565b600060208201905081810360008301526144998161445d565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b60006144fc602883612b53565b9150614507826144a0565b604082019050919050565b6000602082019050818103600083015261452b816144ef565b905091905056fea2646970667358221220f211b43aec843b2aa7705d00891ec8de0f7648f3a35c4d598d7edcdedf6bf68f64736f6c634300080f0033

Deployed Bytecode Sourcemap

37774:2639:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24650:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26536:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28098:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27619:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22905:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28974:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38571:78;;;;;;;;;;;;;:::i;:::-;;23571:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39439:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38338:114;;;:::i;:::-;;29207:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39541:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38252:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23084:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26345:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25086:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4395:94;;;;;;;;;;;;;:::i;:::-;;3744:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26705:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37967:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38759:672;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28384:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38657:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29455:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38099:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38055:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39935:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37888:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28743:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4644:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24650:372;24752:4;24804:25;24789:40;;;:11;:40;;;;:105;;;;24861:33;24846:48;;;:11;:48;;;;24789:105;:172;;;;24926:35;24911:50;;;:11;:50;;;;24789:172;:225;;;;24978:36;25002:11;24978:23;:36::i;:::-;24789:225;24769:245;;24650:372;;;:::o;26536:100::-;26590:13;26623:5;26616:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26536:100;:::o;28098:214::-;28166:7;28194:16;28202:7;28194;:16::i;:::-;28186:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28280:15;:24;28296:7;28280:24;;;;;;;;;;;;;;;;;;;;;28273:31;;28098:214;;;:::o;27619:413::-;27692:13;27708:24;27724:7;27708:15;:24::i;:::-;27692:40;;27757:5;27751:11;;:2;:11;;;27743:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27852:5;27836:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27861:37;27878:5;27885:12;:10;:12::i;:::-;27861:16;:37::i;:::-;27836:62;27814:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;27996:28;28005:2;28009:7;28018:5;27996:8;:28::i;:::-;27681:351;27619:413;;:::o;22905:102::-;22958:7;22998:1;22985:12;;:14;;;;:::i;:::-;22978:21;;22905:102;:::o;28974:162::-;29100:28;29110:4;29116:2;29120:7;29100:9;:28::i;:::-;28974:162;;;:::o;38571:78::-;3975:12;:10;:12::i;:::-;3964:23;;:7;:5;:7::i;:::-;:23;;;3956:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38636:5:::1;;;;;;;;;;;38635:6;38627:5;;:14;;;;;;;;;;;;;;;;;;38571:78::o:0;23571:1007::-;23660:7;23696:16;23706:5;23696:9;:16::i;:::-;23688:5;:24;23680:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23762:22;23787:13;:11;:13::i;:::-;23762:38;;23811:19;23841:25;24030:9;24025:466;24045:14;24041:1;:18;24025:466;;;24085:31;24119:11;:14;24131:1;24119:14;;;;;;;;;;;24085:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24182:1;24156:28;;:9;:14;;;:28;;;24152:111;;24229:9;:14;;;24209:34;;24152:111;24306:5;24285:26;;:17;:26;;;24281:195;;24355:5;24340:11;:20;24336:85;;24396:1;24389:8;;;;;;;;;24336:85;24443:13;;;;;;;24281:195;24066:425;24061:3;;;;;;;24025:466;;;;24514:56;;;;;;;;;;:::i;:::-;;;;;;;;23571:1007;;;;;:::o;39439:90::-;3975:12;:10;:12::i;:::-;3964:23;;:7;:5;:7::i;:::-;:23;;;3956:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39514:7:::1;39503:8;:18;;;;39439:90:::0;:::o;38338:114::-;3975:12;:10;:12::i;:::-;3964:23;;:7;:5;:7::i;:::-;:23;;;3956:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38404:7:::1;:5;:7::i;:::-;38396:25;;:48;38422:21;38396:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;38338:114::o:0;29207:177::-;29337:39;29354:4;29360:2;29364:7;29337:39;;;;;;;;;;;;:16;:39::i;:::-;29207:177;;;:::o;39541:386::-;39628:16;39662:23;39688:17;39698:6;39688:9;:17::i;:::-;39662:43;;39716:25;39758:15;39744:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39716:58;;39790:9;39785:109;39805:15;39801:1;:19;39785:109;;;39852:30;39872:6;39880:1;39852:19;:30::i;:::-;39838:8;39847:1;39838:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;39822:3;;;;;:::i;:::-;;;;39785:109;;;;39911:8;39904:15;;;;39541:386;;;:::o;38252:78::-;3975:12;:10;:12::i;:::-;3964:23;;:7;:5;:7::i;:::-;:23;;;3956:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38322:3:::1;38311:8;:14;;;;;;:::i;:::-;;38252:78:::0;:::o;23084:187::-;23151:7;23187:13;:11;:13::i;:::-;23179:5;:21;23171:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23258:5;23251:12;;23084:187;;;:::o;26345:124::-;26409:7;26436:20;26448:7;26436:11;:20::i;:::-;:25;;;26429:32;;26345:124;;;:::o;25086:221::-;25150:7;25195:1;25178:19;;:5;:19;;;25170:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;25271:12;:19;25284:5;25271:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25263:36;;25256:43;;25086:221;;;:::o;4395:94::-;3975:12;:10;:12::i;:::-;3964:23;;:7;:5;:7::i;:::-;:23;;;3956:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4460:21:::1;4478:1;4460:9;:21::i;:::-;4395:94::o:0;3744:87::-;3790:7;3817:6;;;;;;;;;;;3810:13;;3744:87;:::o;26705:104::-;26761:13;26794:7;26787:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26705:104;:::o;37967:81::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38759:672::-;38825:5;;;;;;;;;;;38817:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;38889:2;38879:8;:12;;38871:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;39002:10;;38989:8;38973:13;:11;:13::i;:::-;:24;;;;:::i;:::-;38972:40;;38964:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;39068:14;39085:8;39068:25;;39138:1;39109:13;:25;39123:10;39109:25;;;;;;;;;;;;;;;;:30;39106:86;;39179:1;39167:9;:13;;;;:::i;:::-;39155:25;;39106:86;39237:8;;39225:9;:20;;;;:::i;:::-;39212:9;:33;;39204:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39285:31;39295:10;39307:8;39285:9;:31::i;:::-;39383:8;39355:13;:25;39369:10;39355:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;39327:13;:25;39341:10;39327:25;;;;;;;;;;;;;;;:64;;;;39415:8;39402:9;;:21;;;;;;;:::i;:::-;;;;;;;;38806:625;38759:672;:::o;28384:288::-;28491:12;:10;:12::i;:::-;28479:24;;:8;:24;;;28471:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28592:8;28547:18;:32;28566:12;:10;:12::i;:::-;28547:32;;;;;;;;;;;;;;;:42;28580:8;28547:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28645:8;28616:48;;28631:12;:10;:12::i;:::-;28616:48;;;28655:8;28616:48;;;;;;:::i;:::-;;;;;;;;28384:288;;:::o;38657:90::-;38703:7;38730:9;;38723:16;;38657:90;:::o;29455:355::-;29614:28;29624:4;29630:2;29634:7;29614:9;:28::i;:::-;29675:48;29698:4;29704:2;29708:7;29717:5;29675:22;:48::i;:::-;29653:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;29455:355;;;;:::o;38099:24::-;;;;;;;;;;;;;:::o;38055:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39935:473::-;40033:13;40082:16;40090:7;40082;:16::i;:::-;40064:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;40193:28;40224:10;:8;:10::i;:::-;40193:41;;40283:1;40258:14;40252:28;:32;:148;;;;;;;;;;;;;;;;;40324:14;40340:25;40357:7;40340:16;:25::i;:::-;40367:13;40307:74;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40252:148;40245:155;;;39935:473;;;:::o;37888:37::-;;;;:::o;28743:164::-;28840:4;28864:18;:25;28883:5;28864:25;;;;;;;;;;;;;;;:35;28890:8;28864:35;;;;;;;;;;;;;;;;;;;;;;;;;28857:42;;28743:164;;;;:::o;4644:192::-;3975:12;:10;:12::i;:::-;3964:23;;:7;:5;:7::i;:::-;:23;;;3956:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4753:1:::1;4733:22;;:8;:22;;::::0;4725:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4809:19;4819:8;4809:9;:19::i;:::-;4644:192:::0;:::o;15200:157::-;15285:4;15324:25;15309:40;;;:11;:40;;;;15302:47;;15200:157;;;:::o;30065:111::-;30122:4;30156:12;;30146:7;:22;30139:29;;30065:111;;;:::o;2602:98::-;2655:7;2682:10;2675:17;;2602:98;:::o;34985:196::-;35127:2;35100:15;:24;35116:7;35100:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35165:7;35161:2;35145:28;;35154:5;35145:28;;;;;;;;;;;;34985:196;;;:::o;32865:2002::-;32980:35;33018:20;33030:7;33018:11;:20::i;:::-;32980:58;;33051:22;33093:13;:18;;;33077:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;33152:12;:10;:12::i;:::-;33128:36;;:20;33140:7;33128:11;:20::i;:::-;:36;;;33077:87;:154;;;;33181:50;33198:13;:18;;;33218:12;:10;:12::i;:::-;33181:16;:50::i;:::-;33077:154;33051:181;;33253:17;33245:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;33368:4;33346:26;;:13;:18;;;:26;;;33338:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;33448:1;33434:16;;:2;:16;;;33426:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33505:43;33527:4;33533:2;33537:7;33546:1;33505:21;:43::i;:::-;33613:49;33630:1;33634:7;33643:13;:18;;;33613:8;:49::i;:::-;33988:1;33958:12;:18;33971:4;33958:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34032:1;34004:12;:16;34017:2;34004:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34078:2;34050:11;:20;34062:7;34050:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;34140:15;34095:11;:20;34107:7;34095:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;34408:19;34440:1;34430:7;:11;34408:33;;34501:1;34460:43;;:11;:24;34472:11;34460:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;34456:295;;34528:20;34536:11;34528:7;:20::i;:::-;34524:212;;;34605:13;:18;;;34573:11;:24;34585:11;34573:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;34688:13;:28;;;34646:11;:24;34658:11;34646:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;34524:212;34456:295;33933:829;34798:7;34794:2;34779:27;;34788:4;34779:27;;;;;;;;;;;;34817:42;34838:4;34844:2;34848:7;34857:1;34817:20;:42::i;:::-;32969:1898;;32865:2002;;;:::o;25746:537::-;25807:21;;:::i;:::-;25849:16;25857:7;25849;:16::i;:::-;25841:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25955:12;25970:7;25955:22;;25950:245;25987:1;25979:4;:9;25950:245;;26017:31;26051:11;:17;26063:4;26051:17;;;;;;;;;;;26017:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26117:1;26091:28;;:9;:14;;;:28;;;26087:93;;26151:9;26144:16;;;;;;26087:93;25998:197;25990:6;;;;;;;;25950:245;;;;26218:57;;;;;;;;;;:::i;:::-;;;;;;;;25746:537;;;;:::o;4844:173::-;4900:16;4919:6;;;;;;;;;;;4900:25;;4945:8;4936:6;;:17;;;;;;;;;;;;;;;;;;5000:8;4969:40;;4990:8;4969:40;;;;;;;;;;;;4889:128;4844:173;:::o;30184:104::-;30253:27;30263:2;30267:8;30253:27;;;;;;;;;;;;:9;:27::i;:::-;30184:104;;:::o;35746:804::-;35901:4;35922:15;:2;:13;;;:15::i;:::-;35918:625;;;35974:2;35958:36;;;35995:12;:10;:12::i;:::-;36009:4;36015:7;36024:5;35958:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35954:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36221:1;36204:6;:13;:18;36200:273;;36247:61;;;;;;;;;;:::i;:::-;;;;;;;;36200:273;36423:6;36417:13;36408:6;36404:2;36400:15;36393:38;35954:534;36091:45;;;36081:55;;;:6;:55;;;;36074:62;;;;;35918:625;36527:4;36520:11;;35746:804;;;;;;;:::o;38460:101::-;38512:13;38545:8;38538:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38460:101;:::o;287:723::-;343:13;573:1;564:5;:10;560:53;;591:10;;;;;;;;;;;;;;;;;;;;;560:53;623:12;638:5;623:20;;654:14;679:78;694:1;686:4;:9;679:78;;712:8;;;;;:::i;:::-;;;;743:2;735:10;;;;;:::i;:::-;;;679:78;;;767:19;799:6;789:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;767:39;;817:154;833:1;824:5;:10;817:154;;861:1;851:11;;;;;:::i;:::-;;;928:2;920:5;:10;;;;:::i;:::-;907:2;:24;;;;:::i;:::-;894:39;;877:6;884;877:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;957:2;948:11;;;;;:::i;:::-;;;817:154;;;995:6;981:21;;;;;287:723;;;;:::o;37038:159::-;;;;;:::o;37609:158::-;;;;;:::o;30651:163::-;30774:32;30780:2;30784:8;30794:5;30801:4;30774:5;:32::i;:::-;30651:163;;;:::o;5721:387::-;5781:4;5989:12;6056:7;6044:20;6036:28;;6099:1;6092:4;:8;6085:15;;;5721:387;;;:::o;31073:1538::-;31212:20;31235:12;;31212:35;;31280:1;31266:16;;:2;:16;;;31258:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31351:1;31339:8;:13;31331:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31410:61;31440:1;31444:2;31448:12;31462:8;31410:21;:61::i;:::-;31785:8;31749:12;:16;31762:2;31749:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31850:8;31809:12;:16;31822:2;31809:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31909:2;31876:11;:25;31888:12;31876:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31976:15;31926:11;:25;31938:12;31926:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32009:20;32032:12;32009:35;;32066:9;32061:415;32081:8;32077:1;:12;32061:415;;;32145:12;32141:2;32120:38;;32137:1;32120:38;;;;;;;;;;;;32181:4;32177:249;;;32244:59;32275:1;32279:2;32283:12;32297:5;32244:22;:59::i;:::-;32210:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;32177:249;32446:14;;;;;;;32091:3;;;;;;;32061:415;;;;32507:12;32492;:27;;;;31724:807;32543:60;32572:1;32576:2;32580:12;32594:8;32543:20;:60::i;:::-;31201:1410;31073:1538;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:114::-;6317:6;6351:5;6345:12;6335:22;;6250:114;;;:::o;6370:184::-;6469:11;6503:6;6498:3;6491:19;6543:4;6538:3;6534:14;6519:29;;6370:184;;;;:::o;6560:132::-;6627:4;6650:3;6642:11;;6680:4;6675:3;6671:14;6663:22;;6560:132;;;:::o;6698:108::-;6775:24;6793:5;6775:24;:::i;:::-;6770:3;6763:37;6698:108;;:::o;6812:179::-;6881:10;6902:46;6944:3;6936:6;6902:46;:::i;:::-;6980:4;6975:3;6971:14;6957:28;;6812:179;;;;:::o;6997:113::-;7067:4;7099;7094:3;7090:14;7082:22;;6997:113;;;:::o;7146:732::-;7265:3;7294:54;7342:5;7294:54;:::i;:::-;7364:86;7443:6;7438:3;7364:86;:::i;:::-;7357:93;;7474:56;7524:5;7474:56;:::i;:::-;7553:7;7584:1;7569:284;7594:6;7591:1;7588:13;7569:284;;;7670:6;7664:13;7697:63;7756:3;7741:13;7697:63;:::i;:::-;7690:70;;7783:60;7836:6;7783:60;:::i;:::-;7773:70;;7629:224;7616:1;7613;7609:9;7604:14;;7569:284;;;7573:14;7869:3;7862:10;;7270:608;;;7146:732;;;;:::o;7884:373::-;8027:4;8065:2;8054:9;8050:18;8042:26;;8114:9;8108:4;8104:20;8100:1;8089:9;8085:17;8078:47;8142:108;8245:4;8236:6;8142:108;:::i;:::-;8134:116;;7884:373;;;;:::o;8263:117::-;8372:1;8369;8362:12;8386:117;8495:1;8492;8485:12;8509:180;8557:77;8554:1;8547:88;8654:4;8651:1;8644:15;8678:4;8675:1;8668:15;8695:281;8778:27;8800:4;8778:27;:::i;:::-;8770:6;8766:40;8908:6;8896:10;8893:22;8872:18;8860:10;8857:34;8854:62;8851:88;;;8919:18;;:::i;:::-;8851:88;8959:10;8955:2;8948:22;8738:238;8695:281;;:::o;8982:129::-;9016:6;9043:20;;:::i;:::-;9033:30;;9072:33;9100:4;9092:6;9072:33;:::i;:::-;8982:129;;;:::o;9117:308::-;9179:4;9269:18;9261:6;9258:30;9255:56;;;9291:18;;:::i;:::-;9255:56;9329:29;9351:6;9329:29;:::i;:::-;9321:37;;9413:4;9407;9403:15;9395:23;;9117:308;;;:::o;9431:154::-;9515:6;9510:3;9505;9492:30;9577:1;9568:6;9563:3;9559:16;9552:27;9431:154;;;:::o;9591:412::-;9669:5;9694:66;9710:49;9752:6;9710:49;:::i;:::-;9694:66;:::i;:::-;9685:75;;9783:6;9776:5;9769:21;9821:4;9814:5;9810:16;9859:3;9850:6;9845:3;9841:16;9838:25;9835:112;;;9866:79;;:::i;:::-;9835:112;9956:41;9990:6;9985:3;9980;9956:41;:::i;:::-;9675:328;9591:412;;;;;:::o;10023:340::-;10079:5;10128:3;10121:4;10113:6;10109:17;10105:27;10095:122;;10136:79;;:::i;:::-;10095:122;10253:6;10240:20;10278:79;10353:3;10345:6;10338:4;10330:6;10326:17;10278:79;:::i;:::-;10269:88;;10085:278;10023:340;;;;:::o;10369:509::-;10438:6;10487:2;10475:9;10466:7;10462:23;10458:32;10455:119;;;10493:79;;:::i;:::-;10455:119;10641:1;10630:9;10626:17;10613:31;10671:18;10663:6;10660:30;10657:117;;;10693:79;;:::i;:::-;10657:117;10798:63;10853:7;10844:6;10833:9;10829:22;10798:63;:::i;:::-;10788:73;;10584:287;10369:509;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:474::-;13722:6;13730;13779:2;13767:9;13758:7;13754:23;13750:32;13747:119;;;13785:79;;:::i;:::-;13747:119;13905:1;13930:53;13975:7;13966:6;13955:9;13951:22;13930:53;:::i;:::-;13920:63;;13876:117;14032:2;14058:53;14103:7;14094:6;14083:9;14079:22;14058:53;:::i;:::-;14048:63;;14003:118;13654:474;;;;;:::o;14134:180::-;14182:77;14179:1;14172:88;14279:4;14276:1;14269:15;14303:4;14300:1;14293:15;14320:320;14364:6;14401:1;14395:4;14391:12;14381:22;;14448:1;14442:4;14438:12;14469:18;14459:81;;14525:4;14517:6;14513:17;14503:27;;14459:81;14587:2;14579:6;14576:14;14556:18;14553:38;14550:84;;14606:18;;:::i;:::-;14550:84;14371:269;14320:320;;;:::o;14646:232::-;14786:34;14782:1;14774:6;14770:14;14763:58;14855:15;14850:2;14842:6;14838:15;14831:40;14646:232;:::o;14884:366::-;15026:3;15047:67;15111:2;15106:3;15047:67;:::i;:::-;15040:74;;15123:93;15212:3;15123:93;:::i;:::-;15241:2;15236:3;15232:12;15225:19;;14884:366;;;:::o;15256:419::-;15422:4;15460:2;15449:9;15445:18;15437:26;;15509:9;15503:4;15499:20;15495:1;15484:9;15480:17;15473:47;15537:131;15663:4;15537:131;:::i;:::-;15529:139;;15256:419;;;:::o;15681:221::-;15821:34;15817:1;15809:6;15805:14;15798:58;15890:4;15885:2;15877:6;15873:15;15866:29;15681:221;:::o;15908:366::-;16050:3;16071:67;16135:2;16130:3;16071:67;:::i;:::-;16064:74;;16147:93;16236:3;16147:93;:::i;:::-;16265:2;16260:3;16256:12;16249:19;;15908:366;;;:::o;16280:419::-;16446:4;16484:2;16473:9;16469:18;16461:26;;16533:9;16527:4;16523:20;16519:1;16508:9;16504:17;16497:47;16561:131;16687:4;16561:131;:::i;:::-;16553:139;;16280:419;;;:::o;16705:244::-;16845:34;16841:1;16833:6;16829:14;16822:58;16914:27;16909:2;16901:6;16897:15;16890:52;16705:244;:::o;16955:366::-;17097:3;17118:67;17182:2;17177:3;17118:67;:::i;:::-;17111:74;;17194:93;17283:3;17194:93;:::i;:::-;17312:2;17307:3;17303:12;17296:19;;16955:366;;;:::o;17327:419::-;17493:4;17531:2;17520:9;17516:18;17508:26;;17580:9;17574:4;17570:20;17566:1;17555:9;17551:17;17544:47;17608:131;17734:4;17608:131;:::i;:::-;17600:139;;17327:419;;;:::o;17752:180::-;17800:77;17797:1;17790:88;17897:4;17894:1;17887:15;17921:4;17918:1;17911:15;17938:191;17978:4;17998:20;18016:1;17998:20;:::i;:::-;17993:25;;18032:20;18050:1;18032:20;:::i;:::-;18027:25;;18071:1;18068;18065:8;18062:34;;;18076:18;;:::i;:::-;18062:34;18121:1;18118;18114:9;18106:17;;17938:191;;;;:::o;18135:182::-;18275:34;18271:1;18263:6;18259:14;18252:58;18135:182;:::o;18323:366::-;18465:3;18486:67;18550:2;18545:3;18486:67;:::i;:::-;18479:74;;18562:93;18651:3;18562:93;:::i;:::-;18680:2;18675:3;18671:12;18664:19;;18323:366;;;:::o;18695:419::-;18861:4;18899:2;18888:9;18884:18;18876:26;;18948:9;18942:4;18938:20;18934:1;18923:9;18919:17;18912:47;18976:131;19102:4;18976:131;:::i;:::-;18968:139;;18695:419;;;:::o;19120:221::-;19260:34;19256:1;19248:6;19244:14;19237:58;19329:4;19324:2;19316:6;19312:15;19305:29;19120:221;:::o;19347:366::-;19489:3;19510:67;19574:2;19569:3;19510:67;:::i;:::-;19503:74;;19586:93;19675:3;19586:93;:::i;:::-;19704:2;19699:3;19695:12;19688:19;;19347:366;;;:::o;19719:419::-;19885:4;19923:2;19912:9;19908:18;19900:26;;19972:9;19966:4;19962:20;19958:1;19947:9;19943:17;19936:47;20000:131;20126:4;20000:131;:::i;:::-;19992:139;;19719:419;;;:::o;20144:233::-;20284:34;20280:1;20272:6;20268:14;20261:58;20353:16;20348:2;20340:6;20336:15;20329:41;20144:233;:::o;20383:366::-;20525:3;20546:67;20610:2;20605:3;20546:67;:::i;:::-;20539:74;;20622:93;20711:3;20622:93;:::i;:::-;20740:2;20735:3;20731:12;20724:19;;20383:366;;;:::o;20755:419::-;20921:4;20959:2;20948:9;20944:18;20936:26;;21008:9;21002:4;20998:20;20994:1;20983:9;20979:17;20972:47;21036:131;21162:4;21036:131;:::i;:::-;21028:139;;20755:419;;;:::o;21180:180::-;21228:77;21225:1;21218:88;21325:4;21322:1;21315:15;21349:4;21346:1;21339:15;21366:233;21405:3;21428:24;21446:5;21428:24;:::i;:::-;21419:33;;21474:66;21467:5;21464:77;21461:103;;21544:18;;:::i;:::-;21461:103;21591:1;21584:5;21580:13;21573:20;;21366:233;;;:::o;21605:141::-;21654:4;21677:3;21669:11;;21700:3;21697:1;21690:14;21734:4;21731:1;21721:18;21713:26;;21605:141;;;:::o;21752:93::-;21789:6;21836:2;21831;21824:5;21820:14;21816:23;21806:33;;21752:93;;;:::o;21851:107::-;21895:8;21945:5;21939:4;21935:16;21914:37;;21851:107;;;;:::o;21964:393::-;22033:6;22083:1;22071:10;22067:18;22106:97;22136:66;22125:9;22106:97;:::i;:::-;22224:39;22254:8;22243:9;22224:39;:::i;:::-;22212:51;;22296:4;22292:9;22285:5;22281:21;22272:30;;22345:4;22335:8;22331:19;22324:5;22321:30;22311:40;;22040:317;;21964:393;;;;;:::o;22363:60::-;22391:3;22412:5;22405:12;;22363:60;;;:::o;22429:142::-;22479:9;22512:53;22530:34;22539:24;22557:5;22539:24;:::i;:::-;22530:34;:::i;:::-;22512:53;:::i;:::-;22499:66;;22429:142;;;:::o;22577:75::-;22620:3;22641:5;22634:12;;22577:75;;;:::o;22658:269::-;22768:39;22799:7;22768:39;:::i;:::-;22829:91;22878:41;22902:16;22878:41;:::i;:::-;22870:6;22863:4;22857:11;22829:91;:::i;:::-;22823:4;22816:105;22734:193;22658:269;;;:::o;22933:73::-;22978:3;22933:73;:::o;23012:189::-;23089:32;;:::i;:::-;23130:65;23188:6;23180;23174:4;23130:65;:::i;:::-;23065:136;23012:189;;:::o;23207:186::-;23267:120;23284:3;23277:5;23274:14;23267:120;;;23338:39;23375:1;23368:5;23338:39;:::i;:::-;23311:1;23304:5;23300:13;23291:22;;23267:120;;;23207:186;;:::o;23399:543::-;23500:2;23495:3;23492:11;23489:446;;;23534:38;23566:5;23534:38;:::i;:::-;23618:29;23636:10;23618:29;:::i;:::-;23608:8;23604:44;23801:2;23789:10;23786:18;23783:49;;;23822:8;23807:23;;23783:49;23845:80;23901:22;23919:3;23901:22;:::i;:::-;23891:8;23887:37;23874:11;23845:80;:::i;:::-;23504:431;;23489:446;23399:543;;;:::o;23948:117::-;24002:8;24052:5;24046:4;24042:16;24021:37;;23948:117;;;;:::o;24071:169::-;24115:6;24148:51;24196:1;24192:6;24184:5;24181:1;24177:13;24148:51;:::i;:::-;24144:56;24229:4;24223;24219:15;24209:25;;24122:118;24071:169;;;;:::o;24245:295::-;24321:4;24467:29;24492:3;24486:4;24467:29;:::i;:::-;24459:37;;24529:3;24526:1;24522:11;24516:4;24513:21;24505:29;;24245:295;;;;:::o;24545:1395::-;24662:37;24695:3;24662:37;:::i;:::-;24764:18;24756:6;24753:30;24750:56;;;24786:18;;:::i;:::-;24750:56;24830:38;24862:4;24856:11;24830:38;:::i;:::-;24915:67;24975:6;24967;24961:4;24915:67;:::i;:::-;25009:1;25033:4;25020:17;;25065:2;25057:6;25054:14;25082:1;25077:618;;;;25739:1;25756:6;25753:77;;;25805:9;25800:3;25796:19;25790:26;25781:35;;25753:77;25856:67;25916:6;25909:5;25856:67;:::i;:::-;25850:4;25843:81;25712:222;25047:887;;25077:618;25129:4;25125:9;25117:6;25113:22;25163:37;25195:4;25163:37;:::i;:::-;25222:1;25236:208;25250:7;25247:1;25244:14;25236:208;;;25329:9;25324:3;25320:19;25314:26;25306:6;25299:42;25380:1;25372:6;25368:14;25358:24;;25427:2;25416:9;25412:18;25399:31;;25273:4;25270:1;25266:12;25261:17;;25236:208;;;25472:6;25463:7;25460:19;25457:179;;;25530:9;25525:3;25521:19;25515:26;25573:48;25615:4;25607:6;25603:17;25592:9;25573:48;:::i;:::-;25565:6;25558:64;25480:156;25457:179;25682:1;25678;25670:6;25666:14;25662:22;25656:4;25649:36;25084:611;;;25047:887;;24637:1303;;;24545:1395;;:::o;25946:222::-;26086:34;26082:1;26074:6;26070:14;26063:58;26155:5;26150:2;26142:6;26138:15;26131:30;25946:222;:::o;26174:366::-;26316:3;26337:67;26401:2;26396:3;26337:67;:::i;:::-;26330:74;;26413:93;26502:3;26413:93;:::i;:::-;26531:2;26526:3;26522:12;26515:19;;26174:366;;;:::o;26546:419::-;26712:4;26750:2;26739:9;26735:18;26727:26;;26799:9;26793:4;26789:20;26785:1;26774:9;26770:17;26763:47;26827:131;26953:4;26827:131;:::i;:::-;26819:139;;26546:419;;;:::o;26971:230::-;27111:34;27107:1;27099:6;27095:14;27088:58;27180:13;27175:2;27167:6;27163:15;27156:38;26971:230;:::o;27207:366::-;27349:3;27370:67;27434:2;27429:3;27370:67;:::i;:::-;27363:74;;27446:93;27535:3;27446:93;:::i;:::-;27564:2;27559:3;27555:12;27548:19;;27207:366;;;:::o;27579:419::-;27745:4;27783:2;27772:9;27768:18;27760:26;;27832:9;27826:4;27822:20;27818:1;27807:9;27803:17;27796:47;27860:131;27986:4;27860:131;:::i;:::-;27852:139;;27579:419;;;:::o;28004:175::-;28144:27;28140:1;28132:6;28128:14;28121:51;28004:175;:::o;28185:366::-;28327:3;28348:67;28412:2;28407:3;28348:67;:::i;:::-;28341:74;;28424:93;28513:3;28424:93;:::i;:::-;28542:2;28537:3;28533:12;28526:19;;28185:366;;;:::o;28557:419::-;28723:4;28761:2;28750:9;28746:18;28738:26;;28810:9;28804:4;28800:20;28796:1;28785:9;28781:17;28774:47;28838:131;28964:4;28838:131;:::i;:::-;28830:139;;28557:419;;;:::o;28982:243::-;29122:34;29118:1;29110:6;29106:14;29099:58;29191:26;29186:2;29178:6;29174:15;29167:51;28982:243;:::o;29231:366::-;29373:3;29394:67;29458:2;29453:3;29394:67;:::i;:::-;29387:74;;29470:93;29559:3;29470:93;:::i;:::-;29588:2;29583:3;29579:12;29572:19;;29231:366;;;:::o;29603:419::-;29769:4;29807:2;29796:9;29792:18;29784:26;;29856:9;29850:4;29846:20;29842:1;29831:9;29827:17;29820:47;29884:131;30010:4;29884:131;:::i;:::-;29876:139;;29603:419;;;:::o;30028:305::-;30068:3;30087:20;30105:1;30087:20;:::i;:::-;30082:25;;30121:20;30139:1;30121:20;:::i;:::-;30116:25;;30275:1;30207:66;30203:74;30200:1;30197:81;30194:107;;;30281:18;;:::i;:::-;30194:107;30325:1;30322;30318:9;30311:16;;30028:305;;;;:::o;30339:180::-;30479:32;30475:1;30467:6;30463:14;30456:56;30339:180;:::o;30525:366::-;30667:3;30688:67;30752:2;30747:3;30688:67;:::i;:::-;30681:74;;30764:93;30853:3;30764:93;:::i;:::-;30882:2;30877:3;30873:12;30866:19;;30525:366;;;:::o;30897:419::-;31063:4;31101:2;31090:9;31086:18;31078:26;;31150:9;31144:4;31140:20;31136:1;31125:9;31121:17;31114:47;31178:131;31304:4;31178:131;:::i;:::-;31170:139;;30897:419;;;:::o;31322:348::-;31362:7;31385:20;31403:1;31385:20;:::i;:::-;31380:25;;31419:20;31437:1;31419:20;:::i;:::-;31414:25;;31607:1;31539:66;31535:74;31532:1;31529:81;31524:1;31517:9;31510:17;31506:105;31503:131;;;31614:18;;:::i;:::-;31503:131;31662:1;31659;31655:9;31644:20;;31322:348;;;;:::o;31676:170::-;31816:22;31812:1;31804:6;31800:14;31793:46;31676:170;:::o;31852:366::-;31994:3;32015:67;32079:2;32074:3;32015:67;:::i;:::-;32008:74;;32091:93;32180:3;32091:93;:::i;:::-;32209:2;32204:3;32200:12;32193:19;;31852:366;;;:::o;32224:419::-;32390:4;32428:2;32417:9;32413:18;32405:26;;32477:9;32471:4;32467:20;32463:1;32452:9;32448:17;32441:47;32505:131;32631:4;32505:131;:::i;:::-;32497:139;;32224:419;;;:::o;32649:176::-;32789:28;32785:1;32777:6;32773:14;32766:52;32649:176;:::o;32831:366::-;32973:3;32994:67;33058:2;33053:3;32994:67;:::i;:::-;32987:74;;33070:93;33159:3;33070:93;:::i;:::-;33188:2;33183:3;33179:12;33172:19;;32831:366;;;:::o;33203:419::-;33369:4;33407:2;33396:9;33392:18;33384:26;;33456:9;33450:4;33446:20;33442:1;33431:9;33427:17;33420:47;33484:131;33610:4;33484:131;:::i;:::-;33476:139;;33203:419;;;:::o;33628:238::-;33768:34;33764:1;33756:6;33752:14;33745:58;33837:21;33832:2;33824:6;33820:15;33813:46;33628:238;:::o;33872:366::-;34014:3;34035:67;34099:2;34094:3;34035:67;:::i;:::-;34028:74;;34111:93;34200:3;34111:93;:::i;:::-;34229:2;34224:3;34220:12;34213:19;;33872:366;;;:::o;34244:419::-;34410:4;34448:2;34437:9;34433:18;34425:26;;34497:9;34491:4;34487:20;34483:1;34472:9;34468:17;34461:47;34525:131;34651:4;34525:131;:::i;:::-;34517:139;;34244:419;;;:::o;34669:235::-;34809:34;34805:1;34797:6;34793:14;34786:58;34878:18;34873:2;34865:6;34861:15;34854:43;34669:235;:::o;34910:366::-;35052:3;35073:67;35137:2;35132:3;35073:67;:::i;:::-;35066:74;;35149:93;35238:3;35149:93;:::i;:::-;35267:2;35262:3;35258:12;35251:19;;34910:366;;;:::o;35282:419::-;35448:4;35486:2;35475:9;35471:18;35463:26;;35535:9;35529:4;35525:20;35521:1;35510:9;35506:17;35499:47;35563:131;35689:4;35563:131;:::i;:::-;35555:139;;35282:419;;;:::o;35707:148::-;35809:11;35846:3;35831:18;;35707:148;;;;:::o;35861:377::-;35967:3;35995:39;36028:5;35995:39;:::i;:::-;36050:89;36132:6;36127:3;36050:89;:::i;:::-;36043:96;;36148:52;36193:6;36188:3;36181:4;36174:5;36170:16;36148:52;:::i;:::-;36225:6;36220:3;36216:16;36209:23;;35971:267;35861:377;;;;:::o;36268:874::-;36371:3;36408:5;36402:12;36437:36;36463:9;36437:36;:::i;:::-;36489:89;36571:6;36566:3;36489:89;:::i;:::-;36482:96;;36609:1;36598:9;36594:17;36625:1;36620:166;;;;36800:1;36795:341;;;;36587:549;;36620:166;36704:4;36700:9;36689;36685:25;36680:3;36673:38;36766:6;36759:14;36752:22;36744:6;36740:35;36735:3;36731:45;36724:52;;36620:166;;36795:341;36862:38;36894:5;36862:38;:::i;:::-;36922:1;36936:154;36950:6;36947:1;36944:13;36936:154;;;37024:7;37018:14;37014:1;37009:3;37005:11;36998:35;37074:1;37065:7;37061:15;37050:26;;36972:4;36969:1;36965:12;36960:17;;36936:154;;;37119:6;37114:3;37110:16;37103:23;;36802:334;;36587:549;;36375:767;;36268:874;;;;:::o;37148:589::-;37373:3;37395:95;37486:3;37477:6;37395:95;:::i;:::-;37388:102;;37507:95;37598:3;37589:6;37507:95;:::i;:::-;37500:102;;37619:92;37707:3;37698:6;37619:92;:::i;:::-;37612:99;;37728:3;37721:10;;37148:589;;;;;;:::o;37743:225::-;37883:34;37879:1;37871:6;37867:14;37860:58;37952:8;37947:2;37939:6;37935:15;37928:33;37743:225;:::o;37974:366::-;38116:3;38137:67;38201:2;38196:3;38137:67;:::i;:::-;38130:74;;38213:93;38302:3;38213:93;:::i;:::-;38331:2;38326:3;38322:12;38315:19;;37974:366;;;:::o;38346:419::-;38512:4;38550:2;38539:9;38535:18;38527:26;;38599:9;38593:4;38589:20;38585:1;38574:9;38570:17;38563:47;38627:131;38753:4;38627:131;:::i;:::-;38619:139;;38346:419;;;:::o;38771:237::-;38911:34;38907:1;38899:6;38895:14;38888:58;38980:20;38975:2;38967:6;38963:15;38956:45;38771:237;:::o;39014:366::-;39156:3;39177:67;39241:2;39236:3;39177:67;:::i;:::-;39170:74;;39253:93;39342:3;39253:93;:::i;:::-;39371:2;39366:3;39362:12;39355:19;;39014:366;;;:::o;39386:419::-;39552:4;39590:2;39579:9;39575:18;39567:26;;39639:9;39633:4;39629:20;39625:1;39614:9;39610:17;39603:47;39667:131;39793:4;39667:131;:::i;:::-;39659:139;;39386:419;;;:::o;39811:225::-;39951:34;39947:1;39939:6;39935:14;39928:58;40020:8;40015:2;40007:6;40003:15;39996:33;39811:225;:::o;40042:366::-;40184:3;40205:67;40269:2;40264:3;40205:67;:::i;:::-;40198:74;;40281:93;40370:3;40281:93;:::i;:::-;40399:2;40394:3;40390:12;40383:19;;40042:366;;;:::o;40414:419::-;40580:4;40618:2;40607:9;40603:18;40595:26;;40667:9;40661:4;40657:20;40653:1;40642:9;40638:17;40631:47;40695:131;40821:4;40695:131;:::i;:::-;40687:139;;40414:419;;;:::o;40839:224::-;40979:34;40975:1;40967:6;40963:14;40956:58;41048:7;41043:2;41035:6;41031:15;41024:32;40839:224;:::o;41069:366::-;41211:3;41232:67;41296:2;41291:3;41232:67;:::i;:::-;41225:74;;41308:93;41397:3;41308:93;:::i;:::-;41426:2;41421:3;41417:12;41410:19;;41069:366;;;:::o;41441:419::-;41607:4;41645:2;41634:9;41630:18;41622:26;;41694:9;41688:4;41684:20;41680:1;41669:9;41665:17;41658:47;41722:131;41848:4;41722:131;:::i;:::-;41714:139;;41441:419;;;:::o;41866:229::-;42006:34;42002:1;41994:6;41990:14;41983:58;42075:12;42070:2;42062:6;42058:15;42051:37;41866:229;:::o;42101:366::-;42243:3;42264:67;42328:2;42323:3;42264:67;:::i;:::-;42257:74;;42340:93;42429:3;42340:93;:::i;:::-;42458:2;42453:3;42449:12;42442:19;;42101:366;;;:::o;42473:419::-;42639:4;42677:2;42666:9;42662:18;42654:26;;42726:9;42720:4;42716:20;42712:1;42701:9;42697:17;42690:47;42754:131;42880:4;42754:131;:::i;:::-;42746:139;;42473:419;;;:::o;42898:234::-;43038:34;43034:1;43026:6;43022:14;43015:58;43107:17;43102:2;43094:6;43090:15;43083:42;42898:234;:::o;43138:366::-;43280:3;43301:67;43365:2;43360:3;43301:67;:::i;:::-;43294:74;;43377:93;43466:3;43377:93;:::i;:::-;43495:2;43490:3;43486:12;43479:19;;43138:366;;;:::o;43510:419::-;43676:4;43714:2;43703:9;43699:18;43691:26;;43763:9;43757:4;43753:20;43749:1;43738:9;43734:17;43727:47;43791:131;43917:4;43791:131;:::i;:::-;43783:139;;43510:419;;;:::o;43935:98::-;43986:6;44020:5;44014:12;44004:22;;43935:98;;;:::o;44039:168::-;44122:11;44156:6;44151:3;44144:19;44196:4;44191:3;44187:14;44172:29;;44039:168;;;;:::o;44213:360::-;44299:3;44327:38;44359:5;44327:38;:::i;:::-;44381:70;44444:6;44439:3;44381:70;:::i;:::-;44374:77;;44460:52;44505:6;44500:3;44493:4;44486:5;44482:16;44460:52;:::i;:::-;44537:29;44559:6;44537:29;:::i;:::-;44532:3;44528:39;44521:46;;44303:270;44213:360;;;;:::o;44579:640::-;44774:4;44812:3;44801:9;44797:19;44789:27;;44826:71;44894:1;44883:9;44879:17;44870:6;44826:71;:::i;:::-;44907:72;44975:2;44964:9;44960:18;44951:6;44907:72;:::i;:::-;44989;45057:2;45046:9;45042:18;45033:6;44989:72;:::i;:::-;45108:9;45102:4;45098:20;45093:2;45082:9;45078:18;45071:48;45136:76;45207:4;45198:6;45136:76;:::i;:::-;45128:84;;44579:640;;;;;;;:::o;45225:141::-;45281:5;45312:6;45306:13;45297:22;;45328:32;45354:5;45328:32;:::i;:::-;45225:141;;;;:::o;45372:349::-;45441:6;45490:2;45478:9;45469:7;45465:23;45461:32;45458:119;;;45496:79;;:::i;:::-;45458:119;45616:1;45641:63;45696:7;45687:6;45676:9;45672:22;45641:63;:::i;:::-;45631:73;;45587:127;45372:349;;;;:::o;45727:180::-;45775:77;45772:1;45765:88;45872:4;45869:1;45862:15;45896:4;45893:1;45886:15;45913:185;45953:1;45970:20;45988:1;45970:20;:::i;:::-;45965:25;;46004:20;46022:1;46004:20;:::i;:::-;45999:25;;46043:1;46033:35;;46048:18;;:::i;:::-;46033:35;46090:1;46087;46083:9;46078:14;;45913:185;;;;:::o;46104:176::-;46136:1;46153:20;46171:1;46153:20;:::i;:::-;46148:25;;46187:20;46205:1;46187:20;:::i;:::-;46182:25;;46226:1;46216:35;;46231:18;;:::i;:::-;46216:35;46272:1;46269;46265:9;46260:14;;46104:176;;;;:::o;46286:220::-;46426:34;46422:1;46414:6;46410:14;46403:58;46495:3;46490:2;46482:6;46478:15;46471:28;46286:220;:::o;46512:366::-;46654:3;46675:67;46739:2;46734:3;46675:67;:::i;:::-;46668:74;;46751:93;46840:3;46751:93;:::i;:::-;46869:2;46864:3;46860:12;46853:19;;46512:366;;;:::o;46884:419::-;47050:4;47088:2;47077:9;47073:18;47065:26;;47137:9;47131:4;47127:20;47123:1;47112:9;47108:17;47101:47;47165:131;47291:4;47165:131;:::i;:::-;47157:139;;46884:419;;;:::o;47309:227::-;47449:34;47445:1;47437:6;47433:14;47426:58;47518:10;47513:2;47505:6;47501:15;47494:35;47309:227;:::o;47542:366::-;47684:3;47705:67;47769:2;47764:3;47705:67;:::i;:::-;47698:74;;47781:93;47870:3;47781:93;:::i;:::-;47899:2;47894:3;47890:12;47883:19;;47542:366;;;:::o;47914:419::-;48080:4;48118:2;48107:9;48103:18;48095:26;;48167:9;48161:4;48157:20;48153:1;48142:9;48138:17;48131:47;48195:131;48321:4;48195:131;:::i;:::-;48187:139;;47914:419;;;:::o

Swarm Source

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