ETH Price: $3,112.84 (+1.38%)

Token

Kumo x World (KUMO)
 

Overview

Max Total Supply

6,651 KUMO

Holders

3,540

Market

Volume (24H)

0.0039 ETH

Min Price (24H)

$12.14 @ 0.003900 ETH

Max Price (24H)

$12.14 @ 0.003900 ETH

Other Info

Balance
1 KUMO
0x857eF00D7C214cAb9797Fc48C40E3A0D96F29db8
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

6,666 Kumo residents, 9 classes, 500+ traits. A percentage of sales go towards childrens and mental health charities Kumo x World roadmap includes Children Storybooks, Kumochis (like pets) for evolving, KxW Coins and future game development.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KumoXWorld

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/KumoWorld.sol


// eyJuYW1lIjoiME4xIC0gTWV0YWRhdGEiLCJkZXNjcmlwdGlvbiI6IlRoaXMgc2hvdWxkIE5PVCBiZSByZXZlYWxlZCBiZWZvcmUgYWxsIGFyZSBzb2xkLiBJbWFnZXMgY29udGFpbmVkIGJlbG93IiwiaW1hZ2VzIjoiMHg1MTZENTU0ODYxMzQ0QTc3NEI1MDY3NjY0ODcxNDM1ODMxNTQ3ODMyNTc2OTRBNTg2NDYzNEM2MzY1NTM3NDZGNTEzNjY1Nzg1NTU4Mzg1NDRBNkE0NjYxNjE1MSJ9
pragma solidity ^0.8.0;





contract KumoXWorld is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;

    constructor() ERC721("Kumo x World", "KUMO") {}

    uint256 public PRICE = 0.06 ether;
    uint256 public constant KUMO_GIFT_SUPPLY = 50;
    uint256 public constant EXPEDITION_RESERVED = 30;
    uint256 public constant KUMO_PUBLIC_SUPPLY = 6586;
    uint256 public constant MAX_SUPPLY =
        KUMO_PUBLIC_SUPPLY + KUMO_GIFT_SUPPLY + EXPEDITION_RESERVED;

    uint256 public constant TRANSACTION_LIMIT = 10;
    uint256 public constant ADDRESS_PURCHASE_LIMIT = 10;

    Counters.Counter public _publicTokenIdCounter;
    Counters.Counter public _giftTokenIdCounter;

    bool public isPublicSaleActive = false;
    bool public isWhitelistSaleActive = false;

    mapping(address => uint256) public _whitelist;
    mapping(address => uint256) public _whitelistPurchased;
    mapping(address => uint256) public _purchaseList;
    mapping(address => uint256) public _freeMint;

    string private baseURI = "";

    function purchase(uint256 numberOfTokens) external payable {
        uint256 totalSupply = totalSupply();
        require(msg.sender == tx.origin, "No contracts allowed");
        require(isPublicSaleActive, "Public sale is still inactive");
        require(totalSupply < MAX_SUPPLY, "Tokens are sold out");
        require(
            _publicTokenIdCounter.current() + numberOfTokens <=
                KUMO_PUBLIC_SUPPLY,
            "Public supply is sold out"
        );
        require(
            numberOfTokens <= TRANSACTION_LIMIT,
            "Cannot exceed TRANSACTION_LIMIT"
        );
        require(
            _purchaseList[msg.sender] + numberOfTokens <=
                ADDRESS_PURCHASE_LIMIT,
            "Cannot exceed public sale ADDRESS_PURCHASE_LIMIT"
        );
        require(
            msg.value >= PRICE * numberOfTokens,
            "ETH amount is not sufficient"
        );
        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = _publicTokenIdCounter.current() +
                _giftTokenIdCounter.current() +
                EXPEDITION_RESERVED;
            _purchaseList[msg.sender] += 1;
            _safeMint(msg.sender, tokenId);
            _publicTokenIdCounter.increment();
        }
    }

    function purchaseFromWhitelist(uint256 numberOfTokens) external payable {
        uint256 totalSupply = totalSupply();
        require(isWhitelistSaleActive, "Whitelist sale is still inactive");
        require(totalSupply < MAX_SUPPLY, "Tokens are sold out");
        require(
            totalSupply + numberOfTokens < KUMO_PUBLIC_SUPPLY,
            "Public supply is sold out"
        );
        require(
            _whitelistPurchased[msg.sender] + numberOfTokens <=
                _whitelist[msg.sender],
            "Not enough whitelist allocation"
        );
        require(
            numberOfTokens <= TRANSACTION_LIMIT,
            "Cannot be above PURCHASE_LIMIT"
        );
        require(
            msg.value >= PRICE * numberOfTokens,
            "ETH amount is not sufficient"
        );

        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = _publicTokenIdCounter.current() +
                _giftTokenIdCounter.current() +
                EXPEDITION_RESERVED;
            _whitelistPurchased[msg.sender] += 1;
            _safeMint(msg.sender, tokenId);
            _publicTokenIdCounter.increment();
        }
    }

    function gift(address[] calldata giftAddress, uint256[] calldata giftAmount)
        external
        onlyOwner
    {
        uint256 giftToBeSent = 0;
        for (uint256 z = 0; z < giftAmount.length; z++) {
            giftToBeSent += giftAmount[z];
        }
        require(totalSupply() < MAX_SUPPLY, "Tokens are sold out");
        require(
            _giftTokenIdCounter.current() + giftToBeSent <= KUMO_GIFT_SUPPLY,
            "Gift supply is sold out"
        );
        for (uint256 i = 0; i < giftAddress.length; i++) {
            for (uint256 y = 0; y < giftAmount[i]; y++) {
                _safeMint(
                    giftAddress[i],
                    _giftTokenIdCounter.current() +
                        _publicTokenIdCounter.current() +
                        EXPEDITION_RESERVED
                );
                _giftTokenIdCounter.increment();
            }
        }
    }

    function expeditionReturn(address[] calldata expeditionOwners)
        external
        onlyOwner
    {
        require(
            expeditionOwners.length == EXPEDITION_RESERVED,
            "Address not matching reserved for expedition"
        );
        for (uint256 i = 0; i < EXPEDITION_RESERVED; i++) {
            _safeMint(expeditionOwners[i], i);
        }
    }

    function claimFreeMint(uint256 numberOfTokens) external {
        require(
            numberOfTokens <= _freeMint[msg.sender],
            "You don't have enough free mints"
        );
        require(numberOfTokens > 0, "Number of tokens can't be 0");
        require(
            isWhitelistSaleActive,
            "Can only claim free mints during whitelist"
        );

        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = _publicTokenIdCounter.current() +
                _giftTokenIdCounter.current() +
                EXPEDITION_RESERVED;
            _freeMint[msg.sender] -= 1;
            _safeMint(msg.sender, tokenId);
            _publicTokenIdCounter.increment();
        }
    }

    function addToWhitelist(
        address[] calldata addressList,
        uint256[] calldata mintAmount
    ) external onlyOwner {
        require(
            addressList.length == mintAmount.length,
            "Arrays are not equal"
        );
        for (uint256 i = 0; i < addressList.length; i++) {
            require(addressList[i] != address(0), "Address can't be null");
            _whitelist[addressList[i]] = mintAmount[i];
        }
    }

    function removeFromWhitelist(address[] calldata addressList)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < addressList.length; i++) {
            require(addressList[i] != address(0), "Address can't be null");
            _whitelist[addressList[i]] = 0;
        }
    }

    function assignFreeMint(
        address[] calldata addressList,
        uint256[] calldata mintAmount
    ) external onlyOwner {
        require(
            addressList.length == mintAmount.length,
            "Arrays are not equal"
        );
        for (uint256 i = 0; i < addressList.length; i++) {
            require(addressList[i] != address(0), "Address can't be null");
            _freeMint[addressList[i]] = mintAmount[i];
        }
    }

    function checkWhiteList(address addr) external view returns (uint256) {
        return _whitelist[addr];
    }

    function checkFreeMints(address addr) external view returns (uint256) {
        return _freeMint[addr];
    }

    function setBaseURI(string calldata URI) external onlyOwner {
        baseURI = URI;
    }

    function setPublicSaleStatus() external onlyOwner {
        isPublicSaleActive = !isPublicSaleActive;
    }

    function setWhiteListSaleStatus() external onlyOwner {
        isWhitelistSaleActive = !isWhitelistSaleActive;
    }

    function setMintPrice(uint256 price) external onlyOwner {
        PRICE = price;
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721)
        returns (string memory)
    {
        require(_exists(tokenId), "Token does not exist");

        return string(abi.encodePacked(baseURI, Strings.toString(tokenId)));
    }
}

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":"ADDRESS_PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXPEDITION_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KUMO_GIFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KUMO_PUBLIC_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSACTION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_freeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_giftTokenIdCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicTokenIdCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_purchaseList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelistPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"},{"internalType":"uint256[]","name":"mintAmount","type":"uint256[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"},{"internalType":"uint256[]","name":"mintAmount","type":"uint256[]"}],"name":"assignFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkFreeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkWhiteList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"claimFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"expeditionOwners","type":"address[]"}],"name":"expeditionReturn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"giftAddress","type":"address[]"},{"internalType":"uint256[]","name":"giftAmount","type":"uint256[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchaseFromWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWhiteListSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266d529ae9e860000600b556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555060405180602001604052806000815250601390805190602001906200006c9291906200020f565b503480156200007a57600080fd5b506040518060400160405280600c81526020017f4b756d6f207820576f726c6400000000000000000000000000000000000000008152506040518060400160405280600481526020017f4b554d4f000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ff9291906200020f565b508060019080519060200190620001189291906200020f565b5050506200013b6200012f6200014160201b60201c565b6200014960201b60201c565b62000324565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021d90620002bf565b90600052602060002090601f0160209004810192826200024157600085556200028d565b82601f106200025c57805160ff19168380011785556200028d565b828001600101855582156200028d579182015b828111156200028c5782518255916020019190600101906200026f565b5b5090506200029c9190620002a0565b5090565b5b80821115620002bb576000816000905550600101620002a1565b5090565b60006002820490506001821680620002d857607f821691505b60208210811415620002ef57620002ee620002f5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615b1a80620003346000396000f3fe6080604052600436106102ae5760003560e01c80637dfed9fe11610175578063bfe0e632116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610abc578063f4a0a52814610ae5578063f8d5054214610b0e578063fc0f149e14610b37576102ae565b8063e985e9c514610a26578063ede30eda14610a63578063efef39a114610aa0576102ae565b8063bfe0e63214610914578063c3b4d5b91461092b578063c87b56dd14610956578063cfdb63ac14610993578063d6a6c2bf146109d0578063dd0671eb146109fb576102ae565b8063a9a7d6011161012e578063a9a7d60114610804578063aed2c3071461082f578063b4f0007c14610858578063b6fd509b14610895578063b88d4fde146108c0578063b98451cf146108e9576102ae565b80637dfed9fe146107065780638d859f3e1461071d5780638da5cb5b1461074857806395d89b41146107735780639cce37c61461079e578063a22cb465146107db576102ae565b80633ccfd60b116102195780636d93042d116101d25780636d93042d146105f857806370a0823114610635578063715018a61461067257806373d7dbf8146106895780637705f9b5146106b4578063784cbb56146106dd576102ae565b80633ccfd60b146104ec57806342842e0e146105035780634f6ccce71461052c578063548db1741461056957806355f804b3146105925780636352211e146105bb576102ae565b806313755e481161026b57806313755e48146103da57806318160ddd146104055780631e84c4131461043057806323b872dd1461045b5780632f745c591461048457806332cb6b0c146104c1576102ae565b806301ffc9a7146102b3578063065da01a146102f057806306fdde031461032d578063081812fc14610358578063095ea7b31461039557806312fc74a8146103be575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d591906141bf565b610b60565b6040516102e79190614936565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613f2e565b610bda565b6040516103249190614dd3565b60405180910390f35b34801561033957600080fd5b50610342610bf2565b60405161034f9190614951565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190614266565b610c84565b60405161038c91906148cf565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b791906140b1565b610d09565b005b6103d860048036038101906103d39190614266565b610e21565b005b3480156103e657600080fd5b506103ef611144565b6040516103fc9190614dd3565b60405180910390f35b34801561041157600080fd5b5061041a611149565b6040516104279190614dd3565b60405180910390f35b34801561043c57600080fd5b50610445611156565b6040516104529190614936565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190613f9b565b611169565b005b34801561049057600080fd5b506104ab60048036038101906104a691906140b1565b6111c9565b6040516104b89190614dd3565b60405180910390f35b3480156104cd57600080fd5b506104d661126e565b6040516104e39190614dd3565b60405180910390f35b3480156104f857600080fd5b5061050161128c565b005b34801561050f57600080fd5b5061052a60048036038101906105259190613f9b565b611357565b005b34801561053857600080fd5b50610553600480360381019061054e9190614266565b611377565b6040516105609190614dd3565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b91906140f1565b6113e8565b005b34801561059e57600080fd5b506105b960048036038101906105b49190614219565b61158d565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190614266565b61161f565b6040516105ef91906148cf565b60405180910390f35b34801561060457600080fd5b5061061f600480360381019061061a9190613f2e565b6116d1565b60405161062c9190614dd3565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190613f2e565b6116e9565b6040516106699190614dd3565b60405180910390f35b34801561067e57600080fd5b506106876117a1565b005b34801561069557600080fd5b5061069e611829565b6040516106ab9190614dd3565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d6919061413e565b611835565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190614266565b611a7b565b005b34801561071257600080fd5b5061071b611c4b565b005b34801561072957600080fd5b50610732611cf3565b60405161073f9190614dd3565b60405180910390f35b34801561075457600080fd5b5061075d611cf9565b60405161076a91906148cf565b60405180910390f35b34801561077f57600080fd5b50610788611d23565b6040516107959190614951565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613f2e565b611db5565b6040516107d29190614dd3565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd9190614071565b611dfe565b005b34801561081057600080fd5b50610819611f7f565b6040516108269190614dd3565b60405180910390f35b34801561083b57600080fd5b50610856600480360381019061085191906140f1565b611f85565b005b34801561086457600080fd5b5061087f600480360381019061087a9190613f2e565b61209c565b60405161088c9190614dd3565b60405180910390f35b3480156108a157600080fd5b506108aa6120b4565b6040516108b79190614dd3565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190613fee565b6120b9565b005b3480156108f557600080fd5b506108fe61211b565b60405161090b9190614936565b60405180910390f35b34801561092057600080fd5b5061092961212e565b005b34801561093757600080fd5b506109406121d6565b60405161094d9190614dd3565b60405180910390f35b34801561096257600080fd5b5061097d60048036038101906109789190614266565b6121e2565b60405161098a9190614951565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190613f2e565b61225e565b6040516109c79190614dd3565b60405180910390f35b3480156109dc57600080fd5b506109e5612276565b6040516109f29190614dd3565b60405180910390f35b348015610a0757600080fd5b50610a1061227b565b604051610a1d9190614dd3565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190613f5b565b612280565b604051610a5a9190614936565b60405180910390f35b348015610a6f57600080fd5b50610a8a6004803603810190610a859190613f2e565b612314565b604051610a979190614dd3565b60405180910390f35b610aba6004803603810190610ab59190614266565b61235d565b005b348015610ac857600080fd5b50610ae36004803603810190610ade9190613f2e565b6126ba565b005b348015610af157600080fd5b50610b0c6004803603810190610b079190614266565b6127b2565b005b348015610b1a57600080fd5b50610b356004803603810190610b30919061413e565b612838565b005b348015610b4357600080fd5b50610b5e6004803603810190610b59919061413e565b612a3f565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bd35750610bd282612c46565b5b9050919050565b60106020528060005260406000206000915090505481565b606060008054610c0190615067565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2d90615067565b8015610c7a5780601f10610c4f57610100808354040283529160200191610c7a565b820191906000526020600020905b815481529060010190602001808311610c5d57829003601f168201915b5050505050905090565b6000610c8f82612d28565b610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590614c53565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d148261161f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c90614cd3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610da4612d94565b73ffffffffffffffffffffffffffffffffffffffff161480610dd35750610dd281610dcd612d94565b612280565b5b610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990614b93565b60405180910390fd5b610e1c8383612d9c565b505050565b6000610e2b611149565b9050600e60019054906101000a900460ff16610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390614973565b60405180910390fd5b601e60326119ba610e8d9190614e9c565b610e979190614e9c565b8110610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90614d73565b60405180910390fd5b6119ba8282610ee79190614e9c565b10610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e90614db3565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb29190614e9c565b1115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614af3565b60405180910390fd5b600a821115611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e906149b3565b60405180910390fd5b81600b546110459190614f23565b341015611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e90614b33565b60405180910390fd5b60005b8281101561113f576000601e6110a0600d612e55565b6110aa600c612e55565b6110b49190614e9c565b6110be9190614e9c565b90506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111109190614e9c565b925050819055506111213382612e63565b61112b600c612e81565b508080611137906150ca565b91505061108a565b505050565b601e81565b6000600880549050905090565b600e60009054906101000a900460ff1681565b61117a611174612d94565b82612e97565b6111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090614cf3565b60405180910390fd5b6111c4838383612f75565b505050565b60006111d4836116e9565b8210611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c906149d3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601e60326119ba61127f9190614e9c565b6112899190614e9c565b81565b611294612d94565b73ffffffffffffffffffffffffffffffffffffffff166112b2611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90614c73565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611353573d6000803e3d6000fd5b5050565b611372838383604051806020016040528060008152506120b9565b505050565b6000611381611149565b82106113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614d13565b60405180910390fd5b600882815481106113d6576113d5615200565b5b90600052602060002001549050919050565b6113f0612d94565b73ffffffffffffffffffffffffffffffffffffffff1661140e611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90614c73565b60405180910390fd5b60005b8282905081101561158857600073ffffffffffffffffffffffffffffffffffffffff1683838381811061149d5761149c615200565b5b90506020020160208101906114b29190613f2e565b73ffffffffffffffffffffffffffffffffffffffff161415611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614d33565b60405180910390fd5b6000600f600085858581811061152257611521615200565b5b90506020020160208101906115379190613f2e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611580906150ca565b915050611467565b505050565b611595612d94565b73ffffffffffffffffffffffffffffffffffffffff166115b3611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614611609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160090614c73565b60405180910390fd5b81816013919061161a929190613cb0565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90614bf3565b60405180910390fd5b80915050919050565b60116020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175190614bd3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117a9612d94565b73ffffffffffffffffffffffffffffffffffffffff166117c7611cf9565b73ffffffffffffffffffffffffffffffffffffffff161461181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614c73565b60405180910390fd5b61182760006131d1565b565b600c8060000154905081565b61183d612d94565b73ffffffffffffffffffffffffffffffffffffffff1661185b611cf9565b73ffffffffffffffffffffffffffffffffffffffff16146118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890614c73565b60405180910390fd5b6000805b838390508110156118fa578383828181106118d3576118d2615200565b5b90506020020135826118e59190614e9c565b915080806118f2906150ca565b9150506118b5565b50601e60326119ba61190c9190614e9c565b6119169190614e9c565b61191e611149565b1061195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590614d73565b60405180910390fd5b60328161196b600d612e55565b6119759190614e9c565b11156119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90614a93565b60405180910390fd5b60005b85859050811015611a735760005b8484838181106119da576119d9615200565b5b90506020020135811015611a5f57611a428787848181106119fe576119fd615200565b5b9050602002016020810190611a139190613f2e565b601e611a1f600c612e55565b611a29600d612e55565b611a339190614e9c565b611a3d9190614e9c565b612e63565b611a4c600d612e81565b8080611a57906150ca565b9150506119c7565b508080611a6b906150ca565b9150506119b9565b505050505050565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af490614a73565b60405180910390fd5b60008111611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614a53565b60405180910390fd5b600e60019054906101000a900460ff16611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690614bb3565b60405180910390fd5b60005b81811015611c47576000601e611ba8600d612e55565b611bb2600c612e55565b611bbc9190614e9c565b611bc69190614e9c565b90506001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c189190614f7d565b92505081905550611c293382612e63565b611c33600c612e81565b508080611c3f906150ca565b915050611b92565b5050565b611c53612d94565b73ffffffffffffffffffffffffffffffffffffffff16611c71611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90614c73565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611d3290615067565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5e90615067565b8015611dab5780601f10611d8057610100808354040283529160200191611dab565b820191906000526020600020905b815481529060010190602001808311611d8e57829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e06612d94565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6b90614ad3565b60405180910390fd5b8060056000611e81612d94565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f2e612d94565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f739190614936565b60405180910390a35050565b6119ba81565b611f8d612d94565b73ffffffffffffffffffffffffffffffffffffffff16611fab611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890614c73565b60405180910390fd5b601e8282905014612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614993565b60405180910390fd5b60005b601e8110156120975761208483838381811061206957612068615200565b5b905060200201602081019061207e9190613f2e565b82612e63565b808061208f906150ca565b91505061204a565b505050565b60126020528060005260406000206000915090505481565b600a81565b6120ca6120c4612d94565b83612e97565b612109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210090614cf3565b60405180910390fd5b61211584848484613297565b50505050565b600e60019054906101000a900460ff1681565b612136612d94565b73ffffffffffffffffffffffffffffffffffffffff16612154611cf9565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a190614c73565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600d8060000154905081565b60606121ed82612d28565b61222c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222390614b13565b60405180910390fd5b6013612237836132f3565b6040516020016122489291906148ab565b6040516020818303038152906040529050919050565b600f6020528060005260406000206000915090505481565b600a81565b603281565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000612367611149565b90503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90614d93565b60405180910390fd5b600e60009054906101000a900460ff16612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d90614b73565b60405180910390fd5b601e60326119ba6124379190614e9c565b6124419190614e9c565b8110612482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247990614d73565b60405180910390fd5b6119ba82612490600c612e55565b61249a9190614e9c565b11156124db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d290614db3565b60405180910390fd5b600a82111561251f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251690614c13565b60405180910390fd5b600a82601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461256c9190614e9c565b11156125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a490614cb3565b60405180910390fd5b81600b546125bb9190614f23565b3410156125fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f490614b33565b60405180910390fd5b60005b828110156126b5576000601e612616600d612e55565b612620600c612e55565b61262a9190614e9c565b6126349190614e9c565b90506001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126869190614e9c565b925050819055506126973382612e63565b6126a1600c612e81565b5080806126ad906150ca565b915050612600565b505050565b6126c2612d94565b73ffffffffffffffffffffffffffffffffffffffff166126e0611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d90614c73565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279d90614a13565b60405180910390fd5b6127af816131d1565b50565b6127ba612d94565b73ffffffffffffffffffffffffffffffffffffffff166127d8611cf9565b73ffffffffffffffffffffffffffffffffffffffff161461282e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282590614c73565b60405180910390fd5b80600b8190555050565b612840612d94565b73ffffffffffffffffffffffffffffffffffffffff1661285e611cf9565b73ffffffffffffffffffffffffffffffffffffffff16146128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab90614c73565b60405180910390fd5b8181905084849050146128fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f390614d53565b60405180910390fd5b60005b84849050811015612a3857600073ffffffffffffffffffffffffffffffffffffffff1685858381811061293557612934615200565b5b905060200201602081019061294a9190613f2e565b73ffffffffffffffffffffffffffffffffffffffff1614156129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614d33565b60405180910390fd5b8282828181106129b4576129b3615200565b5b90506020020135600f60008787858181106129d2576129d1615200565b5b90506020020160208101906129e79190613f2e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080612a30906150ca565b9150506128ff565b5050505050565b612a47612d94565b73ffffffffffffffffffffffffffffffffffffffff16612a65611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614612abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab290614c73565b60405180910390fd5b818190508484905014612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa90614d53565b60405180910390fd5b60005b84849050811015612c3f57600073ffffffffffffffffffffffffffffffffffffffff16858583818110612b3c57612b3b615200565b5b9050602002016020810190612b519190613f2e565b73ffffffffffffffffffffffffffffffffffffffff161415612ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9f90614d33565b60405180910390fd5b828282818110612bbb57612bba615200565b5b9050602002013560126000878785818110612bd957612bd8615200565b5b9050602002016020810190612bee9190613f2e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080612c37906150ca565b915050612b06565b5050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d1157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d215750612d2082613454565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e0f8361161f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b612e7d8282604051806020016040528060008152506134be565b5050565b6001816000016000828254019250508190555050565b6000612ea282612d28565b612ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed890614b53565b60405180910390fd5b6000612eec8361161f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f5b57508373ffffffffffffffffffffffffffffffffffffffff16612f4384610c84565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f6c5750612f6b8185612280565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f958261161f565b73ffffffffffffffffffffffffffffffffffffffff1614612feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe290614c93565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561305b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305290614ab3565b60405180910390fd5b613066838383613519565b613071600082612d9c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130c19190614f7d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131189190614e9c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132a2848484612f75565b6132ae8484848461362d565b6132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e4906149f3565b60405180910390fd5b50505050565b6060600082141561333b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061344f565b600082905060005b6000821461336d578080613356906150ca565b915050600a826133669190614ef2565b9150613343565b60008167ffffffffffffffff8111156133895761338861522f565b5b6040519080825280601f01601f1916602001820160405280156133bb5781602001600182028036833780820191505090505b5090505b60008514613448576001826133d49190614f7d565b9150600a856133e39190615113565b60306133ef9190614e9c565b60f81b81838151811061340557613404615200565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134419190614ef2565b94506133bf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134c883836137c4565b6134d5600084848461362d565b613514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350b906149f3565b60405180910390fd5b505050565b613524838383613992565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135675761356281613997565b6135a6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135a5576135a483826139e0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135e9576135e481613b4d565b613628565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613627576136268282613c1e565b5b5b505050565b600061364e8473ffffffffffffffffffffffffffffffffffffffff16613c9d565b156137b7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613677612d94565b8786866040518563ffffffff1660e01b815260040161369994939291906148ea565b602060405180830381600087803b1580156136b357600080fd5b505af19250505080156136e457506040513d601f19601f820116820180604052508101906136e191906141ec565b60015b613767573d8060008114613714576040519150601f19603f3d011682016040523d82523d6000602084013e613719565b606091505b5060008151141561375f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613756906149f3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137bc565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382b90614c33565b60405180910390fd5b61383d81612d28565b1561387d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387490614a33565b60405180910390fd5b61388960008383613519565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138d99190614e9c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016139ed846116e9565b6139f79190614f7d565b9050600060076000848152602001908152602001600020549050818114613adc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b619190614f7d565b9050600060096000848152602001908152602001600020549050600060088381548110613b9157613b90615200565b5b906000526020600020015490508060088381548110613bb357613bb2615200565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613c0257613c016151d1565b5b6001900381819060005260206000200160009055905550505050565b6000613c29836116e9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613cbc90615067565b90600052602060002090601f016020900481019282613cde5760008555613d25565b82601f10613cf757803560ff1916838001178555613d25565b82800160010185558215613d25579182015b82811115613d24578235825591602001919060010190613d09565b5b509050613d329190613d36565b5090565b5b80821115613d4f576000816000905550600101613d37565b5090565b6000613d66613d6184614e13565b614dee565b905082815260208101848484011115613d8257613d8161526d565b5b613d8d848285615025565b509392505050565b600081359050613da481615a88565b92915050565b60008083601f840112613dc057613dbf615263565b5b8235905067ffffffffffffffff811115613ddd57613ddc61525e565b5b602083019150836020820283011115613df957613df8615268565b5b9250929050565b60008083601f840112613e1657613e15615263565b5b8235905067ffffffffffffffff811115613e3357613e3261525e565b5b602083019150836020820283011115613e4f57613e4e615268565b5b9250929050565b600081359050613e6581615a9f565b92915050565b600081359050613e7a81615ab6565b92915050565b600081519050613e8f81615ab6565b92915050565b600082601f830112613eaa57613ea9615263565b5b8135613eba848260208601613d53565b91505092915050565b60008083601f840112613ed957613ed8615263565b5b8235905067ffffffffffffffff811115613ef657613ef561525e565b5b602083019150836001820283011115613f1257613f11615268565b5b9250929050565b600081359050613f2881615acd565b92915050565b600060208284031215613f4457613f43615277565b5b6000613f5284828501613d95565b91505092915050565b60008060408385031215613f7257613f71615277565b5b6000613f8085828601613d95565b9250506020613f9185828601613d95565b9150509250929050565b600080600060608486031215613fb457613fb3615277565b5b6000613fc286828701613d95565b9350506020613fd386828701613d95565b9250506040613fe486828701613f19565b9150509250925092565b6000806000806080858703121561400857614007615277565b5b600061401687828801613d95565b945050602061402787828801613d95565b935050604061403887828801613f19565b925050606085013567ffffffffffffffff81111561405957614058615272565b5b61406587828801613e95565b91505092959194509250565b6000806040838503121561408857614087615277565b5b600061409685828601613d95565b92505060206140a785828601613e56565b9150509250929050565b600080604083850312156140c8576140c7615277565b5b60006140d685828601613d95565b92505060206140e785828601613f19565b9150509250929050565b6000806020838503121561410857614107615277565b5b600083013567ffffffffffffffff81111561412657614125615272565b5b61413285828601613daa565b92509250509250929050565b6000806000806040858703121561415857614157615277565b5b600085013567ffffffffffffffff81111561417657614175615272565b5b61418287828801613daa565b9450945050602085013567ffffffffffffffff8111156141a5576141a4615272565b5b6141b187828801613e00565b925092505092959194509250565b6000602082840312156141d5576141d4615277565b5b60006141e384828501613e6b565b91505092915050565b60006020828403121561420257614201615277565b5b600061421084828501613e80565b91505092915050565b600080602083850312156142305761422f615277565b5b600083013567ffffffffffffffff81111561424e5761424d615272565b5b61425a85828601613ec3565b92509250509250929050565b60006020828403121561427c5761427b615277565b5b600061428a84828501613f19565b91505092915050565b61429c81614fb1565b82525050565b6142ab81614fc3565b82525050565b60006142bc82614e59565b6142c68185614e6f565b93506142d6818560208601615034565b6142df8161527c565b840191505092915050565b60006142f582614e64565b6142ff8185614e80565b935061430f818560208601615034565b6143188161527c565b840191505092915050565b600061432e82614e64565b6143388185614e91565b9350614348818560208601615034565b80840191505092915050565b6000815461436181615067565b61436b8186614e91565b945060018216600081146143865760018114614397576143ca565b60ff198316865281860193506143ca565b6143a085614e44565b60005b838110156143c2578154818901526001820191506020810190506143a3565b838801955050505b50505092915050565b60006143e0602083614e80565b91506143eb8261528d565b602082019050919050565b6000614403602c83614e80565b915061440e826152b6565b604082019050919050565b6000614426601e83614e80565b915061443182615305565b602082019050919050565b6000614449602b83614e80565b91506144548261532e565b604082019050919050565b600061446c603283614e80565b91506144778261537d565b604082019050919050565b600061448f602683614e80565b915061449a826153cc565b604082019050919050565b60006144b2601c83614e80565b91506144bd8261541b565b602082019050919050565b60006144d5601b83614e80565b91506144e082615444565b602082019050919050565b60006144f8602083614e80565b91506145038261546d565b602082019050919050565b600061451b601783614e80565b915061452682615496565b602082019050919050565b600061453e602483614e80565b9150614549826154bf565b604082019050919050565b6000614561601983614e80565b915061456c8261550e565b602082019050919050565b6000614584601f83614e80565b915061458f82615537565b602082019050919050565b60006145a7601483614e80565b91506145b282615560565b602082019050919050565b60006145ca601c83614e80565b91506145d582615589565b602082019050919050565b60006145ed602c83614e80565b91506145f8826155b2565b604082019050919050565b6000614610601d83614e80565b915061461b82615601565b602082019050919050565b6000614633603883614e80565b915061463e8261562a565b604082019050919050565b6000614656602a83614e80565b915061466182615679565b604082019050919050565b6000614679602a83614e80565b9150614684826156c8565b604082019050919050565b600061469c602983614e80565b91506146a782615717565b604082019050919050565b60006146bf601f83614e80565b91506146ca82615766565b602082019050919050565b60006146e2602083614e80565b91506146ed8261578f565b602082019050919050565b6000614705602c83614e80565b9150614710826157b8565b604082019050919050565b6000614728602083614e80565b915061473382615807565b602082019050919050565b600061474b602983614e80565b915061475682615830565b604082019050919050565b600061476e603083614e80565b91506147798261587f565b604082019050919050565b6000614791602183614e80565b915061479c826158ce565b604082019050919050565b60006147b4603183614e80565b91506147bf8261591d565b604082019050919050565b60006147d7602c83614e80565b91506147e28261596c565b604082019050919050565b60006147fa601583614e80565b9150614805826159bb565b602082019050919050565b600061481d601483614e80565b9150614828826159e4565b602082019050919050565b6000614840601383614e80565b915061484b82615a0d565b602082019050919050565b6000614863601483614e80565b915061486e82615a36565b602082019050919050565b6000614886601983614e80565b915061489182615a5f565b602082019050919050565b6148a58161501b565b82525050565b60006148b78285614354565b91506148c38284614323565b91508190509392505050565b60006020820190506148e46000830184614293565b92915050565b60006080820190506148ff6000830187614293565b61490c6020830186614293565b614919604083018561489c565b818103606083015261492b81846142b1565b905095945050505050565b600060208201905061494b60008301846142a2565b92915050565b6000602082019050818103600083015261496b81846142ea565b905092915050565b6000602082019050818103600083015261498c816143d3565b9050919050565b600060208201905081810360008301526149ac816143f6565b9050919050565b600060208201905081810360008301526149cc81614419565b9050919050565b600060208201905081810360008301526149ec8161443c565b9050919050565b60006020820190508181036000830152614a0c8161445f565b9050919050565b60006020820190508181036000830152614a2c81614482565b9050919050565b60006020820190508181036000830152614a4c816144a5565b9050919050565b60006020820190508181036000830152614a6c816144c8565b9050919050565b60006020820190508181036000830152614a8c816144eb565b9050919050565b60006020820190508181036000830152614aac8161450e565b9050919050565b60006020820190508181036000830152614acc81614531565b9050919050565b60006020820190508181036000830152614aec81614554565b9050919050565b60006020820190508181036000830152614b0c81614577565b9050919050565b60006020820190508181036000830152614b2c8161459a565b9050919050565b60006020820190508181036000830152614b4c816145bd565b9050919050565b60006020820190508181036000830152614b6c816145e0565b9050919050565b60006020820190508181036000830152614b8c81614603565b9050919050565b60006020820190508181036000830152614bac81614626565b9050919050565b60006020820190508181036000830152614bcc81614649565b9050919050565b60006020820190508181036000830152614bec8161466c565b9050919050565b60006020820190508181036000830152614c0c8161468f565b9050919050565b60006020820190508181036000830152614c2c816146b2565b9050919050565b60006020820190508181036000830152614c4c816146d5565b9050919050565b60006020820190508181036000830152614c6c816146f8565b9050919050565b60006020820190508181036000830152614c8c8161471b565b9050919050565b60006020820190508181036000830152614cac8161473e565b9050919050565b60006020820190508181036000830152614ccc81614761565b9050919050565b60006020820190508181036000830152614cec81614784565b9050919050565b60006020820190508181036000830152614d0c816147a7565b9050919050565b60006020820190508181036000830152614d2c816147ca565b9050919050565b60006020820190508181036000830152614d4c816147ed565b9050919050565b60006020820190508181036000830152614d6c81614810565b9050919050565b60006020820190508181036000830152614d8c81614833565b9050919050565b60006020820190508181036000830152614dac81614856565b9050919050565b60006020820190508181036000830152614dcc81614879565b9050919050565b6000602082019050614de8600083018461489c565b92915050565b6000614df8614e09565b9050614e048282615099565b919050565b6000604051905090565b600067ffffffffffffffff821115614e2e57614e2d61522f565b5b614e378261527c565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ea78261501b565b9150614eb28361501b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ee757614ee6615144565b5b828201905092915050565b6000614efd8261501b565b9150614f088361501b565b925082614f1857614f17615173565b5b828204905092915050565b6000614f2e8261501b565b9150614f398361501b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f7257614f71615144565b5b828202905092915050565b6000614f888261501b565b9150614f938361501b565b925082821015614fa657614fa5615144565b5b828203905092915050565b6000614fbc82614ffb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615052578082015181840152602081019050615037565b83811115615061576000848401525b50505050565b6000600282049050600182168061507f57607f821691505b60208210811415615093576150926151a2565b5b50919050565b6150a28261527c565b810181811067ffffffffffffffff821117156150c1576150c061522f565b5b80604052505050565b60006150d58261501b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561510857615107615144565b5b600182019050919050565b600061511e8261501b565b91506151298361501b565b92508261513957615138615173565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f57686974656c6973742073616c65206973207374696c6c20696e616374697665600082015250565b7f41646472657373206e6f74206d61746368696e6720726573657276656420666f60008201527f722065787065646974696f6e0000000000000000000000000000000000000000602082015250565b7f43616e6e6f742062652061626f76652050555243484153455f4c494d49540000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e756d626572206f6620746f6b656e732063616e277420626520300000000000600082015250565b7f596f7520646f6e2774206861766520656e6f7567682066726565206d696e7473600082015250565b7f4769667420737570706c7920697320736f6c64206f7574000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f7567682077686974656c69737420616c6c6f636174696f6e00600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973207374696c6c20696e616374697665000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f43616e206f6e6c7920636c61696d2066726565206d696e747320647572696e6760008201527f2077686974656c69737400000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564205452414e53414354494f4e5f4c494d495400600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564207075626c69632073616c652041444452455360008201527f535f50555243484153455f4c494d495400000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416464726573732063616e2774206265206e756c6c0000000000000000000000600082015250565b7f41727261797320617265206e6f7420657175616c000000000000000000000000600082015250565b7f546f6b656e732061726520736f6c64206f757400000000000000000000000000600082015250565b7f4e6f20636f6e74726163747320616c6c6f776564000000000000000000000000600082015250565b7f5075626c696320737570706c7920697320736f6c64206f757400000000000000600082015250565b615a9181614fb1565b8114615a9c57600080fd5b50565b615aa881614fc3565b8114615ab357600080fd5b50565b615abf81614fcf565b8114615aca57600080fd5b50565b615ad68161501b565b8114615ae157600080fd5b5056fea26469706673582212200b45ee674e4b698148e1c0c752ff595a04077ac47c2c15a72048f82c1ef8c81b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80637dfed9fe11610175578063bfe0e632116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610abc578063f4a0a52814610ae5578063f8d5054214610b0e578063fc0f149e14610b37576102ae565b8063e985e9c514610a26578063ede30eda14610a63578063efef39a114610aa0576102ae565b8063bfe0e63214610914578063c3b4d5b91461092b578063c87b56dd14610956578063cfdb63ac14610993578063d6a6c2bf146109d0578063dd0671eb146109fb576102ae565b8063a9a7d6011161012e578063a9a7d60114610804578063aed2c3071461082f578063b4f0007c14610858578063b6fd509b14610895578063b88d4fde146108c0578063b98451cf146108e9576102ae565b80637dfed9fe146107065780638d859f3e1461071d5780638da5cb5b1461074857806395d89b41146107735780639cce37c61461079e578063a22cb465146107db576102ae565b80633ccfd60b116102195780636d93042d116101d25780636d93042d146105f857806370a0823114610635578063715018a61461067257806373d7dbf8146106895780637705f9b5146106b4578063784cbb56146106dd576102ae565b80633ccfd60b146104ec57806342842e0e146105035780634f6ccce71461052c578063548db1741461056957806355f804b3146105925780636352211e146105bb576102ae565b806313755e481161026b57806313755e48146103da57806318160ddd146104055780631e84c4131461043057806323b872dd1461045b5780632f745c591461048457806332cb6b0c146104c1576102ae565b806301ffc9a7146102b3578063065da01a146102f057806306fdde031461032d578063081812fc14610358578063095ea7b31461039557806312fc74a8146103be575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d591906141bf565b610b60565b6040516102e79190614936565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613f2e565b610bda565b6040516103249190614dd3565b60405180910390f35b34801561033957600080fd5b50610342610bf2565b60405161034f9190614951565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190614266565b610c84565b60405161038c91906148cf565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b791906140b1565b610d09565b005b6103d860048036038101906103d39190614266565b610e21565b005b3480156103e657600080fd5b506103ef611144565b6040516103fc9190614dd3565b60405180910390f35b34801561041157600080fd5b5061041a611149565b6040516104279190614dd3565b60405180910390f35b34801561043c57600080fd5b50610445611156565b6040516104529190614936565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190613f9b565b611169565b005b34801561049057600080fd5b506104ab60048036038101906104a691906140b1565b6111c9565b6040516104b89190614dd3565b60405180910390f35b3480156104cd57600080fd5b506104d661126e565b6040516104e39190614dd3565b60405180910390f35b3480156104f857600080fd5b5061050161128c565b005b34801561050f57600080fd5b5061052a60048036038101906105259190613f9b565b611357565b005b34801561053857600080fd5b50610553600480360381019061054e9190614266565b611377565b6040516105609190614dd3565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b91906140f1565b6113e8565b005b34801561059e57600080fd5b506105b960048036038101906105b49190614219565b61158d565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190614266565b61161f565b6040516105ef91906148cf565b60405180910390f35b34801561060457600080fd5b5061061f600480360381019061061a9190613f2e565b6116d1565b60405161062c9190614dd3565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190613f2e565b6116e9565b6040516106699190614dd3565b60405180910390f35b34801561067e57600080fd5b506106876117a1565b005b34801561069557600080fd5b5061069e611829565b6040516106ab9190614dd3565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d6919061413e565b611835565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190614266565b611a7b565b005b34801561071257600080fd5b5061071b611c4b565b005b34801561072957600080fd5b50610732611cf3565b60405161073f9190614dd3565b60405180910390f35b34801561075457600080fd5b5061075d611cf9565b60405161076a91906148cf565b60405180910390f35b34801561077f57600080fd5b50610788611d23565b6040516107959190614951565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613f2e565b611db5565b6040516107d29190614dd3565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd9190614071565b611dfe565b005b34801561081057600080fd5b50610819611f7f565b6040516108269190614dd3565b60405180910390f35b34801561083b57600080fd5b50610856600480360381019061085191906140f1565b611f85565b005b34801561086457600080fd5b5061087f600480360381019061087a9190613f2e565b61209c565b60405161088c9190614dd3565b60405180910390f35b3480156108a157600080fd5b506108aa6120b4565b6040516108b79190614dd3565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190613fee565b6120b9565b005b3480156108f557600080fd5b506108fe61211b565b60405161090b9190614936565b60405180910390f35b34801561092057600080fd5b5061092961212e565b005b34801561093757600080fd5b506109406121d6565b60405161094d9190614dd3565b60405180910390f35b34801561096257600080fd5b5061097d60048036038101906109789190614266565b6121e2565b60405161098a9190614951565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190613f2e565b61225e565b6040516109c79190614dd3565b60405180910390f35b3480156109dc57600080fd5b506109e5612276565b6040516109f29190614dd3565b60405180910390f35b348015610a0757600080fd5b50610a1061227b565b604051610a1d9190614dd3565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190613f5b565b612280565b604051610a5a9190614936565b60405180910390f35b348015610a6f57600080fd5b50610a8a6004803603810190610a859190613f2e565b612314565b604051610a979190614dd3565b60405180910390f35b610aba6004803603810190610ab59190614266565b61235d565b005b348015610ac857600080fd5b50610ae36004803603810190610ade9190613f2e565b6126ba565b005b348015610af157600080fd5b50610b0c6004803603810190610b079190614266565b6127b2565b005b348015610b1a57600080fd5b50610b356004803603810190610b30919061413e565b612838565b005b348015610b4357600080fd5b50610b5e6004803603810190610b59919061413e565b612a3f565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bd35750610bd282612c46565b5b9050919050565b60106020528060005260406000206000915090505481565b606060008054610c0190615067565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2d90615067565b8015610c7a5780601f10610c4f57610100808354040283529160200191610c7a565b820191906000526020600020905b815481529060010190602001808311610c5d57829003601f168201915b5050505050905090565b6000610c8f82612d28565b610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590614c53565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d148261161f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c90614cd3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610da4612d94565b73ffffffffffffffffffffffffffffffffffffffff161480610dd35750610dd281610dcd612d94565b612280565b5b610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990614b93565b60405180910390fd5b610e1c8383612d9c565b505050565b6000610e2b611149565b9050600e60019054906101000a900460ff16610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7390614973565b60405180910390fd5b601e60326119ba610e8d9190614e9c565b610e979190614e9c565b8110610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90614d73565b60405180910390fd5b6119ba8282610ee79190614e9c565b10610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e90614db3565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fb29190614e9c565b1115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614af3565b60405180910390fd5b600a821115611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e906149b3565b60405180910390fd5b81600b546110459190614f23565b341015611087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107e90614b33565b60405180910390fd5b60005b8281101561113f576000601e6110a0600d612e55565b6110aa600c612e55565b6110b49190614e9c565b6110be9190614e9c565b90506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111109190614e9c565b925050819055506111213382612e63565b61112b600c612e81565b508080611137906150ca565b91505061108a565b505050565b601e81565b6000600880549050905090565b600e60009054906101000a900460ff1681565b61117a611174612d94565b82612e97565b6111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090614cf3565b60405180910390fd5b6111c4838383612f75565b505050565b60006111d4836116e9565b8210611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c906149d3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601e60326119ba61127f9190614e9c565b6112899190614e9c565b81565b611294612d94565b73ffffffffffffffffffffffffffffffffffffffff166112b2611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90614c73565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611353573d6000803e3d6000fd5b5050565b611372838383604051806020016040528060008152506120b9565b505050565b6000611381611149565b82106113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614d13565b60405180910390fd5b600882815481106113d6576113d5615200565b5b90600052602060002001549050919050565b6113f0612d94565b73ffffffffffffffffffffffffffffffffffffffff1661140e611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90614c73565b60405180910390fd5b60005b8282905081101561158857600073ffffffffffffffffffffffffffffffffffffffff1683838381811061149d5761149c615200565b5b90506020020160208101906114b29190613f2e565b73ffffffffffffffffffffffffffffffffffffffff161415611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614d33565b60405180910390fd5b6000600f600085858581811061152257611521615200565b5b90506020020160208101906115379190613f2e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611580906150ca565b915050611467565b505050565b611595612d94565b73ffffffffffffffffffffffffffffffffffffffff166115b3611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614611609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160090614c73565b60405180910390fd5b81816013919061161a929190613cb0565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90614bf3565b60405180910390fd5b80915050919050565b60116020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175190614bd3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117a9612d94565b73ffffffffffffffffffffffffffffffffffffffff166117c7611cf9565b73ffffffffffffffffffffffffffffffffffffffff161461181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490614c73565b60405180910390fd5b61182760006131d1565b565b600c8060000154905081565b61183d612d94565b73ffffffffffffffffffffffffffffffffffffffff1661185b611cf9565b73ffffffffffffffffffffffffffffffffffffffff16146118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890614c73565b60405180910390fd5b6000805b838390508110156118fa578383828181106118d3576118d2615200565b5b90506020020135826118e59190614e9c565b915080806118f2906150ca565b9150506118b5565b50601e60326119ba61190c9190614e9c565b6119169190614e9c565b61191e611149565b1061195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590614d73565b60405180910390fd5b60328161196b600d612e55565b6119759190614e9c565b11156119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90614a93565b60405180910390fd5b60005b85859050811015611a735760005b8484838181106119da576119d9615200565b5b90506020020135811015611a5f57611a428787848181106119fe576119fd615200565b5b9050602002016020810190611a139190613f2e565b601e611a1f600c612e55565b611a29600d612e55565b611a339190614e9c565b611a3d9190614e9c565b612e63565b611a4c600d612e81565b8080611a57906150ca565b9150506119c7565b508080611a6b906150ca565b9150506119b9565b505050505050565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af490614a73565b60405180910390fd5b60008111611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614a53565b60405180910390fd5b600e60019054906101000a900460ff16611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690614bb3565b60405180910390fd5b60005b81811015611c47576000601e611ba8600d612e55565b611bb2600c612e55565b611bbc9190614e9c565b611bc69190614e9c565b90506001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c189190614f7d565b92505081905550611c293382612e63565b611c33600c612e81565b508080611c3f906150ca565b915050611b92565b5050565b611c53612d94565b73ffffffffffffffffffffffffffffffffffffffff16611c71611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90614c73565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611d3290615067565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5e90615067565b8015611dab5780601f10611d8057610100808354040283529160200191611dab565b820191906000526020600020905b815481529060010190602001808311611d8e57829003601f168201915b5050505050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e06612d94565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6b90614ad3565b60405180910390fd5b8060056000611e81612d94565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f2e612d94565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f739190614936565b60405180910390a35050565b6119ba81565b611f8d612d94565b73ffffffffffffffffffffffffffffffffffffffff16611fab611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890614c73565b60405180910390fd5b601e8282905014612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614993565b60405180910390fd5b60005b601e8110156120975761208483838381811061206957612068615200565b5b905060200201602081019061207e9190613f2e565b82612e63565b808061208f906150ca565b91505061204a565b505050565b60126020528060005260406000206000915090505481565b600a81565b6120ca6120c4612d94565b83612e97565b612109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210090614cf3565b60405180910390fd5b61211584848484613297565b50505050565b600e60019054906101000a900460ff1681565b612136612d94565b73ffffffffffffffffffffffffffffffffffffffff16612154611cf9565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a190614c73565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600d8060000154905081565b60606121ed82612d28565b61222c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222390614b13565b60405180910390fd5b6013612237836132f3565b6040516020016122489291906148ab565b6040516020818303038152906040529050919050565b600f6020528060005260406000206000915090505481565b600a81565b603281565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000612367611149565b90503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90614d93565b60405180910390fd5b600e60009054906101000a900460ff16612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d90614b73565b60405180910390fd5b601e60326119ba6124379190614e9c565b6124419190614e9c565b8110612482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247990614d73565b60405180910390fd5b6119ba82612490600c612e55565b61249a9190614e9c565b11156124db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d290614db3565b60405180910390fd5b600a82111561251f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251690614c13565b60405180910390fd5b600a82601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461256c9190614e9c565b11156125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a490614cb3565b60405180910390fd5b81600b546125bb9190614f23565b3410156125fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f490614b33565b60405180910390fd5b60005b828110156126b5576000601e612616600d612e55565b612620600c612e55565b61262a9190614e9c565b6126349190614e9c565b90506001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126869190614e9c565b925050819055506126973382612e63565b6126a1600c612e81565b5080806126ad906150ca565b915050612600565b505050565b6126c2612d94565b73ffffffffffffffffffffffffffffffffffffffff166126e0611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d90614c73565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279d90614a13565b60405180910390fd5b6127af816131d1565b50565b6127ba612d94565b73ffffffffffffffffffffffffffffffffffffffff166127d8611cf9565b73ffffffffffffffffffffffffffffffffffffffff161461282e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282590614c73565b60405180910390fd5b80600b8190555050565b612840612d94565b73ffffffffffffffffffffffffffffffffffffffff1661285e611cf9565b73ffffffffffffffffffffffffffffffffffffffff16146128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ab90614c73565b60405180910390fd5b8181905084849050146128fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f390614d53565b60405180910390fd5b60005b84849050811015612a3857600073ffffffffffffffffffffffffffffffffffffffff1685858381811061293557612934615200565b5b905060200201602081019061294a9190613f2e565b73ffffffffffffffffffffffffffffffffffffffff1614156129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614d33565b60405180910390fd5b8282828181106129b4576129b3615200565b5b90506020020135600f60008787858181106129d2576129d1615200565b5b90506020020160208101906129e79190613f2e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080612a30906150ca565b9150506128ff565b5050505050565b612a47612d94565b73ffffffffffffffffffffffffffffffffffffffff16612a65611cf9565b73ffffffffffffffffffffffffffffffffffffffff1614612abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab290614c73565b60405180910390fd5b818190508484905014612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa90614d53565b60405180910390fd5b60005b84849050811015612c3f57600073ffffffffffffffffffffffffffffffffffffffff16858583818110612b3c57612b3b615200565b5b9050602002016020810190612b519190613f2e565b73ffffffffffffffffffffffffffffffffffffffff161415612ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9f90614d33565b60405180910390fd5b828282818110612bbb57612bba615200565b5b9050602002013560126000878785818110612bd957612bd8615200565b5b9050602002016020810190612bee9190613f2e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080612c37906150ca565b915050612b06565b5050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d1157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d215750612d2082613454565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e0f8361161f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b612e7d8282604051806020016040528060008152506134be565b5050565b6001816000016000828254019250508190555050565b6000612ea282612d28565b612ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed890614b53565b60405180910390fd5b6000612eec8361161f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f5b57508373ffffffffffffffffffffffffffffffffffffffff16612f4384610c84565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f6c5750612f6b8185612280565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f958261161f565b73ffffffffffffffffffffffffffffffffffffffff1614612feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe290614c93565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561305b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305290614ab3565b60405180910390fd5b613066838383613519565b613071600082612d9c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130c19190614f7d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131189190614e9c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132a2848484612f75565b6132ae8484848461362d565b6132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e4906149f3565b60405180910390fd5b50505050565b6060600082141561333b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061344f565b600082905060005b6000821461336d578080613356906150ca565b915050600a826133669190614ef2565b9150613343565b60008167ffffffffffffffff8111156133895761338861522f565b5b6040519080825280601f01601f1916602001820160405280156133bb5781602001600182028036833780820191505090505b5090505b60008514613448576001826133d49190614f7d565b9150600a856133e39190615113565b60306133ef9190614e9c565b60f81b81838151811061340557613404615200565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134419190614ef2565b94506133bf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134c883836137c4565b6134d5600084848461362d565b613514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350b906149f3565b60405180910390fd5b505050565b613524838383613992565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135675761356281613997565b6135a6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135a5576135a483826139e0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135e9576135e481613b4d565b613628565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613627576136268282613c1e565b5b5b505050565b600061364e8473ffffffffffffffffffffffffffffffffffffffff16613c9d565b156137b7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613677612d94565b8786866040518563ffffffff1660e01b815260040161369994939291906148ea565b602060405180830381600087803b1580156136b357600080fd5b505af19250505080156136e457506040513d601f19601f820116820180604052508101906136e191906141ec565b60015b613767573d8060008114613714576040519150601f19603f3d011682016040523d82523d6000602084013e613719565b606091505b5060008151141561375f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613756906149f3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137bc565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382b90614c33565b60405180910390fd5b61383d81612d28565b1561387d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387490614a33565b60405180910390fd5b61388960008383613519565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138d99190614e9c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016139ed846116e9565b6139f79190614f7d565b9050600060076000848152602001908152602001600020549050818114613adc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b619190614f7d565b9050600060096000848152602001908152602001600020549050600060088381548110613b9157613b90615200565b5b906000526020600020015490508060088381548110613bb357613bb2615200565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613c0257613c016151d1565b5b6001900381819060005260206000200160009055905550505050565b6000613c29836116e9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613cbc90615067565b90600052602060002090601f016020900481019282613cde5760008555613d25565b82601f10613cf757803560ff1916838001178555613d25565b82800160010185558215613d25579182015b82811115613d24578235825591602001919060010190613d09565b5b509050613d329190613d36565b5090565b5b80821115613d4f576000816000905550600101613d37565b5090565b6000613d66613d6184614e13565b614dee565b905082815260208101848484011115613d8257613d8161526d565b5b613d8d848285615025565b509392505050565b600081359050613da481615a88565b92915050565b60008083601f840112613dc057613dbf615263565b5b8235905067ffffffffffffffff811115613ddd57613ddc61525e565b5b602083019150836020820283011115613df957613df8615268565b5b9250929050565b60008083601f840112613e1657613e15615263565b5b8235905067ffffffffffffffff811115613e3357613e3261525e565b5b602083019150836020820283011115613e4f57613e4e615268565b5b9250929050565b600081359050613e6581615a9f565b92915050565b600081359050613e7a81615ab6565b92915050565b600081519050613e8f81615ab6565b92915050565b600082601f830112613eaa57613ea9615263565b5b8135613eba848260208601613d53565b91505092915050565b60008083601f840112613ed957613ed8615263565b5b8235905067ffffffffffffffff811115613ef657613ef561525e565b5b602083019150836001820283011115613f1257613f11615268565b5b9250929050565b600081359050613f2881615acd565b92915050565b600060208284031215613f4457613f43615277565b5b6000613f5284828501613d95565b91505092915050565b60008060408385031215613f7257613f71615277565b5b6000613f8085828601613d95565b9250506020613f9185828601613d95565b9150509250929050565b600080600060608486031215613fb457613fb3615277565b5b6000613fc286828701613d95565b9350506020613fd386828701613d95565b9250506040613fe486828701613f19565b9150509250925092565b6000806000806080858703121561400857614007615277565b5b600061401687828801613d95565b945050602061402787828801613d95565b935050604061403887828801613f19565b925050606085013567ffffffffffffffff81111561405957614058615272565b5b61406587828801613e95565b91505092959194509250565b6000806040838503121561408857614087615277565b5b600061409685828601613d95565b92505060206140a785828601613e56565b9150509250929050565b600080604083850312156140c8576140c7615277565b5b60006140d685828601613d95565b92505060206140e785828601613f19565b9150509250929050565b6000806020838503121561410857614107615277565b5b600083013567ffffffffffffffff81111561412657614125615272565b5b61413285828601613daa565b92509250509250929050565b6000806000806040858703121561415857614157615277565b5b600085013567ffffffffffffffff81111561417657614175615272565b5b61418287828801613daa565b9450945050602085013567ffffffffffffffff8111156141a5576141a4615272565b5b6141b187828801613e00565b925092505092959194509250565b6000602082840312156141d5576141d4615277565b5b60006141e384828501613e6b565b91505092915050565b60006020828403121561420257614201615277565b5b600061421084828501613e80565b91505092915050565b600080602083850312156142305761422f615277565b5b600083013567ffffffffffffffff81111561424e5761424d615272565b5b61425a85828601613ec3565b92509250509250929050565b60006020828403121561427c5761427b615277565b5b600061428a84828501613f19565b91505092915050565b61429c81614fb1565b82525050565b6142ab81614fc3565b82525050565b60006142bc82614e59565b6142c68185614e6f565b93506142d6818560208601615034565b6142df8161527c565b840191505092915050565b60006142f582614e64565b6142ff8185614e80565b935061430f818560208601615034565b6143188161527c565b840191505092915050565b600061432e82614e64565b6143388185614e91565b9350614348818560208601615034565b80840191505092915050565b6000815461436181615067565b61436b8186614e91565b945060018216600081146143865760018114614397576143ca565b60ff198316865281860193506143ca565b6143a085614e44565b60005b838110156143c2578154818901526001820191506020810190506143a3565b838801955050505b50505092915050565b60006143e0602083614e80565b91506143eb8261528d565b602082019050919050565b6000614403602c83614e80565b915061440e826152b6565b604082019050919050565b6000614426601e83614e80565b915061443182615305565b602082019050919050565b6000614449602b83614e80565b91506144548261532e565b604082019050919050565b600061446c603283614e80565b91506144778261537d565b604082019050919050565b600061448f602683614e80565b915061449a826153cc565b604082019050919050565b60006144b2601c83614e80565b91506144bd8261541b565b602082019050919050565b60006144d5601b83614e80565b91506144e082615444565b602082019050919050565b60006144f8602083614e80565b91506145038261546d565b602082019050919050565b600061451b601783614e80565b915061452682615496565b602082019050919050565b600061453e602483614e80565b9150614549826154bf565b604082019050919050565b6000614561601983614e80565b915061456c8261550e565b602082019050919050565b6000614584601f83614e80565b915061458f82615537565b602082019050919050565b60006145a7601483614e80565b91506145b282615560565b602082019050919050565b60006145ca601c83614e80565b91506145d582615589565b602082019050919050565b60006145ed602c83614e80565b91506145f8826155b2565b604082019050919050565b6000614610601d83614e80565b915061461b82615601565b602082019050919050565b6000614633603883614e80565b915061463e8261562a565b604082019050919050565b6000614656602a83614e80565b915061466182615679565b604082019050919050565b6000614679602a83614e80565b9150614684826156c8565b604082019050919050565b600061469c602983614e80565b91506146a782615717565b604082019050919050565b60006146bf601f83614e80565b91506146ca82615766565b602082019050919050565b60006146e2602083614e80565b91506146ed8261578f565b602082019050919050565b6000614705602c83614e80565b9150614710826157b8565b604082019050919050565b6000614728602083614e80565b915061473382615807565b602082019050919050565b600061474b602983614e80565b915061475682615830565b604082019050919050565b600061476e603083614e80565b91506147798261587f565b604082019050919050565b6000614791602183614e80565b915061479c826158ce565b604082019050919050565b60006147b4603183614e80565b91506147bf8261591d565b604082019050919050565b60006147d7602c83614e80565b91506147e28261596c565b604082019050919050565b60006147fa601583614e80565b9150614805826159bb565b602082019050919050565b600061481d601483614e80565b9150614828826159e4565b602082019050919050565b6000614840601383614e80565b915061484b82615a0d565b602082019050919050565b6000614863601483614e80565b915061486e82615a36565b602082019050919050565b6000614886601983614e80565b915061489182615a5f565b602082019050919050565b6148a58161501b565b82525050565b60006148b78285614354565b91506148c38284614323565b91508190509392505050565b60006020820190506148e46000830184614293565b92915050565b60006080820190506148ff6000830187614293565b61490c6020830186614293565b614919604083018561489c565b818103606083015261492b81846142b1565b905095945050505050565b600060208201905061494b60008301846142a2565b92915050565b6000602082019050818103600083015261496b81846142ea565b905092915050565b6000602082019050818103600083015261498c816143d3565b9050919050565b600060208201905081810360008301526149ac816143f6565b9050919050565b600060208201905081810360008301526149cc81614419565b9050919050565b600060208201905081810360008301526149ec8161443c565b9050919050565b60006020820190508181036000830152614a0c8161445f565b9050919050565b60006020820190508181036000830152614a2c81614482565b9050919050565b60006020820190508181036000830152614a4c816144a5565b9050919050565b60006020820190508181036000830152614a6c816144c8565b9050919050565b60006020820190508181036000830152614a8c816144eb565b9050919050565b60006020820190508181036000830152614aac8161450e565b9050919050565b60006020820190508181036000830152614acc81614531565b9050919050565b60006020820190508181036000830152614aec81614554565b9050919050565b60006020820190508181036000830152614b0c81614577565b9050919050565b60006020820190508181036000830152614b2c8161459a565b9050919050565b60006020820190508181036000830152614b4c816145bd565b9050919050565b60006020820190508181036000830152614b6c816145e0565b9050919050565b60006020820190508181036000830152614b8c81614603565b9050919050565b60006020820190508181036000830152614bac81614626565b9050919050565b60006020820190508181036000830152614bcc81614649565b9050919050565b60006020820190508181036000830152614bec8161466c565b9050919050565b60006020820190508181036000830152614c0c8161468f565b9050919050565b60006020820190508181036000830152614c2c816146b2565b9050919050565b60006020820190508181036000830152614c4c816146d5565b9050919050565b60006020820190508181036000830152614c6c816146f8565b9050919050565b60006020820190508181036000830152614c8c8161471b565b9050919050565b60006020820190508181036000830152614cac8161473e565b9050919050565b60006020820190508181036000830152614ccc81614761565b9050919050565b60006020820190508181036000830152614cec81614784565b9050919050565b60006020820190508181036000830152614d0c816147a7565b9050919050565b60006020820190508181036000830152614d2c816147ca565b9050919050565b60006020820190508181036000830152614d4c816147ed565b9050919050565b60006020820190508181036000830152614d6c81614810565b9050919050565b60006020820190508181036000830152614d8c81614833565b9050919050565b60006020820190508181036000830152614dac81614856565b9050919050565b60006020820190508181036000830152614dcc81614879565b9050919050565b6000602082019050614de8600083018461489c565b92915050565b6000614df8614e09565b9050614e048282615099565b919050565b6000604051905090565b600067ffffffffffffffff821115614e2e57614e2d61522f565b5b614e378261527c565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ea78261501b565b9150614eb28361501b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ee757614ee6615144565b5b828201905092915050565b6000614efd8261501b565b9150614f088361501b565b925082614f1857614f17615173565b5b828204905092915050565b6000614f2e8261501b565b9150614f398361501b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f7257614f71615144565b5b828202905092915050565b6000614f888261501b565b9150614f938361501b565b925082821015614fa657614fa5615144565b5b828203905092915050565b6000614fbc82614ffb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615052578082015181840152602081019050615037565b83811115615061576000848401525b50505050565b6000600282049050600182168061507f57607f821691505b60208210811415615093576150926151a2565b5b50919050565b6150a28261527c565b810181811067ffffffffffffffff821117156150c1576150c061522f565b5b80604052505050565b60006150d58261501b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561510857615107615144565b5b600182019050919050565b600061511e8261501b565b91506151298361501b565b92508261513957615138615173565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f57686974656c6973742073616c65206973207374696c6c20696e616374697665600082015250565b7f41646472657373206e6f74206d61746368696e6720726573657276656420666f60008201527f722065787065646974696f6e0000000000000000000000000000000000000000602082015250565b7f43616e6e6f742062652061626f76652050555243484153455f4c494d49540000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e756d626572206f6620746f6b656e732063616e277420626520300000000000600082015250565b7f596f7520646f6e2774206861766520656e6f7567682066726565206d696e7473600082015250565b7f4769667420737570706c7920697320736f6c64206f7574000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f7567682077686974656c69737420616c6c6f636174696f6e00600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973207374696c6c20696e616374697665000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f43616e206f6e6c7920636c61696d2066726565206d696e747320647572696e6760008201527f2077686974656c69737400000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564205452414e53414354494f4e5f4c494d495400600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564207075626c69632073616c652041444452455360008201527f535f50555243484153455f4c494d495400000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416464726573732063616e2774206265206e756c6c0000000000000000000000600082015250565b7f41727261797320617265206e6f7420657175616c000000000000000000000000600082015250565b7f546f6b656e732061726520736f6c64206f757400000000000000000000000000600082015250565b7f4e6f20636f6e74726163747320616c6c6f776564000000000000000000000000600082015250565b7f5075626c696320737570706c7920697320736f6c64206f757400000000000000600082015250565b615a9181614fb1565b8114615a9c57600080fd5b50565b615aa881614fc3565b8114615ab357600080fd5b50565b615abf81614fcf565b8114615aca57600080fd5b50565b615ad68161501b565b8114615ae157600080fd5b5056fea26469706673582212200b45ee674e4b698148e1c0c752ff595a04077ac47c2c15a72048f82c1ef8c81b64736f6c63430008070033

Deployed Bytecode Sourcemap

44928:8001:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38410:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45764:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26302:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27861:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27384:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47270:1203;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45175:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39050:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45617:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28751:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38718:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45286:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52496:145;;;;;;;;;;;;;:::i;:::-;;29161:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39240:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51035:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52057:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25996:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45825:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25726:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6001:94;;;;;;;;;;;;;:::i;:::-;;45513:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48481:930;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49811:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52157:109;;;;;;;;;;;;;:::i;:::-;;45083:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5350:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26471:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51818:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28154:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45230:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49419:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45880:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45400:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29417:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45662:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52274:118;;;;;;;;;;;;;:::i;:::-;;45565:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52649:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45712:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45453:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45123:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28520:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51938:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45969:1293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6250:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52400:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50563:464;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51347:463;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38410:224;38512:4;38551:35;38536:50;;;:11;:50;;;;:90;;;;38590:36;38614:11;38590:23;:36::i;:::-;38536:90;38529:97;;38410:224;;;:::o;45764:54::-;;;;;;;;;;;;;;;;;:::o;26302:100::-;26356:13;26389:5;26382:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26302:100;:::o;27861:221::-;27937:7;27965:16;27973:7;27965;:16::i;:::-;27957:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28050:15;:24;28066:7;28050:24;;;;;;;;;;;;;;;;;;;;;28043:31;;27861:221;;;:::o;27384:411::-;27465:13;27481:23;27496:7;27481:14;:23::i;:::-;27465:39;;27529:5;27523:11;;:2;:11;;;;27515:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27623:5;27607:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27632:37;27649:5;27656:12;:10;:12::i;:::-;27632:16;:37::i;:::-;27607:62;27585:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27766:21;27775:2;27779:7;27766:8;:21::i;:::-;27454:341;27384:411;;:::o;47270:1203::-;47353:19;47375:13;:11;:13::i;:::-;47353:35;;47407:21;;;;;;;;;;;47399:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45221:2;45166;45275:4;45332:37;;;;:::i;:::-;:59;;;;:::i;:::-;47484:11;:24;47476:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;45275:4;47579:14;47565:11;:28;;;;:::i;:::-;:49;47543:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;47769:10;:22;47780:10;47769:22;;;;;;;;;;;;;;;;47734:14;47700:19;:31;47720:10;47700:31;;;;;;;;;;;;;;;;:48;;;;:::i;:::-;:91;;47678:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;45444:2;47883:14;:35;;47861:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;48030:14;48022:5;;:22;;;;:::i;:::-;48009:9;:35;;47987:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;48118:9;48113:353;48137:14;48133:1;:18;48113:353;;;48173:15;45221:2;48242:29;:19;:27;:29::i;:::-;48191:31;:21;:29;:31::i;:::-;:80;;;;:::i;:::-;:119;;;;:::i;:::-;48173:137;;48360:1;48325:19;:31;48345:10;48325:31;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;48376:30;48386:10;48398:7;48376:9;:30::i;:::-;48421:33;:21;:31;:33::i;:::-;48158:308;48153:3;;;;;:::i;:::-;;;;48113:353;;;;47342:1131;47270:1203;:::o;45175:48::-;45221:2;45175:48;:::o;39050:113::-;39111:7;39138:10;:17;;;;39131:24;;39050:113;:::o;45617:38::-;;;;;;;;;;;;;:::o;28751:339::-;28946:41;28965:12;:10;:12::i;:::-;28979:7;28946:18;:41::i;:::-;28938:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29054:28;29064:4;29070:2;29074:7;29054:9;:28::i;:::-;28751:339;;;:::o;38718:256::-;38815:7;38851:23;38868:5;38851:16;:23::i;:::-;38843:5;:31;38835:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38940:12;:19;38953:5;38940:19;;;;;;;;;;;;;;;:26;38960:5;38940:26;;;;;;;;;;;;38933:33;;38718:256;;;;:::o;45286:105::-;45221:2;45166;45275:4;45332:37;;;;:::i;:::-;:59;;;;:::i;:::-;45286:105;:::o;52496:145::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52546:15:::1;52564:21;52546:39;;52604:10;52596:28;;:37;52625:7;52596:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52535:106;52496:145::o:0;29161:185::-;29299:39;29316:4;29322:2;29326:7;29299:39;;;;;;;;;;;;:16;:39::i;:::-;29161:185;;;:::o;39240:233::-;39315:7;39351:30;:28;:30::i;:::-;39343:5;:38;39335:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39448:10;39459:5;39448:17;;;;;;;;:::i;:::-;;;;;;;;;;39441:24;;39240:233;;;:::o;51035:304::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51154:9:::1;51149:183;51173:11;;:18;;51169:1;:22;51149:183;;;51247:1;51221:28;;:11;;51233:1;51221:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:28;;;;51213:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51319:1;51290:10;:26;51301:11;;51313:1;51301:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;51290:26;;;;;;;;;;;;;;;:30;;;;51193:3;;;;;:::i;:::-;;;;51149:183;;;;51035:304:::0;;:::o;52057:92::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52138:3:::1;;52128:7;:13;;;;;;;:::i;:::-;;52057:92:::0;;:::o;25996:239::-;26068:7;26088:13;26104:7;:16;26112:7;26104:16;;;;;;;;;;;;;;;;;;;;;26088:32;;26156:1;26139:19;;:5;:19;;;;26131:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26222:5;26215:12;;;25996:239;;;:::o;45825:48::-;;;;;;;;;;;;;;;;;:::o;25726:208::-;25798:7;25843:1;25826:19;;:5;:19;;;;25818:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25910:9;:16;25920:5;25910:16;;;;;;;;;;;;;;;;25903:23;;25726:208;;;:::o;6001:94::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6066:21:::1;6084:1;6066:9;:21::i;:::-;6001:94::o:0;45513:45::-;;;;;;;;;:::o;48481:930::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48611:20:::1;48651:9:::0;48646:104:::1;48670:10;;:17;;48666:1;:21;48646:104;;;48725:10;;48736:1;48725:13;;;;;;;:::i;:::-;;;;;;;;48709:29;;;;;:::i;:::-;;;48689:3;;;;;:::i;:::-;;;;48646:104;;;;45221:2;45166;45275:4;45332:37;;;;:::i;:::-;:59;;;;:::i;:::-;48768:13;:11;:13::i;:::-;:26;48760:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45166:2;48883:12;48851:29;:19;:27;:29::i;:::-;:44;;;;:::i;:::-;:64;;48829:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;48982:9;48977:427;49001:11;;:18;;48997:1;:22;48977:427;;;49046:9;49041:352;49065:10;;49076:1;49065:13;;;;;;;:::i;:::-;;;;;;;;49061:1;:17;49041:352;;;49104:223;49136:11;;49148:1;49136:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;45221:2;49230:31;:21;:29;:31::i;:::-;49173:29;:19;:27;:29::i;:::-;:88;;;;:::i;:::-;:135;;;;:::i;:::-;49104:9;:223::i;:::-;49346:31;:19;:29;:31::i;:::-;49080:3;;;;;:::i;:::-;;;;49041:352;;;;49021:3;;;;;:::i;:::-;;;;48977:427;;;;48600:811;48481:930:::0;;;;:::o;49811:744::-;49918:9;:21;49928:10;49918:21;;;;;;;;;;;;;;;;49900:14;:39;;49878:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;50035:1;50018:14;:18;50010:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50101:21;;;;;;;;;;;50079:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;50210:9;50205:343;50229:14;50225:1;:18;50205:343;;;50265:15;45221:2;50334:29;:19;:27;:29::i;:::-;50283:31;:21;:29;:31::i;:::-;:80;;;;:::i;:::-;:119;;;;:::i;:::-;50265:137;;50442:1;50417:9;:21;50427:10;50417:21;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;50458:30;50468:10;50480:7;50458:9;:30::i;:::-;50503:33;:21;:31;:33::i;:::-;50250:298;50245:3;;;;;:::i;:::-;;;;50205:343;;;;49811:744;:::o;52157:109::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52240:18:::1;;;;;;;;;;;52239:19;52218:18;;:40;;;;;;;;;;;;;;;;;;52157:109::o:0;45083:33::-;;;;:::o;5350:87::-;5396:7;5423:6;;;;;;;;;;;5416:13;;5350:87;:::o;26471:104::-;26527:13;26560:7;26553:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26471:104;:::o;51818:112::-;51879:7;51906:10;:16;51917:4;51906:16;;;;;;;;;;;;;;;;51899:23;;51818:112;;;:::o;28154:295::-;28269:12;:10;:12::i;:::-;28257:24;;:8;:24;;;;28249:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28369:8;28324:18;:32;28343:12;:10;:12::i;:::-;28324:32;;;;;;;;;;;;;;;:42;28357:8;28324:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28422:8;28393:48;;28408:12;:10;:12::i;:::-;28393:48;;;28432:8;28393:48;;;;;;:::i;:::-;;;;;;;;28154:295;;:::o;45230:49::-;45275:4;45230:49;:::o;49419:384::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45221:2:::1;49557:16;;:23;;:46;49535:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;49691:9;49686:110;45221:2;49706:1;:23;49686:110;;;49751:33;49761:16;;49778:1;49761:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;49782:1;49751:9;:33::i;:::-;49731:3;;;;;:::i;:::-;;;;49686:110;;;;49419:384:::0;;:::o;45880:44::-;;;;;;;;;;;;;;;;;:::o;45400:46::-;45444:2;45400:46;:::o;29417:328::-;29592:41;29611:12;:10;:12::i;:::-;29625:7;29592:18;:41::i;:::-;29584:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29698:39;29712:4;29718:2;29722:7;29731:5;29698:13;:39::i;:::-;29417:328;;;;:::o;45662:41::-;;;;;;;;;;;;;:::o;52274:118::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52363:21:::1;;;;;;;;;;;52362:22;52338:21;;:46;;;;;;;;;;;;;;;;;;52274:118::o:0;45565:43::-;;;;;;;;;:::o;52649:277::-;52758:13;52797:16;52805:7;52797;:16::i;:::-;52789:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;52882:7;52891:25;52908:7;52891:16;:25::i;:::-;52865:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52851:67;;52649:277;;;:::o;45712:45::-;;;;;;;;;;;;;;;;;:::o;45453:51::-;45502:2;45453:51;:::o;45123:45::-;45166:2;45123:45;:::o;28520:164::-;28617:4;28641:18;:25;28660:5;28641:25;;;;;;;;;;;;;;;:35;28667:8;28641:35;;;;;;;;;;;;;;;;;;;;;;;;;28634:42;;28520:164;;;;:::o;51938:111::-;51999:7;52026:9;:15;52036:4;52026:15;;;;;;;;;;;;;;;;52019:22;;51938:111;;;:::o;45969:1293::-;46039:19;46061:13;:11;:13::i;:::-;46039:35;;46107:9;46093:23;;:10;:23;;;46085:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;46160:18;;;;;;;;;;;46152:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;45221:2;45166;45275:4;45332:37;;;;:::i;:::-;:59;;;;:::i;:::-;46231:11;:24;46223:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;45275:4;46346:14;46312:31;:21;:29;:31::i;:::-;:48;;;;:::i;:::-;:87;;46290:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;45444:2;46485:14;:35;;46463:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;45502:2;46640:14;46612:13;:25;46626:10;46612:25;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:85;;46590:183;;;;;;;;;;;;:::i;:::-;;;;;;;;;46827:14;46819:5;;:22;;;;:::i;:::-;46806:9;:35;;46784:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;46913:9;46908:347;46932:14;46928:1;:18;46908:347;;;46968:15;45221:2;47037:29;:19;:27;:29::i;:::-;46986:31;:21;:29;:31::i;:::-;:80;;;;:::i;:::-;:119;;;;:::i;:::-;46968:137;;47149:1;47120:13;:25;47134:10;47120:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;47165;47175:10;47187:7;47165:9;:30::i;:::-;47210:33;:21;:31;:33::i;:::-;46953:302;46948:3;;;;;:::i;:::-;;;;46908:347;;;;46028:1234;45969:1293;:::o;6250:192::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6359:1:::1;6339:22;;:8;:22;;;;6331:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6415:19;6425:8;6415:9;:19::i;:::-;6250:192:::0;:::o;52400:88::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52475:5:::1;52467;:13;;;;52400:88:::0;:::o;50563:464::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50749:10:::1;;:17;;50727:11;;:18;;:39;50705:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;50830:9;50825:195;50849:11;;:18;;50845:1;:22;50825:195;;;50923:1;50897:28;;:11;;50909:1;50897:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:28;;;;50889:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50995:10;;51006:1;50995:13;;;;;;;:::i;:::-;;;;;;;;50966:10;:26;50977:11;;50989:1;50977:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50966:26;;;;;;;;;;;;;;;:42;;;;50869:3;;;;;:::i;:::-;;;;50825:195;;;;50563:464:::0;;;;:::o;51347:463::-;5581:12;:10;:12::i;:::-;5570:23;;:7;:5;:7::i;:::-;:23;;;5562:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51533:10:::1;;:17;;51511:11;;:18;;:39;51489:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;51614:9;51609:194;51633:11;;:18;;51629:1;:22;51609:194;;;51707:1;51681:28;;:11;;51693:1;51681:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:28;;;;51673:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51778:10;;51789:1;51778:13;;;;;;;:::i;:::-;;;;;;;;51750:9;:25;51760:11;;51772:1;51760:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;51750:25;;;;;;;;;;;;;;;:41;;;;51653:3;;;;;:::i;:::-;;;;51609:194;;;;51347:463:::0;;;;:::o;25357:305::-;25459:4;25511:25;25496:40;;;:11;:40;;;;:105;;;;25568:33;25553:48;;;:11;:48;;;;25496:105;:158;;;;25618:36;25642:11;25618:23;:36::i;:::-;25496:158;25476:178;;25357:305;;;:::o;31255:127::-;31320:4;31372:1;31344:30;;:7;:16;31352:7;31344:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31337:37;;31255:127;;;:::o;4138:98::-;4191:7;4218:10;4211:17;;4138:98;:::o;35237:174::-;35339:2;35312:15;:24;35328:7;35312:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35395:7;35391:2;35357:46;;35366:23;35381:7;35366:14;:23::i;:::-;35357:46;;;;;;;;;;;;35237:174;;:::o;850:114::-;915:7;942;:14;;;935:21;;850:114;;;:::o;32239:110::-;32315:26;32325:2;32329:7;32315:26;;;;;;;;;;;;:9;:26::i;:::-;32239:110;;:::o;972:127::-;1079:1;1061:7;:14;;;:19;;;;;;;;;;;972:127;:::o;31549:348::-;31642:4;31667:16;31675:7;31667;:16::i;:::-;31659:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31743:13;31759:23;31774:7;31759:14;:23::i;:::-;31743:39;;31812:5;31801:16;;:7;:16;;;:51;;;;31845:7;31821:31;;:20;31833:7;31821:11;:20::i;:::-;:31;;;31801:51;:87;;;;31856:32;31873:5;31880:7;31856:16;:32::i;:::-;31801:87;31793:96;;;31549:348;;;;:::o;34541:578::-;34700:4;34673:31;;:23;34688:7;34673:14;:23::i;:::-;:31;;;34665:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34783:1;34769:16;;:2;:16;;;;34761:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34839:39;34860:4;34866:2;34870:7;34839:20;:39::i;:::-;34943:29;34960:1;34964:7;34943:8;:29::i;:::-;35004:1;34985:9;:15;34995:4;34985:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35033:1;35016:9;:13;35026:2;35016:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35064:2;35045:7;:16;35053:7;35045:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35103:7;35099:2;35084:27;;35093:4;35084:27;;;;;;;;;;;;34541:578;;;:::o;6450:173::-;6506:16;6525:6;;;;;;;;;;;6506:25;;6551:8;6542:6;;:17;;;;;;;;;;;;;;;;;;6606:8;6575:40;;6596:8;6575:40;;;;;;;;;;;;6495:128;6450:173;:::o;30627:315::-;30784:28;30794:4;30800:2;30804:7;30784:9;:28::i;:::-;30831:48;30854:4;30860:2;30864:7;30873:5;30831:22;:48::i;:::-;30823:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30627:315;;;;:::o;1754:723::-;1810:13;2040:1;2031:5;:10;2027:53;;;2058:10;;;;;;;;;;;;;;;;;;;;;2027:53;2090:12;2105:5;2090:20;;2121:14;2146:78;2161:1;2153:4;:9;2146:78;;2179:8;;;;;:::i;:::-;;;;2210:2;2202:10;;;;;:::i;:::-;;;2146:78;;;2234:19;2266:6;2256:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2234:39;;2284:154;2300:1;2291:5;:10;2284:154;;2328:1;2318:11;;;;;:::i;:::-;;;2395:2;2387:5;:10;;;;:::i;:::-;2374:2;:24;;;;:::i;:::-;2361:39;;2344:6;2351;2344:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2424:2;2415:11;;;;;:::i;:::-;;;2284:154;;;2462:6;2448:21;;;;;1754:723;;;;:::o;17336:157::-;17421:4;17460:25;17445:40;;;:11;:40;;;;17438:47;;17336:157;;;:::o;32576:321::-;32706:18;32712:2;32716:7;32706:5;:18::i;:::-;32757:54;32788:1;32792:2;32796:7;32805:5;32757:22;:54::i;:::-;32735:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32576:321;;;:::o;40086:589::-;40230:45;40257:4;40263:2;40267:7;40230:26;:45::i;:::-;40308:1;40292:18;;:4;:18;;;40288:187;;;40327:40;40359:7;40327:31;:40::i;:::-;40288:187;;;40397:2;40389:10;;:4;:10;;;40385:90;;40416:47;40449:4;40455:7;40416:32;:47::i;:::-;40385:90;40288:187;40503:1;40489:16;;:2;:16;;;40485:183;;;40522:45;40559:7;40522:36;:45::i;:::-;40485:183;;;40595:4;40589:10;;:2;:10;;;40585:83;;40616:40;40644:2;40648:7;40616:27;:40::i;:::-;40585:83;40485:183;40086:589;;;:::o;35976:799::-;36131:4;36152:15;:2;:13;;;:15::i;:::-;36148:620;;;36204:2;36188:36;;;36225:12;:10;:12::i;:::-;36239:4;36245:7;36254:5;36188:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36184:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36447:1;36430:6;:13;:18;36426:272;;;36473:60;;;;;;;;;;:::i;:::-;;;;;;;;36426:272;36648:6;36642:13;36633:6;36629:2;36625:15;36618:38;36184:529;36321:41;;;36311:51;;;:6;:51;;;;36304:58;;;;;36148:620;36752:4;36745:11;;35976:799;;;;;;;:::o;33233:382::-;33327:1;33313:16;;:2;:16;;;;33305:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33386:16;33394:7;33386;:16::i;:::-;33385:17;33377:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33448:45;33477:1;33481:2;33485:7;33448:20;:45::i;:::-;33523:1;33506:9;:13;33516:2;33506:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33554:2;33535:7;:16;33543:7;33535:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33599:7;33595:2;33574:33;;33591:1;33574:33;;;;;;;;;;;;33233:382;;:::o;37347:126::-;;;;:::o;41398:164::-;41502:10;:17;;;;41475:15;:24;41491:7;41475:24;;;;;;;;;;;:44;;;;41530:10;41546:7;41530:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41398:164;:::o;42189:988::-;42455:22;42505:1;42480:22;42497:4;42480:16;:22::i;:::-;:26;;;;:::i;:::-;42455:51;;42517:18;42538:17;:26;42556:7;42538:26;;;;;;;;;;;;42517:47;;42685:14;42671:10;:28;42667:328;;42716:19;42738:12;:18;42751:4;42738:18;;;;;;;;;;;;;;;:34;42757:14;42738:34;;;;;;;;;;;;42716:56;;42822:11;42789:12;:18;42802:4;42789:18;;;;;;;;;;;;;;;:30;42808:10;42789:30;;;;;;;;;;;:44;;;;42939:10;42906:17;:30;42924:11;42906:30;;;;;;;;;;;:43;;;;42701:294;42667:328;43091:17;:26;43109:7;43091:26;;;;;;;;;;;43084:33;;;43135:12;:18;43148:4;43135:18;;;;;;;;;;;;;;;:34;43154:14;43135:34;;;;;;;;;;;43128:41;;;42270:907;;42189:988;;:::o;43472:1079::-;43725:22;43770:1;43750:10;:17;;;;:21;;;;:::i;:::-;43725:46;;43782:18;43803:15;:24;43819:7;43803:24;;;;;;;;;;;;43782:45;;44154:19;44176:10;44187:14;44176:26;;;;;;;;:::i;:::-;;;;;;;;;;44154:48;;44240:11;44215:10;44226;44215:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44351:10;44320:15;:28;44336:11;44320:28;;;;;;;;;;;:41;;;;44492:15;:24;44508:7;44492:24;;;;;;;;;;;44485:31;;;44527:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43543:1008;;;43472:1079;:::o;40976:221::-;41061:14;41078:20;41095:2;41078:16;:20::i;:::-;41061:37;;41136:7;41109:12;:16;41122:2;41109:16;;;;;;;;;;;;;;;:24;41126:6;41109:24;;;;;;;;;;;:34;;;;41183:6;41154:17;:26;41172:7;41154:26;;;;;;;;;;;:35;;;;41050:147;40976:221;;:::o;7396:387::-;7456:4;7664:12;7731:7;7719:20;7711:28;;7774:1;7767:4;:8;7760:15;;;7396:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1176:::-;1249:8;1259:6;1309:3;1302:4;1294:6;1290:17;1286:27;1276:122;;1317:79;;:::i;:::-;1276:122;1430:6;1417:20;1407:30;;1460:18;1452:6;1449:30;1446:117;;;1482:79;;:::i;:::-;1446:117;1596:4;1588:6;1584:17;1572:29;;1650:3;1642:4;1634:6;1630:17;1620:8;1616:32;1613:41;1610:128;;;1657:79;;:::i;:::-;1610:128;1176:568;;;;;:::o;1750:133::-;1793:5;1831:6;1818:20;1809:29;;1847:30;1871:5;1847:30;:::i;:::-;1750:133;;;;:::o;1889:137::-;1934:5;1972:6;1959:20;1950:29;;1988:32;2014:5;1988:32;:::i;:::-;1889:137;;;;:::o;2032:141::-;2088:5;2119:6;2113:13;2104:22;;2135:32;2161:5;2135:32;:::i;:::-;2032:141;;;;:::o;2192:338::-;2247:5;2296:3;2289:4;2281:6;2277:17;2273:27;2263:122;;2304:79;;:::i;:::-;2263:122;2421:6;2408:20;2446:78;2520:3;2512:6;2505:4;2497:6;2493:17;2446:78;:::i;:::-;2437:87;;2253:277;2192:338;;;;:::o;2550:553::-;2608:8;2618:6;2668:3;2661:4;2653:6;2649:17;2645:27;2635:122;;2676:79;;:::i;:::-;2635:122;2789:6;2776:20;2766:30;;2819:18;2811:6;2808:30;2805:117;;;2841:79;;:::i;:::-;2805:117;2955:4;2947:6;2943:17;2931:29;;3009:3;3001:4;2993:6;2989:17;2979:8;2975:32;2972:41;2969:128;;;3016:79;;:::i;:::-;2969:128;2550:553;;;;;:::o;3109:139::-;3155:5;3193:6;3180:20;3171:29;;3209:33;3236:5;3209:33;:::i;:::-;3109:139;;;;:::o;3254:329::-;3313:6;3362:2;3350:9;3341:7;3337:23;3333:32;3330:119;;;3368:79;;:::i;:::-;3330:119;3488:1;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3459:117;3254:329;;;;:::o;3589:474::-;3657:6;3665;3714:2;3702:9;3693:7;3689:23;3685:32;3682:119;;;3720:79;;:::i;:::-;3682:119;3840:1;3865:53;3910:7;3901:6;3890:9;3886:22;3865:53;:::i;:::-;3855:63;;3811:117;3967:2;3993:53;4038:7;4029:6;4018:9;4014:22;3993:53;:::i;:::-;3983:63;;3938:118;3589:474;;;;;:::o;4069:619::-;4146:6;4154;4162;4211:2;4199:9;4190:7;4186:23;4182:32;4179:119;;;4217:79;;:::i;:::-;4179:119;4337:1;4362:53;4407:7;4398:6;4387:9;4383:22;4362:53;:::i;:::-;4352:63;;4308:117;4464:2;4490:53;4535:7;4526:6;4515:9;4511:22;4490:53;:::i;:::-;4480:63;;4435:118;4592:2;4618:53;4663:7;4654:6;4643:9;4639:22;4618:53;:::i;:::-;4608:63;;4563:118;4069:619;;;;;:::o;4694:943::-;4789:6;4797;4805;4813;4862:3;4850:9;4841:7;4837:23;4833:33;4830:120;;;4869:79;;:::i;:::-;4830:120;4989:1;5014:53;5059:7;5050:6;5039:9;5035:22;5014:53;:::i;:::-;5004:63;;4960:117;5116:2;5142:53;5187:7;5178:6;5167:9;5163:22;5142:53;:::i;:::-;5132:63;;5087:118;5244:2;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5215:118;5400:2;5389:9;5385:18;5372:32;5431:18;5423:6;5420:30;5417:117;;;5453:79;;:::i;:::-;5417:117;5558:62;5612:7;5603:6;5592:9;5588:22;5558:62;:::i;:::-;5548:72;;5343:287;4694:943;;;;;;;:::o;5643:468::-;5708:6;5716;5765:2;5753:9;5744:7;5740:23;5736:32;5733:119;;;5771:79;;:::i;:::-;5733:119;5891:1;5916:53;5961:7;5952:6;5941:9;5937:22;5916:53;:::i;:::-;5906:63;;5862:117;6018:2;6044:50;6086:7;6077:6;6066:9;6062:22;6044:50;:::i;:::-;6034:60;;5989:115;5643:468;;;;;:::o;6117:474::-;6185:6;6193;6242:2;6230:9;6221:7;6217:23;6213:32;6210:119;;;6248:79;;:::i;:::-;6210:119;6368:1;6393:53;6438:7;6429:6;6418:9;6414:22;6393:53;:::i;:::-;6383:63;;6339:117;6495:2;6521:53;6566:7;6557:6;6546:9;6542:22;6521:53;:::i;:::-;6511:63;;6466:118;6117:474;;;;;:::o;6597:559::-;6683:6;6691;6740:2;6728:9;6719:7;6715:23;6711:32;6708:119;;;6746:79;;:::i;:::-;6708:119;6894:1;6883:9;6879:17;6866:31;6924:18;6916:6;6913:30;6910:117;;;6946:79;;:::i;:::-;6910:117;7059:80;7131:7;7122:6;7111:9;7107:22;7059:80;:::i;:::-;7041:98;;;;6837:312;6597:559;;;;;:::o;7162:934::-;7284:6;7292;7300;7308;7357:2;7345:9;7336:7;7332:23;7328:32;7325:119;;;7363:79;;:::i;:::-;7325:119;7511:1;7500:9;7496:17;7483:31;7541:18;7533:6;7530:30;7527:117;;;7563:79;;:::i;:::-;7527:117;7676:80;7748:7;7739:6;7728:9;7724:22;7676:80;:::i;:::-;7658:98;;;;7454:312;7833:2;7822:9;7818:18;7805:32;7864:18;7856:6;7853:30;7850:117;;;7886:79;;:::i;:::-;7850:117;7999:80;8071:7;8062:6;8051:9;8047:22;7999:80;:::i;:::-;7981:98;;;;7776:313;7162:934;;;;;;;:::o;8102:327::-;8160:6;8209:2;8197:9;8188:7;8184:23;8180:32;8177:119;;;8215:79;;:::i;:::-;8177:119;8335:1;8360:52;8404:7;8395:6;8384:9;8380:22;8360:52;:::i;:::-;8350:62;;8306:116;8102:327;;;;:::o;8435:349::-;8504:6;8553:2;8541:9;8532:7;8528:23;8524:32;8521:119;;;8559:79;;:::i;:::-;8521:119;8679:1;8704:63;8759:7;8750:6;8739:9;8735:22;8704:63;:::i;:::-;8694:73;;8650:127;8435:349;;;;:::o;8790:529::-;8861:6;8869;8918:2;8906:9;8897:7;8893:23;8889:32;8886:119;;;8924:79;;:::i;:::-;8886:119;9072:1;9061:9;9057:17;9044:31;9102:18;9094:6;9091:30;9088:117;;;9124:79;;:::i;:::-;9088:117;9237:65;9294:7;9285:6;9274:9;9270:22;9237:65;:::i;:::-;9219:83;;;;9015:297;8790:529;;;;;:::o;9325:329::-;9384:6;9433:2;9421:9;9412:7;9408:23;9404:32;9401:119;;;9439:79;;:::i;:::-;9401:119;9559:1;9584:53;9629:7;9620:6;9609:9;9605:22;9584:53;:::i;:::-;9574:63;;9530:117;9325:329;;;;:::o;9660:118::-;9747:24;9765:5;9747:24;:::i;:::-;9742:3;9735:37;9660:118;;:::o;9784:109::-;9865:21;9880:5;9865:21;:::i;:::-;9860:3;9853:34;9784:109;;:::o;9899:360::-;9985:3;10013:38;10045:5;10013:38;:::i;:::-;10067:70;10130:6;10125:3;10067:70;:::i;:::-;10060:77;;10146:52;10191:6;10186:3;10179:4;10172:5;10168:16;10146:52;:::i;:::-;10223:29;10245:6;10223:29;:::i;:::-;10218:3;10214:39;10207:46;;9989:270;9899:360;;;;:::o;10265:364::-;10353:3;10381:39;10414:5;10381:39;:::i;:::-;10436:71;10500:6;10495:3;10436:71;:::i;:::-;10429:78;;10516:52;10561:6;10556:3;10549:4;10542:5;10538:16;10516:52;:::i;:::-;10593:29;10615:6;10593:29;:::i;:::-;10588:3;10584:39;10577:46;;10357:272;10265:364;;;;:::o;10635:377::-;10741:3;10769:39;10802:5;10769:39;:::i;:::-;10824:89;10906:6;10901:3;10824:89;:::i;:::-;10817:96;;10922:52;10967:6;10962:3;10955:4;10948:5;10944:16;10922:52;:::i;:::-;10999:6;10994:3;10990:16;10983:23;;10745:267;10635:377;;;;:::o;11042:845::-;11145:3;11182:5;11176:12;11211:36;11237:9;11211:36;:::i;:::-;11263:89;11345:6;11340:3;11263:89;:::i;:::-;11256:96;;11383:1;11372:9;11368:17;11399:1;11394:137;;;;11545:1;11540:341;;;;11361:520;;11394:137;11478:4;11474:9;11463;11459:25;11454:3;11447:38;11514:6;11509:3;11505:16;11498:23;;11394:137;;11540:341;11607:38;11639:5;11607:38;:::i;:::-;11667:1;11681:154;11695:6;11692:1;11689:13;11681:154;;;11769:7;11763:14;11759:1;11754:3;11750:11;11743:35;11819:1;11810:7;11806:15;11795:26;;11717:4;11714:1;11710:12;11705:17;;11681:154;;;11864:6;11859:3;11855:16;11848:23;;11547:334;;11361:520;;11149:738;;11042:845;;;;:::o;11893:366::-;12035:3;12056:67;12120:2;12115:3;12056:67;:::i;:::-;12049:74;;12132:93;12221:3;12132:93;:::i;:::-;12250:2;12245:3;12241:12;12234:19;;11893:366;;;:::o;12265:::-;12407:3;12428:67;12492:2;12487:3;12428:67;:::i;:::-;12421:74;;12504:93;12593:3;12504:93;:::i;:::-;12622:2;12617:3;12613:12;12606:19;;12265:366;;;:::o;12637:::-;12779:3;12800:67;12864:2;12859:3;12800:67;:::i;:::-;12793:74;;12876:93;12965:3;12876:93;:::i;:::-;12994:2;12989:3;12985:12;12978:19;;12637:366;;;:::o;13009:::-;13151:3;13172:67;13236:2;13231:3;13172:67;:::i;:::-;13165:74;;13248:93;13337:3;13248:93;:::i;:::-;13366:2;13361:3;13357:12;13350:19;;13009:366;;;:::o;13381:::-;13523:3;13544:67;13608:2;13603:3;13544:67;:::i;:::-;13537:74;;13620:93;13709:3;13620:93;:::i;:::-;13738:2;13733:3;13729:12;13722:19;;13381:366;;;:::o;13753:::-;13895:3;13916:67;13980:2;13975:3;13916:67;:::i;:::-;13909:74;;13992:93;14081:3;13992:93;:::i;:::-;14110:2;14105:3;14101:12;14094:19;;13753:366;;;:::o;14125:::-;14267:3;14288:67;14352:2;14347:3;14288:67;:::i;:::-;14281:74;;14364:93;14453:3;14364:93;:::i;:::-;14482:2;14477:3;14473:12;14466:19;;14125:366;;;:::o;14497:::-;14639:3;14660:67;14724:2;14719:3;14660:67;:::i;:::-;14653:74;;14736:93;14825:3;14736:93;:::i;:::-;14854:2;14849:3;14845:12;14838:19;;14497:366;;;:::o;14869:::-;15011:3;15032:67;15096:2;15091:3;15032:67;:::i;:::-;15025:74;;15108:93;15197:3;15108:93;:::i;:::-;15226:2;15221:3;15217:12;15210:19;;14869:366;;;:::o;15241:::-;15383:3;15404:67;15468:2;15463:3;15404:67;:::i;:::-;15397:74;;15480:93;15569:3;15480:93;:::i;:::-;15598:2;15593:3;15589:12;15582:19;;15241:366;;;:::o;15613:::-;15755:3;15776:67;15840:2;15835:3;15776:67;:::i;:::-;15769:74;;15852:93;15941:3;15852:93;:::i;:::-;15970:2;15965:3;15961:12;15954:19;;15613:366;;;:::o;15985:::-;16127:3;16148:67;16212:2;16207:3;16148:67;:::i;:::-;16141:74;;16224:93;16313:3;16224:93;:::i;:::-;16342:2;16337:3;16333:12;16326:19;;15985:366;;;:::o;16357:::-;16499:3;16520:67;16584:2;16579:3;16520:67;:::i;:::-;16513:74;;16596:93;16685:3;16596:93;:::i;:::-;16714:2;16709:3;16705:12;16698:19;;16357:366;;;:::o;16729:::-;16871:3;16892:67;16956:2;16951:3;16892:67;:::i;:::-;16885:74;;16968:93;17057:3;16968:93;:::i;:::-;17086:2;17081:3;17077:12;17070:19;;16729:366;;;:::o;17101:::-;17243:3;17264:67;17328:2;17323:3;17264:67;:::i;:::-;17257:74;;17340:93;17429:3;17340:93;:::i;:::-;17458:2;17453:3;17449:12;17442:19;;17101:366;;;:::o;17473:::-;17615:3;17636:67;17700:2;17695:3;17636:67;:::i;:::-;17629:74;;17712:93;17801:3;17712:93;:::i;:::-;17830:2;17825:3;17821:12;17814:19;;17473:366;;;:::o;17845:::-;17987:3;18008:67;18072:2;18067:3;18008:67;:::i;:::-;18001:74;;18084:93;18173:3;18084:93;:::i;:::-;18202:2;18197:3;18193:12;18186:19;;17845:366;;;:::o;18217:::-;18359:3;18380:67;18444:2;18439:3;18380:67;:::i;:::-;18373:74;;18456:93;18545:3;18456:93;:::i;:::-;18574:2;18569:3;18565:12;18558:19;;18217:366;;;:::o;18589:::-;18731:3;18752:67;18816:2;18811:3;18752:67;:::i;:::-;18745:74;;18828:93;18917:3;18828:93;:::i;:::-;18946:2;18941:3;18937:12;18930:19;;18589:366;;;:::o;18961:::-;19103:3;19124:67;19188:2;19183:3;19124:67;:::i;:::-;19117:74;;19200:93;19289:3;19200:93;:::i;:::-;19318:2;19313:3;19309:12;19302:19;;18961:366;;;:::o;19333:::-;19475:3;19496:67;19560:2;19555:3;19496:67;:::i;:::-;19489:74;;19572:93;19661:3;19572:93;:::i;:::-;19690:2;19685:3;19681:12;19674:19;;19333:366;;;:::o;19705:::-;19847:3;19868:67;19932:2;19927:3;19868:67;:::i;:::-;19861:74;;19944:93;20033:3;19944:93;:::i;:::-;20062:2;20057:3;20053:12;20046:19;;19705:366;;;:::o;20077:::-;20219:3;20240:67;20304:2;20299:3;20240:67;:::i;:::-;20233:74;;20316:93;20405:3;20316:93;:::i;:::-;20434:2;20429:3;20425:12;20418:19;;20077:366;;;:::o;20449:::-;20591:3;20612:67;20676:2;20671:3;20612:67;:::i;:::-;20605:74;;20688:93;20777:3;20688:93;:::i;:::-;20806:2;20801:3;20797:12;20790:19;;20449:366;;;:::o;20821:::-;20963:3;20984:67;21048:2;21043:3;20984:67;:::i;:::-;20977:74;;21060:93;21149:3;21060:93;:::i;:::-;21178:2;21173:3;21169:12;21162:19;;20821:366;;;:::o;21193:::-;21335:3;21356:67;21420:2;21415:3;21356:67;:::i;:::-;21349:74;;21432:93;21521:3;21432:93;:::i;:::-;21550:2;21545:3;21541:12;21534:19;;21193:366;;;:::o;21565:::-;21707:3;21728:67;21792:2;21787:3;21728:67;:::i;:::-;21721:74;;21804:93;21893:3;21804:93;:::i;:::-;21922:2;21917:3;21913:12;21906:19;;21565:366;;;:::o;21937:::-;22079:3;22100:67;22164:2;22159:3;22100:67;:::i;:::-;22093:74;;22176:93;22265:3;22176:93;:::i;:::-;22294:2;22289:3;22285:12;22278:19;;21937:366;;;:::o;22309:::-;22451:3;22472:67;22536:2;22531:3;22472:67;:::i;:::-;22465:74;;22548:93;22637:3;22548:93;:::i;:::-;22666:2;22661:3;22657:12;22650:19;;22309:366;;;:::o;22681:::-;22823:3;22844:67;22908:2;22903:3;22844:67;:::i;:::-;22837:74;;22920:93;23009:3;22920:93;:::i;:::-;23038:2;23033:3;23029:12;23022:19;;22681:366;;;:::o;23053:::-;23195:3;23216:67;23280:2;23275:3;23216:67;:::i;:::-;23209:74;;23292:93;23381:3;23292:93;:::i;:::-;23410:2;23405:3;23401:12;23394:19;;23053:366;;;:::o;23425:::-;23567:3;23588:67;23652:2;23647:3;23588:67;:::i;:::-;23581:74;;23664:93;23753:3;23664:93;:::i;:::-;23782:2;23777:3;23773:12;23766:19;;23425:366;;;:::o;23797:::-;23939:3;23960:67;24024:2;24019:3;23960:67;:::i;:::-;23953:74;;24036:93;24125:3;24036:93;:::i;:::-;24154:2;24149:3;24145:12;24138:19;;23797:366;;;:::o;24169:::-;24311:3;24332:67;24396:2;24391:3;24332:67;:::i;:::-;24325:74;;24408:93;24497:3;24408:93;:::i;:::-;24526:2;24521:3;24517:12;24510:19;;24169:366;;;:::o;24541:::-;24683:3;24704:67;24768:2;24763:3;24704:67;:::i;:::-;24697:74;;24780:93;24869:3;24780:93;:::i;:::-;24898:2;24893:3;24889:12;24882:19;;24541:366;;;:::o;24913:118::-;25000:24;25018:5;25000:24;:::i;:::-;24995:3;24988:37;24913:118;;:::o;25037:429::-;25214:3;25236:92;25324:3;25315:6;25236:92;:::i;:::-;25229:99;;25345:95;25436:3;25427:6;25345:95;:::i;:::-;25338:102;;25457:3;25450:10;;25037:429;;;;;:::o;25472:222::-;25565:4;25603:2;25592:9;25588:18;25580:26;;25616:71;25684:1;25673:9;25669:17;25660:6;25616:71;:::i;:::-;25472:222;;;;:::o;25700:640::-;25895:4;25933:3;25922:9;25918:19;25910:27;;25947:71;26015:1;26004:9;26000:17;25991:6;25947:71;:::i;:::-;26028:72;26096:2;26085:9;26081:18;26072:6;26028:72;:::i;:::-;26110;26178:2;26167:9;26163:18;26154:6;26110:72;:::i;:::-;26229:9;26223:4;26219:20;26214:2;26203:9;26199:18;26192:48;26257:76;26328:4;26319:6;26257:76;:::i;:::-;26249:84;;25700:640;;;;;;;:::o;26346:210::-;26433:4;26471:2;26460:9;26456:18;26448:26;;26484:65;26546:1;26535:9;26531:17;26522:6;26484:65;:::i;:::-;26346:210;;;;:::o;26562:313::-;26675:4;26713:2;26702:9;26698:18;26690:26;;26762:9;26756:4;26752:20;26748:1;26737:9;26733:17;26726:47;26790:78;26863:4;26854:6;26790:78;:::i;:::-;26782:86;;26562:313;;;;:::o;26881:419::-;27047:4;27085:2;27074:9;27070:18;27062:26;;27134:9;27128:4;27124:20;27120:1;27109:9;27105:17;27098:47;27162:131;27288:4;27162:131;:::i;:::-;27154:139;;26881:419;;;:::o;27306:::-;27472:4;27510:2;27499:9;27495:18;27487:26;;27559:9;27553:4;27549:20;27545:1;27534:9;27530:17;27523:47;27587:131;27713:4;27587:131;:::i;:::-;27579:139;;27306:419;;;:::o;27731:::-;27897:4;27935:2;27924:9;27920:18;27912:26;;27984:9;27978:4;27974:20;27970:1;27959:9;27955:17;27948:47;28012:131;28138:4;28012:131;:::i;:::-;28004:139;;27731:419;;;:::o;28156:::-;28322:4;28360:2;28349:9;28345:18;28337:26;;28409:9;28403:4;28399:20;28395:1;28384:9;28380:17;28373:47;28437:131;28563:4;28437:131;:::i;:::-;28429:139;;28156:419;;;:::o;28581:::-;28747:4;28785:2;28774:9;28770:18;28762:26;;28834:9;28828:4;28824:20;28820:1;28809:9;28805:17;28798:47;28862:131;28988:4;28862:131;:::i;:::-;28854:139;;28581:419;;;:::o;29006:::-;29172:4;29210:2;29199:9;29195:18;29187:26;;29259:9;29253:4;29249:20;29245:1;29234:9;29230:17;29223:47;29287:131;29413:4;29287:131;:::i;:::-;29279:139;;29006:419;;;:::o;29431:::-;29597:4;29635:2;29624:9;29620:18;29612:26;;29684:9;29678:4;29674:20;29670:1;29659:9;29655:17;29648:47;29712:131;29838:4;29712:131;:::i;:::-;29704:139;;29431:419;;;:::o;29856:::-;30022:4;30060:2;30049:9;30045:18;30037:26;;30109:9;30103:4;30099:20;30095:1;30084:9;30080:17;30073:47;30137:131;30263:4;30137:131;:::i;:::-;30129:139;;29856:419;;;:::o;30281:::-;30447:4;30485:2;30474:9;30470:18;30462:26;;30534:9;30528:4;30524:20;30520:1;30509:9;30505:17;30498:47;30562:131;30688:4;30562:131;:::i;:::-;30554:139;;30281:419;;;:::o;30706:::-;30872:4;30910:2;30899:9;30895:18;30887:26;;30959:9;30953:4;30949:20;30945:1;30934:9;30930:17;30923:47;30987:131;31113:4;30987:131;:::i;:::-;30979:139;;30706:419;;;:::o;31131:::-;31297:4;31335:2;31324:9;31320:18;31312:26;;31384:9;31378:4;31374:20;31370:1;31359:9;31355:17;31348:47;31412:131;31538:4;31412:131;:::i;:::-;31404:139;;31131:419;;;:::o;31556:::-;31722:4;31760:2;31749:9;31745:18;31737:26;;31809:9;31803:4;31799:20;31795:1;31784:9;31780:17;31773:47;31837:131;31963:4;31837:131;:::i;:::-;31829:139;;31556:419;;;:::o;31981:::-;32147:4;32185:2;32174:9;32170:18;32162:26;;32234:9;32228:4;32224:20;32220:1;32209:9;32205:17;32198:47;32262:131;32388:4;32262:131;:::i;:::-;32254:139;;31981:419;;;:::o;32406:::-;32572:4;32610:2;32599:9;32595:18;32587:26;;32659:9;32653:4;32649:20;32645:1;32634:9;32630:17;32623:47;32687:131;32813:4;32687:131;:::i;:::-;32679:139;;32406:419;;;:::o;32831:::-;32997:4;33035:2;33024:9;33020:18;33012:26;;33084:9;33078:4;33074:20;33070:1;33059:9;33055:17;33048:47;33112:131;33238:4;33112:131;:::i;:::-;33104:139;;32831:419;;;:::o;33256:::-;33422:4;33460:2;33449:9;33445:18;33437:26;;33509:9;33503:4;33499:20;33495:1;33484:9;33480:17;33473:47;33537:131;33663:4;33537:131;:::i;:::-;33529:139;;33256:419;;;:::o;33681:::-;33847:4;33885:2;33874:9;33870:18;33862:26;;33934:9;33928:4;33924:20;33920:1;33909:9;33905:17;33898:47;33962:131;34088:4;33962:131;:::i;:::-;33954:139;;33681:419;;;:::o;34106:::-;34272:4;34310:2;34299:9;34295:18;34287:26;;34359:9;34353:4;34349:20;34345:1;34334:9;34330:17;34323:47;34387:131;34513:4;34387:131;:::i;:::-;34379:139;;34106:419;;;:::o;34531:::-;34697:4;34735:2;34724:9;34720:18;34712:26;;34784:9;34778:4;34774:20;34770:1;34759:9;34755:17;34748:47;34812:131;34938:4;34812:131;:::i;:::-;34804:139;;34531:419;;;:::o;34956:::-;35122:4;35160:2;35149:9;35145:18;35137:26;;35209:9;35203:4;35199:20;35195:1;35184:9;35180:17;35173:47;35237:131;35363:4;35237:131;:::i;:::-;35229:139;;34956:419;;;:::o;35381:::-;35547:4;35585:2;35574:9;35570:18;35562:26;;35634:9;35628:4;35624:20;35620:1;35609:9;35605:17;35598:47;35662:131;35788:4;35662:131;:::i;:::-;35654:139;;35381:419;;;:::o;35806:::-;35972:4;36010:2;35999:9;35995:18;35987:26;;36059:9;36053:4;36049:20;36045:1;36034:9;36030:17;36023:47;36087:131;36213:4;36087:131;:::i;:::-;36079:139;;35806:419;;;:::o;36231:::-;36397:4;36435:2;36424:9;36420:18;36412:26;;36484:9;36478:4;36474:20;36470:1;36459:9;36455:17;36448:47;36512:131;36638:4;36512:131;:::i;:::-;36504:139;;36231:419;;;:::o;36656:::-;36822:4;36860:2;36849:9;36845:18;36837:26;;36909:9;36903:4;36899:20;36895:1;36884:9;36880:17;36873:47;36937:131;37063:4;36937:131;:::i;:::-;36929:139;;36656:419;;;:::o;37081:::-;37247:4;37285:2;37274:9;37270:18;37262:26;;37334:9;37328:4;37324:20;37320:1;37309:9;37305:17;37298:47;37362:131;37488:4;37362:131;:::i;:::-;37354:139;;37081:419;;;:::o;37506:::-;37672:4;37710:2;37699:9;37695:18;37687:26;;37759:9;37753:4;37749:20;37745:1;37734:9;37730:17;37723:47;37787:131;37913:4;37787:131;:::i;:::-;37779:139;;37506:419;;;:::o;37931:::-;38097:4;38135:2;38124:9;38120:18;38112:26;;38184:9;38178:4;38174:20;38170:1;38159:9;38155:17;38148:47;38212:131;38338:4;38212:131;:::i;:::-;38204:139;;37931:419;;;:::o;38356:::-;38522:4;38560:2;38549:9;38545:18;38537:26;;38609:9;38603:4;38599:20;38595:1;38584:9;38580:17;38573:47;38637:131;38763:4;38637:131;:::i;:::-;38629:139;;38356:419;;;:::o;38781:::-;38947:4;38985:2;38974:9;38970:18;38962:26;;39034:9;39028:4;39024:20;39020:1;39009:9;39005:17;38998:47;39062:131;39188:4;39062:131;:::i;:::-;39054:139;;38781:419;;;:::o;39206:::-;39372:4;39410:2;39399:9;39395:18;39387:26;;39459:9;39453:4;39449:20;39445:1;39434:9;39430:17;39423:47;39487:131;39613:4;39487:131;:::i;:::-;39479:139;;39206:419;;;:::o;39631:::-;39797:4;39835:2;39824:9;39820:18;39812:26;;39884:9;39878:4;39874:20;39870:1;39859:9;39855:17;39848:47;39912:131;40038:4;39912:131;:::i;:::-;39904:139;;39631:419;;;:::o;40056:::-;40222:4;40260:2;40249:9;40245:18;40237:26;;40309:9;40303:4;40299:20;40295:1;40284:9;40280:17;40273:47;40337:131;40463:4;40337:131;:::i;:::-;40329:139;;40056:419;;;:::o;40481:::-;40647:4;40685:2;40674:9;40670:18;40662:26;;40734:9;40728:4;40724:20;40720:1;40709:9;40705:17;40698:47;40762:131;40888:4;40762:131;:::i;:::-;40754:139;;40481:419;;;:::o;40906:::-;41072:4;41110:2;41099:9;41095:18;41087:26;;41159:9;41153:4;41149:20;41145:1;41134:9;41130:17;41123:47;41187:131;41313:4;41187:131;:::i;:::-;41179:139;;40906:419;;;:::o;41331:::-;41497:4;41535:2;41524:9;41520:18;41512:26;;41584:9;41578:4;41574:20;41570:1;41559:9;41555:17;41548:47;41612:131;41738:4;41612:131;:::i;:::-;41604:139;;41331:419;;;:::o;41756:222::-;41849:4;41887:2;41876:9;41872:18;41864:26;;41900:71;41968:1;41957:9;41953:17;41944:6;41900:71;:::i;:::-;41756:222;;;;:::o;41984:129::-;42018:6;42045:20;;:::i;:::-;42035:30;;42074:33;42102:4;42094:6;42074:33;:::i;:::-;41984:129;;;:::o;42119:75::-;42152:6;42185:2;42179:9;42169:19;;42119:75;:::o;42200:307::-;42261:4;42351:18;42343:6;42340:30;42337:56;;;42373:18;;:::i;:::-;42337:56;42411:29;42433:6;42411:29;:::i;:::-;42403:37;;42495:4;42489;42485:15;42477:23;;42200:307;;;:::o;42513:141::-;42562:4;42585:3;42577:11;;42608:3;42605:1;42598:14;42642:4;42639:1;42629:18;42621:26;;42513:141;;;:::o;42660:98::-;42711:6;42745:5;42739:12;42729:22;;42660:98;;;:::o;42764:99::-;42816:6;42850:5;42844:12;42834:22;;42764:99;;;:::o;42869:168::-;42952:11;42986:6;42981:3;42974:19;43026:4;43021:3;43017:14;43002:29;;42869:168;;;;:::o;43043:169::-;43127:11;43161:6;43156:3;43149:19;43201:4;43196:3;43192:14;43177:29;;43043:169;;;;:::o;43218:148::-;43320:11;43357:3;43342:18;;43218:148;;;;:::o;43372:305::-;43412:3;43431:20;43449:1;43431:20;:::i;:::-;43426:25;;43465:20;43483:1;43465:20;:::i;:::-;43460:25;;43619:1;43551:66;43547:74;43544:1;43541:81;43538:107;;;43625:18;;:::i;:::-;43538:107;43669:1;43666;43662:9;43655:16;;43372:305;;;;:::o;43683:185::-;43723:1;43740:20;43758:1;43740:20;:::i;:::-;43735:25;;43774:20;43792:1;43774:20;:::i;:::-;43769:25;;43813:1;43803:35;;43818:18;;:::i;:::-;43803:35;43860:1;43857;43853:9;43848:14;;43683:185;;;;:::o;43874:348::-;43914:7;43937:20;43955:1;43937:20;:::i;:::-;43932:25;;43971:20;43989:1;43971:20;:::i;:::-;43966:25;;44159:1;44091:66;44087:74;44084:1;44081:81;44076:1;44069:9;44062:17;44058:105;44055:131;;;44166:18;;:::i;:::-;44055:131;44214:1;44211;44207:9;44196:20;;43874:348;;;;:::o;44228:191::-;44268:4;44288:20;44306:1;44288:20;:::i;:::-;44283:25;;44322:20;44340:1;44322:20;:::i;:::-;44317:25;;44361:1;44358;44355:8;44352:34;;;44366:18;;:::i;:::-;44352:34;44411:1;44408;44404:9;44396:17;;44228:191;;;;:::o;44425:96::-;44462:7;44491:24;44509:5;44491:24;:::i;:::-;44480:35;;44425:96;;;:::o;44527:90::-;44561:7;44604:5;44597:13;44590:21;44579:32;;44527:90;;;:::o;44623:149::-;44659:7;44699:66;44692:5;44688:78;44677:89;;44623:149;;;:::o;44778:126::-;44815:7;44855:42;44848:5;44844:54;44833:65;;44778:126;;;:::o;44910:77::-;44947:7;44976:5;44965:16;;44910:77;;;:::o;44993:154::-;45077:6;45072:3;45067;45054:30;45139:1;45130:6;45125:3;45121:16;45114:27;44993:154;;;:::o;45153:307::-;45221:1;45231:113;45245:6;45242:1;45239:13;45231:113;;;45330:1;45325:3;45321:11;45315:18;45311:1;45306:3;45302:11;45295:39;45267:2;45264:1;45260:10;45255:15;;45231:113;;;45362:6;45359:1;45356:13;45353:101;;;45442:1;45433:6;45428:3;45424:16;45417:27;45353:101;45202:258;45153:307;;;:::o;45466:320::-;45510:6;45547:1;45541:4;45537:12;45527:22;;45594:1;45588:4;45584:12;45615:18;45605:81;;45671:4;45663:6;45659:17;45649:27;;45605:81;45733:2;45725:6;45722:14;45702:18;45699:38;45696:84;;;45752:18;;:::i;:::-;45696:84;45517:269;45466:320;;;:::o;45792:281::-;45875:27;45897:4;45875:27;:::i;:::-;45867:6;45863:40;46005:6;45993:10;45990:22;45969:18;45957:10;45954:34;45951:62;45948:88;;;46016:18;;:::i;:::-;45948:88;46056:10;46052:2;46045:22;45835:238;45792:281;;:::o;46079:233::-;46118:3;46141:24;46159:5;46141:24;:::i;:::-;46132:33;;46187:66;46180:5;46177:77;46174:103;;;46257:18;;:::i;:::-;46174:103;46304:1;46297:5;46293:13;46286:20;;46079:233;;;:::o;46318:176::-;46350:1;46367:20;46385:1;46367:20;:::i;:::-;46362:25;;46401:20;46419:1;46401:20;:::i;:::-;46396:25;;46440:1;46430:35;;46445:18;;:::i;:::-;46430:35;46486:1;46483;46479:9;46474:14;;46318:176;;;;:::o;46500:180::-;46548:77;46545:1;46538:88;46645:4;46642:1;46635:15;46669:4;46666:1;46659:15;46686:180;46734:77;46731:1;46724:88;46831:4;46828:1;46821:15;46855:4;46852:1;46845:15;46872:180;46920:77;46917:1;46910:88;47017:4;47014:1;47007:15;47041:4;47038:1;47031:15;47058:180;47106:77;47103:1;47096:88;47203:4;47200:1;47193:15;47227:4;47224:1;47217:15;47244:180;47292:77;47289:1;47282:88;47389:4;47386:1;47379:15;47413:4;47410:1;47403:15;47430:180;47478:77;47475:1;47468:88;47575:4;47572:1;47565:15;47599:4;47596:1;47589:15;47616:117;47725:1;47722;47715:12;47739:117;47848:1;47845;47838:12;47862:117;47971:1;47968;47961:12;47985:117;48094:1;48091;48084:12;48108:117;48217:1;48214;48207:12;48231:117;48340:1;48337;48330:12;48354:102;48395:6;48446:2;48442:7;48437:2;48430:5;48426:14;48422:28;48412:38;;48354:102;;;:::o;48462:182::-;48602:34;48598:1;48590:6;48586:14;48579:58;48462:182;:::o;48650:231::-;48790:34;48786:1;48778:6;48774:14;48767:58;48859:14;48854:2;48846:6;48842:15;48835:39;48650:231;:::o;48887:180::-;49027:32;49023:1;49015:6;49011:14;49004:56;48887:180;:::o;49073:230::-;49213:34;49209:1;49201:6;49197:14;49190:58;49282:13;49277:2;49269:6;49265:15;49258:38;49073:230;:::o;49309:237::-;49449:34;49445:1;49437:6;49433:14;49426:58;49518:20;49513:2;49505:6;49501:15;49494:45;49309:237;:::o;49552:225::-;49692:34;49688:1;49680:6;49676:14;49669:58;49761:8;49756:2;49748:6;49744:15;49737:33;49552:225;:::o;49783:178::-;49923:30;49919:1;49911:6;49907:14;49900:54;49783:178;:::o;49967:177::-;50107:29;50103:1;50095:6;50091:14;50084:53;49967:177;:::o;50150:182::-;50290:34;50286:1;50278:6;50274:14;50267:58;50150:182;:::o;50338:173::-;50478:25;50474:1;50466:6;50462:14;50455:49;50338:173;:::o;50517:223::-;50657:34;50653:1;50645:6;50641:14;50634:58;50726:6;50721:2;50713:6;50709:15;50702:31;50517:223;:::o;50746:175::-;50886:27;50882:1;50874:6;50870:14;50863:51;50746:175;:::o;50927:181::-;51067:33;51063:1;51055:6;51051:14;51044:57;50927:181;:::o;51114:170::-;51254:22;51250:1;51242:6;51238:14;51231:46;51114:170;:::o;51290:178::-;51430:30;51426:1;51418:6;51414:14;51407:54;51290:178;:::o;51474:231::-;51614:34;51610:1;51602:6;51598:14;51591:58;51683:14;51678:2;51670:6;51666:15;51659:39;51474:231;:::o;51711:179::-;51851:31;51847:1;51839:6;51835:14;51828:55;51711:179;:::o;51896:243::-;52036:34;52032:1;52024:6;52020:14;52013:58;52105:26;52100:2;52092:6;52088:15;52081:51;51896:243;:::o;52145:229::-;52285:34;52281:1;52273:6;52269:14;52262:58;52354:12;52349:2;52341:6;52337:15;52330:37;52145:229;:::o;52380:::-;52520:34;52516:1;52508:6;52504:14;52497:58;52589:12;52584:2;52576:6;52572:15;52565:37;52380:229;:::o;52615:228::-;52755:34;52751:1;52743:6;52739:14;52732:58;52824:11;52819:2;52811:6;52807:15;52800:36;52615:228;:::o;52849:181::-;52989:33;52985:1;52977:6;52973:14;52966:57;52849:181;:::o;53036:182::-;53176:34;53172:1;53164:6;53160:14;53153:58;53036:182;:::o;53224:231::-;53364:34;53360:1;53352:6;53348:14;53341:58;53433:14;53428:2;53420:6;53416:15;53409:39;53224:231;:::o;53461:182::-;53601:34;53597:1;53589:6;53585:14;53578:58;53461:182;:::o;53649:228::-;53789:34;53785:1;53777:6;53773:14;53766:58;53858:11;53853:2;53845:6;53841:15;53834:36;53649:228;:::o;53883:235::-;54023:34;54019:1;54011:6;54007:14;54000:58;54092:18;54087:2;54079:6;54075:15;54068:43;53883:235;:::o;54124:220::-;54264:34;54260:1;54252:6;54248:14;54241:58;54333:3;54328:2;54320:6;54316:15;54309:28;54124:220;:::o;54350:236::-;54490:34;54486:1;54478:6;54474:14;54467:58;54559:19;54554:2;54546:6;54542:15;54535:44;54350:236;:::o;54592:231::-;54732:34;54728:1;54720:6;54716:14;54709:58;54801:14;54796:2;54788:6;54784:15;54777:39;54592:231;:::o;54829:171::-;54969:23;54965:1;54957:6;54953:14;54946:47;54829:171;:::o;55006:170::-;55146:22;55142:1;55134:6;55130:14;55123:46;55006:170;:::o;55182:169::-;55322:21;55318:1;55310:6;55306:14;55299:45;55182:169;:::o;55357:170::-;55497:22;55493:1;55485:6;55481:14;55474:46;55357:170;:::o;55533:175::-;55673:27;55669:1;55661:6;55657:14;55650:51;55533:175;:::o;55714:122::-;55787:24;55805:5;55787:24;:::i;:::-;55780:5;55777:35;55767:63;;55826:1;55823;55816:12;55767:63;55714:122;:::o;55842:116::-;55912:21;55927:5;55912:21;:::i;:::-;55905:5;55902:32;55892:60;;55948:1;55945;55938:12;55892:60;55842:116;:::o;55964:120::-;56036:23;56053:5;56036:23;:::i;:::-;56029:5;56026:34;56016:62;;56074:1;56071;56064:12;56016:62;55964:120;:::o;56090:122::-;56163:24;56181:5;56163:24;:::i;:::-;56156:5;56153:35;56143:63;;56202:1;56199;56192:12;56143:63;56090:122;:::o

Swarm Source

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