ETH Price: $3,483.11 (+4.48%)

Token

TheLastSamurais (TLS)
 

Overview

Max Total Supply

333 TLS

Holders

202

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ninjaworrier.eth
Balance
1 TLS
0xba39ae23c8eba7f0e1a7c5a9ba0d807661a6c148
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Last Samurais is a collection of 333 generative NFT personas of Samurais from five prodigal clans, stemming from 150+ uniquely drawn traits. The clans reside in Shinkoku; an uncharted land in which The Gods’ could not gain supremacy over one another after eons of strife.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheLastSamurais

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-12
*/

// Sources flattened with hardhat v2.8.3 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (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 {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (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);

    /**
     * @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/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/TheLastSamurais.sol



pragma solidity ^0.8.0;




contract TheLastSamurais is ERC721Enumerable, Ownable {

    using Strings for uint256;

    string public _baseTokenURI;
    uint256 public _discountPrice = 0.055 ether;
    uint256 public _price = 0.065 ether;
    uint256 public _maxSupply = 3878;
    bytes32 public _merkleRoot;
    bool public _preSaleIsActive = false;
    bool public _saleIsActive = false;

    mapping(address => uint256) public _whitelist;

    address a1 = 0x2976b4235727930d7957f9cacE6020F3217d8685;
    address a2 = 0x68Bf9b769aBf7D8723b4d6f7399698f7e29e65D0;
    address a3 = 0xEd2Dd8B804731Ced9176d381d971A714aDB4A5F1;
    address a4 = 0xB7516bb20EaAa0EB132729d1071a71bFf74B117a;
    address a5 = 0x81a76401a46FA740c911e374324E4046b84cFA33;

    constructor(string memory baseURI, bytes32 merkleRoot) ERC721("TheLastSamurais", "TLS") {
        _baseTokenURI = baseURI;
        _merkleRoot = merkleRoot;
    }

    function mint(uint256 mintCount) external payable {
        uint256 supply = totalSupply();

        require(_saleIsActive,                      "sale_not_active");
        require(mintCount <= 20,                    "max_mint_count_exceeded");
        require(supply + mintCount <= _maxSupply,   "max_token_supply_exceeded");
        require(msg.value >= _price * mintCount,    "insufficient_payment_value");

        for (uint256 i; i < mintCount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function ownerMint(uint256 mintCount, address recipient) external {
        uint256 supply = totalSupply();
        address a = msg.sender;

        require(a == a1 || a == a2 || a == a3 || a == a4,   "unauthorized_sender");
        require(supply + mintCount <= _maxSupply,           "max_token_supply_exceeded");

        for (uint256 i; i < mintCount; i++) {
            _safeMint(recipient, supply + i);
        }
    }

    function whitelistMint(uint256 mintCount, bytes32[] calldata merkleProof) external payable {
        uint256 supply = totalSupply();
        uint256 minted = _whitelist[msg.sender];

        require(msg.value >= _discountPrice * mintCount,        "insufficient_payment_value");
        require(this.isWhitelisted(msg.sender, merkleProof),    "not_whitelisted");
        require(_preSaleIsActive,                               "pre_sale_not_active");
        require(mintCount + minted <= 2,                        "max_mint_count_exceeded");
        require(supply + mintCount <= _maxSupply,               "max_token_supply_exceeded");

        for (uint256 i; i < mintCount; i++) {
            _safeMint(msg.sender, supply + i);
        }
        _whitelist[msg.sender] = mintCount + minted;
    }

    function isWhitelisted(address addr, bytes32[] calldata merkleProof) external view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(addr));
        return MerkleProof.verify(merkleProof, _merkleRoot, leaf);
    }

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

    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setDiscountPrice(uint256 discountPrice) external onlyOwner {
        _discountPrice = discountPrice;
    }

    function setPrice(uint256 price) external onlyOwner {
        _price = price;
    }

    function setMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        _merkleRoot = merkleRoot;
    }

    function togglePreSale() external onlyOwner {
        _preSaleIsActive = !_preSaleIsActive;
    }

    function toggleSale() external onlyOwner {
        _saleIsActive = !_saleIsActive;
    }

    function tokensOfOwner(address owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }

    function projectTokensMint() external onlyOwner {
        require(totalSupply() == 0, "token_supply_not_zero");

        for (uint256 i; i < 35; i++) {
            if (i < 26) {
                _safeMint(a4, i);
            }
            else if (i < 29) {
                _safeMint(a1, i);
            }
            else if (i < 32) {
                _safeMint(a3, i);
            }
            else {
                _safeMint(a5, i);
            }
        }
    }

    function withdrawProjectFund() external onlyOwner {
        (bool p1, ) = payable(a4).call{value: 20 ether}("");
        require(p1, "transaction_failed");
    }

    function withdrawTeam() external onlyOwner {
        uint256 balance = address(this).balance;

        (bool p1, ) = payable(a1).call{value: balance * 41667 / 100000}("");
        require(p1, "transaction_failed");

        (bool p2, ) = payable(a2).call{value: balance * 33333 / 100000}("");
        require(p2, "transaction_failed");

        (bool p3, ) = payable(a3).call{value: balance * 25 / 100}("");
        require(p3, "transaction_failed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"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":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_discountPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectTokensMint","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"discountPrice","type":"uint256"}],"name":"setDiscountPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","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":[],"name":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawProjectFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTeam","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266c3663566a58000600c5566e6ed27d6668000600d55610f26600e556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550732976b4235727930d7957f9cace6020f3217d8685601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507368bf9b769abf7d8723b4d6f7399698f7e29e65d0601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ed2dd8b804731ced9176d381d971a714adb4a5f1601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b7516bb20eaaa0eb132729d1071a71bff74b117a601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507381a76401a46fa740c911e374324e4046b84cfa33601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200020c57600080fd5b5060405162005d4838038062005d48833981810160405281019062000232919062000521565b6040518060400160405280600f81526020017f5468654c61737453616d757261697300000000000000000000000000000000008152506040518060400160405280600381526020017f544c5300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620002b6929190620003e8565b508060019080519060200190620002cf929190620003e8565b505050620002f2620002e66200031a60201b60201c565b6200032260201b60201c565b81600b90805190602001906200030a929190620003e8565b5080600f8190555050506200070f565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003f6906200061a565b90600052602060002090601f0160209004810192826200041a576000855562000466565b82601f106200043557805160ff191683800117855562000466565b8280016001018555821562000466579182015b828111156200046557825182559160200191906001019062000448565b5b50905062000475919062000479565b5090565b5b80821115620004945760008160009055506001016200047a565b5090565b6000620004af620004a984620005a4565b6200057b565b905082815260208101848484011115620004c857600080fd5b620004d5848285620005e4565b509392505050565b600081519050620004ee81620006f5565b92915050565b600082601f8301126200050657600080fd5b81516200051884826020860162000498565b91505092915050565b600080604083850312156200053557600080fd5b600083015167ffffffffffffffff8111156200055057600080fd5b6200055e85828601620004f4565b92505060206200057185828601620004dd565b9150509250929050565b6000620005876200059a565b905062000595828262000650565b919050565b6000604051905090565b600067ffffffffffffffff821115620005c257620005c1620006b5565b5b620005cd82620006e4565b9050602081019050919050565b6000819050919050565b60005b8381101562000604578082015181840152602081019050620005e7565b8381111562000614576000848401525b50505050565b600060028204905060018216806200063357607f821691505b602082108114156200064a576200064962000686565b5b50919050565b6200065b82620006e4565b810181811067ffffffffffffffff821117156200067d576200067c620006b5565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6200070081620005da565b81146200070c57600080fd5b50565b615629806200071f6000396000f3fe6080604052600436106102465760003560e01c80638462151c11610139578063bf2561b4116100b6578063cfdb63ac1161007a578063cfdb63ac14610835578063d2cab05614610872578063d52c57e01461088e578063d8c7a797146108b7578063e985e9c5146108e2578063f2fde38b1461091f57610246565b8063bf2561b414610788578063c87b56dd1461079f578063c8fad220146107dc578063ca3cb522146107f3578063cfc86f7b1461080a57610246565b8063a0712d68116100fd578063a0712d68146106d8578063a22cb465146106f4578063b81420051461071d578063b88d4fde14610748578063bb51f32d1461077157610246565b80638462151c146105f35780638b78c116146106305780638da5cb5b1461065957806391b7f5ed1461068457806395d89b41146106ad57610246565b806342842e0e116101c75780636352211e1161018b5780636352211e1461052257806370a082311461055f578063715018a61461059c5780637cb64759146105b35780637d8966e4146105dc57610246565b806342842e0e1461042b5780634f6ccce71461045457806355f804b3146104915780635a23dd99146104ba5780635d893ba0146104f757610246565b806322f4596f1161020e57806322f4596f14610344578063235b6ea11461036f57806323b872dd1461039a5780632f745c59146103c35780632fc37ab21461040057610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613e6e565b610948565b60405161027f9190614674565b60405180910390f35b34801561029457600080fd5b5061029d6109c2565b6040516102aa91906146aa565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613f01565b610a54565b6040516102e791906145b9565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613de0565b610ad9565b005b34801561032557600080fd5b5061032e610bf1565b60405161033b9190614a2c565b60405180910390f35b34801561035057600080fd5b50610359610bfe565b6040516103669190614a2c565b60405180910390f35b34801561037b57600080fd5b50610384610c04565b6040516103919190614a2c565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613c82565b610c0a565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613de0565b610c6a565b6040516103f79190614a2c565b60405180910390f35b34801561040c57600080fd5b50610415610d0f565b604051610422919061468f565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613c82565b610d15565b005b34801561046057600080fd5b5061047b60048036038101906104769190613f01565b610d35565b6040516104889190614a2c565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613ec0565b610dcc565b005b3480156104c657600080fd5b506104e160048036038101906104dc9190613d4c565b610e62565b6040516104ee9190614674565b60405180910390f35b34801561050357600080fd5b5061050c610ee6565b6040516105199190614674565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190613f01565b610ef9565b60405161055691906145b9565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190613c1d565b610fab565b6040516105939190614a2c565b60405180910390f35b3480156105a857600080fd5b506105b1611063565b005b3480156105bf57600080fd5b506105da60048036038101906105d59190613e45565b6110eb565b005b3480156105e857600080fd5b506105f1611171565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613c1d565b611219565b6040516106279190614652565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190613f01565b611313565b005b34801561066557600080fd5b5061066e611399565b60405161067b91906145b9565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190613f01565b6113c3565b005b3480156106b957600080fd5b506106c2611449565b6040516106cf91906146aa565b60405180910390f35b6106f260048036038101906106ed9190613f01565b6114db565b005b34801561070057600080fd5b5061071b60048036038101906107169190613da4565b611652565b005b34801561072957600080fd5b50610732611668565b60405161073f9190614a2c565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613cd1565b61166e565b005b34801561077d57600080fd5b506107866116d0565b005b34801561079457600080fd5b5061079d611a0f565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190613f01565b611bd4565b6040516107d391906146aa565b60405180910390f35b3480156107e857600080fd5b506107f1611c7b565b005b3480156107ff57600080fd5b50610808611dd1565b005b34801561081657600080fd5b5061081f611e79565b60405161082c91906146aa565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613c1d565b611f07565b6040516108699190614a2c565b60405180910390f35b61088c60048036038101906108879190613f66565b611f1f565b005b34801561089a57600080fd5b506108b560048036038101906108b09190613f2a565b612203565b005b3480156108c357600080fd5b506108cc612436565b6040516108d99190614674565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190613c46565b612449565b6040516109169190614674565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190613c1d565b6124dd565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bb57506109ba826125d5565b5b9050919050565b6060600080546109d190614d3b565b80601f01602080910402602001604051908101604052809291908181526020018280546109fd90614d3b565b8015610a4a5780601f10610a1f57610100808354040283529160200191610a4a565b820191906000526020600020905b815481529060010190602001808311610a2d57829003601f168201915b5050505050905090565b6000610a5f826126b7565b610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a959061492c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ae482610ef9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c9061498c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b74612723565b73ffffffffffffffffffffffffffffffffffffffff161480610ba35750610ba281610b9d612723565b612449565b5b610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd99061482c565b60405180910390fd5b610bec838361272b565b505050565b6000600880549050905090565b600e5481565b600d5481565b610c1b610c15612723565b826127e4565b610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c51906149cc565b60405180910390fd5b610c658383836128c2565b505050565b6000610c7583610fab565b8210610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad906146cc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b610d308383836040518060200160405280600081525061166e565b505050565b6000610d3f610bf1565b8210610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790614a0c565b60405180910390fd5b60088281548110610dba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610dd4612723565b73ffffffffffffffffffffffffffffffffffffffff16610df2611399565b73ffffffffffffffffffffffffffffffffffffffff1614610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f9061494c565b60405180910390fd5b80600b9080519060200190610e5e9291906139cd565b5050565b60008084604051602001610e769190614565565b604051602081830303815290604052805190602001209050610edc848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5483612b29565b9150509392505050565b601060019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f999061488c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561101c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110139061486c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61106b612723565b73ffffffffffffffffffffffffffffffffffffffff16611089611399565b73ffffffffffffffffffffffffffffffffffffffff16146110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d69061494c565b60405180910390fd5b6110e96000612b40565b565b6110f3612723565b73ffffffffffffffffffffffffffffffffffffffff16611111611399565b73ffffffffffffffffffffffffffffffffffffffff1614611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e9061494c565b60405180910390fd5b80600f8190555050565b611179612723565b73ffffffffffffffffffffffffffffffffffffffff16611197611399565b73ffffffffffffffffffffffffffffffffffffffff16146111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061494c565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b6060600061122683610fab565b905060008167ffffffffffffffff81111561126a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112985781602001602082028036833780820191505090505b50905060005b82811015611308576112b08582610c6a565b8282815181106112e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061130090614d9e565b91505061129e565b508092505050919050565b61131b612723565b73ffffffffffffffffffffffffffffffffffffffff16611339611399565b73ffffffffffffffffffffffffffffffffffffffff161461138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113869061494c565b60405180910390fd5b80600c8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113cb612723565b73ffffffffffffffffffffffffffffffffffffffff166113e9611399565b73ffffffffffffffffffffffffffffffffffffffff161461143f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114369061494c565b60405180910390fd5b80600d8190555050565b60606001805461145890614d3b565b80601f016020809104026020016040519081016040528092919081815260200182805461148490614d3b565b80156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b5050505050905090565b60006114e5610bf1565b9050601060019054906101000a900460ff16611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906148cc565b60405180910390fd5b601482111561157a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611571906148ac565b60405180910390fd5b600e5482826115899190614b66565b11156115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c1906149ec565b60405180910390fd5b81600d546115d89190614bed565b34101561161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906149ac565b60405180910390fd5b60005b8281101561164d5761163a3382846116359190614b66565b612c06565b808061164590614d9e565b91505061161d565b505050565b61166461165d612723565b8383612c24565b5050565b600c5481565b61167f611679612723565b836127e4565b6116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b5906149cc565b60405180910390fd5b6116ca84848484612d91565b50505050565b6116d8612723565b73ffffffffffffffffffffffffffffffffffffffff166116f6611399565b73ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117439061494c565b60405180910390fd5b60004790506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620186a061a2c38461179e9190614bed565b6117a89190614bbc565b6040516117b4906145a4565b60006040518083038185875af1925050503d80600081146117f1576040519150601f19603f3d011682016040523d82523d6000602084013e6117f6565b606091505b505090508061183a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118319061476c565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620186a0618235856118879190614bed565b6118919190614bbc565b60405161189d906145a4565b60006040518083038185875af1925050503d80600081146118da576040519150601f19603f3d011682016040523d82523d6000602084013e6118df565b606091505b5050905080611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a9061476c565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16606460198661196d9190614bed565b6119779190614bbc565b604051611983906145a4565b60006040518083038185875af1925050503d80600081146119c0576040519150601f19603f3d011682016040523d82523d6000602084013e6119c5565b606091505b5050905080611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a009061476c565b60405180910390fd5b50505050565b611a17612723565b73ffffffffffffffffffffffffffffffffffffffff16611a35611399565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a829061494c565b60405180910390fd5b6000611a95610bf1565b14611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc906148ec565b60405180910390fd5b60005b6023811015611bd157601a811015611b1b57611b16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c06565b611bbe565b601d811015611b5557611b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c06565b611bbd565b6020811015611b8f57611b8a601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c06565b611bbc565b611bbb601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c06565b5b5b5b8080611bc990614d9e565b915050611ad8565b50565b6060611bdf826126b7565b611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c159061496c565b60405180910390fd5b6000611c28612ded565b90506000815111611c485760405180602001604052806000815250611c73565b80611c5284612e7f565b604051602001611c63929190614580565b6040516020818303038152906040525b915050919050565b611c83612723565b73ffffffffffffffffffffffffffffffffffffffff16611ca1611399565b73ffffffffffffffffffffffffffffffffffffffff1614611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee9061494c565b60405180910390fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166801158e460913d00000604051611d48906145a4565b60006040518083038185875af1925050503d8060008114611d85576040519150601f19603f3d011682016040523d82523d6000602084013e611d8a565b606091505b5050905080611dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc59061476c565b60405180910390fd5b50565b611dd9612723565b73ffffffffffffffffffffffffffffffffffffffff16611df7611399565b73ffffffffffffffffffffffffffffffffffffffff1614611e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e449061494c565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600b8054611e8690614d3b565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb290614d3b565b8015611eff5780601f10611ed457610100808354040283529160200191611eff565b820191906000526020600020905b815481529060010190602001808311611ee257829003601f168201915b505050505081565b60116020528060005260406000206000915090505481565b6000611f29610bf1565b90506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084600c54611f7d9190614bed565b341015611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb6906149ac565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16635a23dd993386866040518463ffffffff1660e01b8152600401611ffc93929190614620565b60206040518083038186803b15801561201457600080fd5b505afa158015612028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204c9190613e1c565b61208b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120829061484c565b60405180910390fd5b601060009054906101000a900460ff166120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d1906147ac565b60405180910390fd5b600281866120e89190614b66565b1115612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906148ac565b60405180910390fd5b600e5485836121389190614b66565b1115612179576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612170906149ec565b60405180910390fd5b60005b858110156121ac576121993382856121949190614b66565b612c06565b80806121a490614d9e565b91505061217c565b5080856121b99190614b66565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b600061220d610bf1565b90506000339050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806122bd5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b806123155750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b8061236d5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a3906147ec565b60405180910390fd5b600e5484836123bb9190614b66565b11156123fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f3906149ec565b60405180910390fd5b60005b8481101561242f5761241c8482856124179190614b66565b612c06565b808061242790614d9e565b9150506123ff565b5050505050565b601060009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124e5612723565b73ffffffffffffffffffffffffffffffffffffffff16612503611399565b73ffffffffffffffffffffffffffffffffffffffff1614612559576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125509061494c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c09061470c565b60405180910390fd5b6125d281612b40565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126b057506126af8261302c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661279e83610ef9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127ef826126b7565b61282e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128259061480c565b60405180910390fd5b600061283983610ef9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128a857508373ffffffffffffffffffffffffffffffffffffffff1661289084610a54565b73ffffffffffffffffffffffffffffffffffffffff16145b806128b957506128b88185612449565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128e282610ef9565b73ffffffffffffffffffffffffffffffffffffffff1614612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f9061472c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299f9061478c565b60405180910390fd5b6129b3838383613096565b6129be60008261272b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a0e9190614c47565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a659190614b66565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b248383836131aa565b505050565b600082612b3685846131af565b1490509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c2082826040518060200160405280600081525061324a565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a906147cc565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d849190614674565b60405180910390a3505050565b612d9c8484846128c2565b612da8848484846132a5565b612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde906146ec565b60405180910390fd5b50505050565b6060600b8054612dfc90614d3b565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2890614d3b565b8015612e755780601f10612e4a57610100808354040283529160200191612e75565b820191906000526020600020905b815481529060010190602001808311612e5857829003601f168201915b5050505050905090565b60606000821415612ec7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613027565b600082905060005b60008214612ef9578080612ee290614d9e565b915050600a82612ef29190614bbc565b9150612ecf565b60008167ffffffffffffffff811115612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f6d5781602001600182028036833780820191505090505b5090505b6000851461302057600182612f869190614c47565b9150600a85612f959190614e0b565b6030612fa19190614b66565b60f81b818381518110612fdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130199190614bbc565b9450612f71565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6130a183838361343c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130e4576130df81613441565b613123565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461312257613121838261348a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561316657613161816135f7565b6131a5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131a4576131a3828261373a565b5b5b505050565b505050565b60008082905060005b845181101561323f5760008582815181106131fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161321e5761321783826137b9565b925061322b565b61322881846137b9565b92505b50808061323790614d9e565b9150506131b8565b508091505092915050565b61325483836137d0565b61326160008484846132a5565b6132a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613297906146ec565b60405180910390fd5b505050565b60006132c68473ffffffffffffffffffffffffffffffffffffffff166139aa565b1561342f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132ef612723565b8786866040518563ffffffff1660e01b815260040161331194939291906145d4565b602060405180830381600087803b15801561332b57600080fd5b505af192505050801561335c57506040513d601f19601f820116820180604052508101906133599190613e97565b60015b6133df573d806000811461338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b506000815114156133d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ce906146ec565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613434565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161349784610fab565b6134a19190614c47565b9050600060076000848152602001908152602001600020549050818114613586576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061360b9190614c47565b9050600060096000848152602001908152602001600020549050600060088381548110613661577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106136a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061371e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061374583610fab565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613840576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138379061490c565b60405180910390fd5b613849816126b7565b15613889576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138809061474c565b60405180910390fd5b61389560008383613096565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138e59190614b66565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139a6600083836131aa565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546139d990614d3b565b90600052602060002090601f0160209004810192826139fb5760008555613a42565b82601f10613a1457805160ff1916838001178555613a42565b82800160010185558215613a42579182015b82811115613a41578251825591602001919060010190613a26565b5b509050613a4f9190613a53565b5090565b5b80821115613a6c576000816000905550600101613a54565b5090565b6000613a83613a7e84614a6c565b614a47565b905082815260208101848484011115613a9b57600080fd5b613aa6848285614cf9565b509392505050565b6000613ac1613abc84614a9d565b614a47565b905082815260208101848484011115613ad957600080fd5b613ae4848285614cf9565b509392505050565b600081359050613afb81615580565b92915050565b60008083601f840112613b1357600080fd5b8235905067ffffffffffffffff811115613b2c57600080fd5b602083019150836020820283011115613b4457600080fd5b9250929050565b600081359050613b5a81615597565b92915050565b600081519050613b6f81615597565b92915050565b600081359050613b84816155ae565b92915050565b600081359050613b99816155c5565b92915050565b600081519050613bae816155c5565b92915050565b600082601f830112613bc557600080fd5b8135613bd5848260208601613a70565b91505092915050565b600082601f830112613bef57600080fd5b8135613bff848260208601613aae565b91505092915050565b600081359050613c17816155dc565b92915050565b600060208284031215613c2f57600080fd5b6000613c3d84828501613aec565b91505092915050565b60008060408385031215613c5957600080fd5b6000613c6785828601613aec565b9250506020613c7885828601613aec565b9150509250929050565b600080600060608486031215613c9757600080fd5b6000613ca586828701613aec565b9350506020613cb686828701613aec565b9250506040613cc786828701613c08565b9150509250925092565b60008060008060808587031215613ce757600080fd5b6000613cf587828801613aec565b9450506020613d0687828801613aec565b9350506040613d1787828801613c08565b925050606085013567ffffffffffffffff811115613d3457600080fd5b613d4087828801613bb4565b91505092959194509250565b600080600060408486031215613d6157600080fd5b6000613d6f86828701613aec565b935050602084013567ffffffffffffffff811115613d8c57600080fd5b613d9886828701613b01565b92509250509250925092565b60008060408385031215613db757600080fd5b6000613dc585828601613aec565b9250506020613dd685828601613b4b565b9150509250929050565b60008060408385031215613df357600080fd5b6000613e0185828601613aec565b9250506020613e1285828601613c08565b9150509250929050565b600060208284031215613e2e57600080fd5b6000613e3c84828501613b60565b91505092915050565b600060208284031215613e5757600080fd5b6000613e6584828501613b75565b91505092915050565b600060208284031215613e8057600080fd5b6000613e8e84828501613b8a565b91505092915050565b600060208284031215613ea957600080fd5b6000613eb784828501613b9f565b91505092915050565b600060208284031215613ed257600080fd5b600082013567ffffffffffffffff811115613eec57600080fd5b613ef884828501613bde565b91505092915050565b600060208284031215613f1357600080fd5b6000613f2184828501613c08565b91505092915050565b60008060408385031215613f3d57600080fd5b6000613f4b85828601613c08565b9250506020613f5c85828601613aec565b9150509250929050565b600080600060408486031215613f7b57600080fd5b6000613f8986828701613c08565b935050602084013567ffffffffffffffff811115613fa657600080fd5b613fb286828701613b01565b92509250509250925092565b6000613fca8383614547565b60208301905092915050565b613fdf81614c7b565b82525050565b613ff6613ff182614c7b565b614de7565b82525050565b60006140088385614b0c565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561403757600080fd5b602083029250614048838584614cf9565b82840190509392505050565b600061405f82614ade565b6140698185614b1d565b935061407483614ace565b8060005b838110156140a557815161408c8882613fbe565b975061409783614aff565b925050600181019050614078565b5085935050505092915050565b6140bb81614c8d565b82525050565b6140ca81614c99565b82525050565b60006140db82614ae9565b6140e58185614b2e565b93506140f5818560208601614d08565b6140fe81614ef8565b840191505092915050565b600061411482614af4565b61411e8185614b4a565b935061412e818560208601614d08565b61413781614ef8565b840191505092915050565b600061414d82614af4565b6141578185614b5b565b9350614167818560208601614d08565b80840191505092915050565b6000614180602b83614b4a565b915061418b82614f16565b604082019050919050565b60006141a3603283614b4a565b91506141ae82614f65565b604082019050919050565b60006141c6602683614b4a565b91506141d182614fb4565b604082019050919050565b60006141e9602583614b4a565b91506141f482615003565b604082019050919050565b600061420c601c83614b4a565b915061421782615052565b602082019050919050565b600061422f601283614b4a565b915061423a8261507b565b602082019050919050565b6000614252602483614b4a565b915061425d826150a4565b604082019050919050565b6000614275601383614b4a565b9150614280826150f3565b602082019050919050565b6000614298601983614b4a565b91506142a38261511c565b602082019050919050565b60006142bb601383614b4a565b91506142c682615145565b602082019050919050565b60006142de602c83614b4a565b91506142e98261516e565b604082019050919050565b6000614301603883614b4a565b915061430c826151bd565b604082019050919050565b6000614324600f83614b4a565b915061432f8261520c565b602082019050919050565b6000614347602a83614b4a565b915061435282615235565b604082019050919050565b600061436a602983614b4a565b915061437582615284565b604082019050919050565b600061438d601783614b4a565b9150614398826152d3565b602082019050919050565b60006143b0600f83614b4a565b91506143bb826152fc565b602082019050919050565b60006143d3601583614b4a565b91506143de82615325565b602082019050919050565b60006143f6602083614b4a565b91506144018261534e565b602082019050919050565b6000614419602c83614b4a565b915061442482615377565b604082019050919050565b600061443c602083614b4a565b9150614447826153c6565b602082019050919050565b600061445f602f83614b4a565b915061446a826153ef565b604082019050919050565b6000614482602183614b4a565b915061448d8261543e565b604082019050919050565b60006144a5601a83614b4a565b91506144b08261548d565b602082019050919050565b60006144c8600083614b3f565b91506144d3826154b6565b600082019050919050565b60006144eb603183614b4a565b91506144f6826154b9565b604082019050919050565b600061450e601983614b4a565b915061451982615508565b602082019050919050565b6000614531602c83614b4a565b915061453c82615531565b604082019050919050565b61455081614cef565b82525050565b61455f81614cef565b82525050565b60006145718284613fe5565b60148201915081905092915050565b600061458c8285614142565b91506145988284614142565b91508190509392505050565b60006145af826144bb565b9150819050919050565b60006020820190506145ce6000830184613fd6565b92915050565b60006080820190506145e96000830187613fd6565b6145f66020830186613fd6565b6146036040830185614556565b818103606083015261461581846140d0565b905095945050505050565b60006040820190506146356000830186613fd6565b8181036020830152614648818486613ffc565b9050949350505050565b6000602082019050818103600083015261466c8184614054565b905092915050565b600060208201905061468960008301846140b2565b92915050565b60006020820190506146a460008301846140c1565b92915050565b600060208201905081810360008301526146c48184614109565b905092915050565b600060208201905081810360008301526146e581614173565b9050919050565b6000602082019050818103600083015261470581614196565b9050919050565b60006020820190508181036000830152614725816141b9565b9050919050565b60006020820190508181036000830152614745816141dc565b9050919050565b60006020820190508181036000830152614765816141ff565b9050919050565b6000602082019050818103600083015261478581614222565b9050919050565b600060208201905081810360008301526147a581614245565b9050919050565b600060208201905081810360008301526147c581614268565b9050919050565b600060208201905081810360008301526147e58161428b565b9050919050565b60006020820190508181036000830152614805816142ae565b9050919050565b60006020820190508181036000830152614825816142d1565b9050919050565b60006020820190508181036000830152614845816142f4565b9050919050565b6000602082019050818103600083015261486581614317565b9050919050565b600060208201905081810360008301526148858161433a565b9050919050565b600060208201905081810360008301526148a58161435d565b9050919050565b600060208201905081810360008301526148c581614380565b9050919050565b600060208201905081810360008301526148e5816143a3565b9050919050565b60006020820190508181036000830152614905816143c6565b9050919050565b60006020820190508181036000830152614925816143e9565b9050919050565b600060208201905081810360008301526149458161440c565b9050919050565b600060208201905081810360008301526149658161442f565b9050919050565b6000602082019050818103600083015261498581614452565b9050919050565b600060208201905081810360008301526149a581614475565b9050919050565b600060208201905081810360008301526149c581614498565b9050919050565b600060208201905081810360008301526149e5816144de565b9050919050565b60006020820190508181036000830152614a0581614501565b9050919050565b60006020820190508181036000830152614a2581614524565b9050919050565b6000602082019050614a416000830184614556565b92915050565b6000614a51614a62565b9050614a5d8282614d6d565b919050565b6000604051905090565b600067ffffffffffffffff821115614a8757614a86614ec9565b5b614a9082614ef8565b9050602081019050919050565b600067ffffffffffffffff821115614ab857614ab7614ec9565b5b614ac182614ef8565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b7182614cef565b9150614b7c83614cef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bb157614bb0614e3c565b5b828201905092915050565b6000614bc782614cef565b9150614bd283614cef565b925082614be257614be1614e6b565b5b828204905092915050565b6000614bf882614cef565b9150614c0383614cef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c3c57614c3b614e3c565b5b828202905092915050565b6000614c5282614cef565b9150614c5d83614cef565b925082821015614c7057614c6f614e3c565b5b828203905092915050565b6000614c8682614ccf565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d26578082015181840152602081019050614d0b565b83811115614d35576000848401525b50505050565b60006002820490506001821680614d5357607f821691505b60208210811415614d6757614d66614e9a565b5b50919050565b614d7682614ef8565b810181811067ffffffffffffffff82111715614d9557614d94614ec9565b5b80604052505050565b6000614da982614cef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ddc57614ddb614e3c565b5b600182019050919050565b6000614df282614df9565b9050919050565b6000614e0482614f09565b9050919050565b6000614e1682614cef565b9150614e2183614cef565b925082614e3157614e30614e6b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f7472616e73616374696f6e5f6661696c65640000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f7072655f73616c655f6e6f745f61637469766500000000000000000000000000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f756e617574686f72697a65645f73656e64657200000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f6e6f745f77686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d61785f6d696e745f636f756e745f6578636565646564000000000000000000600082015250565b7f73616c655f6e6f745f6163746976650000000000000000000000000000000000600082015250565b7f746f6b656e5f737570706c795f6e6f745f7a65726f0000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e745f7061796d656e745f76616c7565000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d61785f746f6b656e5f737570706c795f657863656564656400000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61558981614c7b565b811461559457600080fd5b50565b6155a081614c8d565b81146155ab57600080fd5b50565b6155b781614c99565b81146155c257600080fd5b50565b6155ce81614ca3565b81146155d957600080fd5b50565b6155e581614cef565b81146155f057600080fd5b5056fea26469706673582212203fb12c576d29de665e6d2759b4434f1093c513a60ddf087752ccd3eafc5a461b64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000404b22bf14cebe0e80316f9de932f10feb9bde43c5458e243e1e2dc566c3e658ea0000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d66526f3745786b59513159444b7634586d52446242724b4c35526158345237727332396d5746477367776f4c3f00000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c80638462151c11610139578063bf2561b4116100b6578063cfdb63ac1161007a578063cfdb63ac14610835578063d2cab05614610872578063d52c57e01461088e578063d8c7a797146108b7578063e985e9c5146108e2578063f2fde38b1461091f57610246565b8063bf2561b414610788578063c87b56dd1461079f578063c8fad220146107dc578063ca3cb522146107f3578063cfc86f7b1461080a57610246565b8063a0712d68116100fd578063a0712d68146106d8578063a22cb465146106f4578063b81420051461071d578063b88d4fde14610748578063bb51f32d1461077157610246565b80638462151c146105f35780638b78c116146106305780638da5cb5b1461065957806391b7f5ed1461068457806395d89b41146106ad57610246565b806342842e0e116101c75780636352211e1161018b5780636352211e1461052257806370a082311461055f578063715018a61461059c5780637cb64759146105b35780637d8966e4146105dc57610246565b806342842e0e1461042b5780634f6ccce71461045457806355f804b3146104915780635a23dd99146104ba5780635d893ba0146104f757610246565b806322f4596f1161020e57806322f4596f14610344578063235b6ea11461036f57806323b872dd1461039a5780632f745c59146103c35780632fc37ab21461040057610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613e6e565b610948565b60405161027f9190614674565b60405180910390f35b34801561029457600080fd5b5061029d6109c2565b6040516102aa91906146aa565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613f01565b610a54565b6040516102e791906145b9565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613de0565b610ad9565b005b34801561032557600080fd5b5061032e610bf1565b60405161033b9190614a2c565b60405180910390f35b34801561035057600080fd5b50610359610bfe565b6040516103669190614a2c565b60405180910390f35b34801561037b57600080fd5b50610384610c04565b6040516103919190614a2c565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613c82565b610c0a565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613de0565b610c6a565b6040516103f79190614a2c565b60405180910390f35b34801561040c57600080fd5b50610415610d0f565b604051610422919061468f565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613c82565b610d15565b005b34801561046057600080fd5b5061047b60048036038101906104769190613f01565b610d35565b6040516104889190614a2c565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613ec0565b610dcc565b005b3480156104c657600080fd5b506104e160048036038101906104dc9190613d4c565b610e62565b6040516104ee9190614674565b60405180910390f35b34801561050357600080fd5b5061050c610ee6565b6040516105199190614674565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190613f01565b610ef9565b60405161055691906145b9565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190613c1d565b610fab565b6040516105939190614a2c565b60405180910390f35b3480156105a857600080fd5b506105b1611063565b005b3480156105bf57600080fd5b506105da60048036038101906105d59190613e45565b6110eb565b005b3480156105e857600080fd5b506105f1611171565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613c1d565b611219565b6040516106279190614652565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190613f01565b611313565b005b34801561066557600080fd5b5061066e611399565b60405161067b91906145b9565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190613f01565b6113c3565b005b3480156106b957600080fd5b506106c2611449565b6040516106cf91906146aa565b60405180910390f35b6106f260048036038101906106ed9190613f01565b6114db565b005b34801561070057600080fd5b5061071b60048036038101906107169190613da4565b611652565b005b34801561072957600080fd5b50610732611668565b60405161073f9190614a2c565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613cd1565b61166e565b005b34801561077d57600080fd5b506107866116d0565b005b34801561079457600080fd5b5061079d611a0f565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190613f01565b611bd4565b6040516107d391906146aa565b60405180910390f35b3480156107e857600080fd5b506107f1611c7b565b005b3480156107ff57600080fd5b50610808611dd1565b005b34801561081657600080fd5b5061081f611e79565b60405161082c91906146aa565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613c1d565b611f07565b6040516108699190614a2c565b60405180910390f35b61088c60048036038101906108879190613f66565b611f1f565b005b34801561089a57600080fd5b506108b560048036038101906108b09190613f2a565b612203565b005b3480156108c357600080fd5b506108cc612436565b6040516108d99190614674565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190613c46565b612449565b6040516109169190614674565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190613c1d565b6124dd565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bb57506109ba826125d5565b5b9050919050565b6060600080546109d190614d3b565b80601f01602080910402602001604051908101604052809291908181526020018280546109fd90614d3b565b8015610a4a5780601f10610a1f57610100808354040283529160200191610a4a565b820191906000526020600020905b815481529060010190602001808311610a2d57829003601f168201915b5050505050905090565b6000610a5f826126b7565b610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a959061492c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ae482610ef9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c9061498c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b74612723565b73ffffffffffffffffffffffffffffffffffffffff161480610ba35750610ba281610b9d612723565b612449565b5b610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd99061482c565b60405180910390fd5b610bec838361272b565b505050565b6000600880549050905090565b600e5481565b600d5481565b610c1b610c15612723565b826127e4565b610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c51906149cc565b60405180910390fd5b610c658383836128c2565b505050565b6000610c7583610fab565b8210610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad906146cc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b610d308383836040518060200160405280600081525061166e565b505050565b6000610d3f610bf1565b8210610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7790614a0c565b60405180910390fd5b60088281548110610dba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610dd4612723565b73ffffffffffffffffffffffffffffffffffffffff16610df2611399565b73ffffffffffffffffffffffffffffffffffffffff1614610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f9061494c565b60405180910390fd5b80600b9080519060200190610e5e9291906139cd565b5050565b60008084604051602001610e769190614565565b604051602081830303815290604052805190602001209050610edc848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5483612b29565b9150509392505050565b601060019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f999061488c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561101c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110139061486c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61106b612723565b73ffffffffffffffffffffffffffffffffffffffff16611089611399565b73ffffffffffffffffffffffffffffffffffffffff16146110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d69061494c565b60405180910390fd5b6110e96000612b40565b565b6110f3612723565b73ffffffffffffffffffffffffffffffffffffffff16611111611399565b73ffffffffffffffffffffffffffffffffffffffff1614611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e9061494c565b60405180910390fd5b80600f8190555050565b611179612723565b73ffffffffffffffffffffffffffffffffffffffff16611197611399565b73ffffffffffffffffffffffffffffffffffffffff16146111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061494c565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b6060600061122683610fab565b905060008167ffffffffffffffff81111561126a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112985781602001602082028036833780820191505090505b50905060005b82811015611308576112b08582610c6a565b8282815181106112e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061130090614d9e565b91505061129e565b508092505050919050565b61131b612723565b73ffffffffffffffffffffffffffffffffffffffff16611339611399565b73ffffffffffffffffffffffffffffffffffffffff161461138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113869061494c565b60405180910390fd5b80600c8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113cb612723565b73ffffffffffffffffffffffffffffffffffffffff166113e9611399565b73ffffffffffffffffffffffffffffffffffffffff161461143f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114369061494c565b60405180910390fd5b80600d8190555050565b60606001805461145890614d3b565b80601f016020809104026020016040519081016040528092919081815260200182805461148490614d3b565b80156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b5050505050905090565b60006114e5610bf1565b9050601060019054906101000a900460ff16611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906148cc565b60405180910390fd5b601482111561157a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611571906148ac565b60405180910390fd5b600e5482826115899190614b66565b11156115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c1906149ec565b60405180910390fd5b81600d546115d89190614bed565b34101561161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906149ac565b60405180910390fd5b60005b8281101561164d5761163a3382846116359190614b66565b612c06565b808061164590614d9e565b91505061161d565b505050565b61166461165d612723565b8383612c24565b5050565b600c5481565b61167f611679612723565b836127e4565b6116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b5906149cc565b60405180910390fd5b6116ca84848484612d91565b50505050565b6116d8612723565b73ffffffffffffffffffffffffffffffffffffffff166116f6611399565b73ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117439061494c565b60405180910390fd5b60004790506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620186a061a2c38461179e9190614bed565b6117a89190614bbc565b6040516117b4906145a4565b60006040518083038185875af1925050503d80600081146117f1576040519150601f19603f3d011682016040523d82523d6000602084013e6117f6565b606091505b505090508061183a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118319061476c565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620186a0618235856118879190614bed565b6118919190614bbc565b60405161189d906145a4565b60006040518083038185875af1925050503d80600081146118da576040519150601f19603f3d011682016040523d82523d6000602084013e6118df565b606091505b5050905080611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a9061476c565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16606460198661196d9190614bed565b6119779190614bbc565b604051611983906145a4565b60006040518083038185875af1925050503d80600081146119c0576040519150601f19603f3d011682016040523d82523d6000602084013e6119c5565b606091505b5050905080611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a009061476c565b60405180910390fd5b50505050565b611a17612723565b73ffffffffffffffffffffffffffffffffffffffff16611a35611399565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a829061494c565b60405180910390fd5b6000611a95610bf1565b14611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc906148ec565b60405180910390fd5b60005b6023811015611bd157601a811015611b1b57611b16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c06565b611bbe565b601d811015611b5557611b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c06565b611bbd565b6020811015611b8f57611b8a601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c06565b611bbc565b611bbb601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c06565b5b5b5b8080611bc990614d9e565b915050611ad8565b50565b6060611bdf826126b7565b611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c159061496c565b60405180910390fd5b6000611c28612ded565b90506000815111611c485760405180602001604052806000815250611c73565b80611c5284612e7f565b604051602001611c63929190614580565b6040516020818303038152906040525b915050919050565b611c83612723565b73ffffffffffffffffffffffffffffffffffffffff16611ca1611399565b73ffffffffffffffffffffffffffffffffffffffff1614611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee9061494c565b60405180910390fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166801158e460913d00000604051611d48906145a4565b60006040518083038185875af1925050503d8060008114611d85576040519150601f19603f3d011682016040523d82523d6000602084013e611d8a565b606091505b5050905080611dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc59061476c565b60405180910390fd5b50565b611dd9612723565b73ffffffffffffffffffffffffffffffffffffffff16611df7611399565b73ffffffffffffffffffffffffffffffffffffffff1614611e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e449061494c565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600b8054611e8690614d3b565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb290614d3b565b8015611eff5780601f10611ed457610100808354040283529160200191611eff565b820191906000526020600020905b815481529060010190602001808311611ee257829003601f168201915b505050505081565b60116020528060005260406000206000915090505481565b6000611f29610bf1565b90506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084600c54611f7d9190614bed565b341015611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb6906149ac565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16635a23dd993386866040518463ffffffff1660e01b8152600401611ffc93929190614620565b60206040518083038186803b15801561201457600080fd5b505afa158015612028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204c9190613e1c565b61208b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120829061484c565b60405180910390fd5b601060009054906101000a900460ff166120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d1906147ac565b60405180910390fd5b600281866120e89190614b66565b1115612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906148ac565b60405180910390fd5b600e5485836121389190614b66565b1115612179576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612170906149ec565b60405180910390fd5b60005b858110156121ac576121993382856121949190614b66565b612c06565b80806121a490614d9e565b91505061217c565b5080856121b99190614b66565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b600061220d610bf1565b90506000339050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806122bd5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b806123155750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b8061236d5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a3906147ec565b60405180910390fd5b600e5484836123bb9190614b66565b11156123fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f3906149ec565b60405180910390fd5b60005b8481101561242f5761241c8482856124179190614b66565b612c06565b808061242790614d9e565b9150506123ff565b5050505050565b601060009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124e5612723565b73ffffffffffffffffffffffffffffffffffffffff16612503611399565b73ffffffffffffffffffffffffffffffffffffffff1614612559576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125509061494c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c09061470c565b60405180910390fd5b6125d281612b40565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126b057506126af8261302c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661279e83610ef9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127ef826126b7565b61282e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128259061480c565b60405180910390fd5b600061283983610ef9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128a857508373ffffffffffffffffffffffffffffffffffffffff1661289084610a54565b73ffffffffffffffffffffffffffffffffffffffff16145b806128b957506128b88185612449565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128e282610ef9565b73ffffffffffffffffffffffffffffffffffffffff1614612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292f9061472c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299f9061478c565b60405180910390fd5b6129b3838383613096565b6129be60008261272b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a0e9190614c47565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a659190614b66565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b248383836131aa565b505050565b600082612b3685846131af565b1490509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c2082826040518060200160405280600081525061324a565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a906147cc565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d849190614674565b60405180910390a3505050565b612d9c8484846128c2565b612da8848484846132a5565b612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde906146ec565b60405180910390fd5b50505050565b6060600b8054612dfc90614d3b565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2890614d3b565b8015612e755780601f10612e4a57610100808354040283529160200191612e75565b820191906000526020600020905b815481529060010190602001808311612e5857829003601f168201915b5050505050905090565b60606000821415612ec7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613027565b600082905060005b60008214612ef9578080612ee290614d9e565b915050600a82612ef29190614bbc565b9150612ecf565b60008167ffffffffffffffff811115612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f6d5781602001600182028036833780820191505090505b5090505b6000851461302057600182612f869190614c47565b9150600a85612f959190614e0b565b6030612fa19190614b66565b60f81b818381518110612fdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130199190614bbc565b9450612f71565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6130a183838361343c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130e4576130df81613441565b613123565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461312257613121838261348a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561316657613161816135f7565b6131a5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131a4576131a3828261373a565b5b5b505050565b505050565b60008082905060005b845181101561323f5760008582815181106131fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161321e5761321783826137b9565b925061322b565b61322881846137b9565b92505b50808061323790614d9e565b9150506131b8565b508091505092915050565b61325483836137d0565b61326160008484846132a5565b6132a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613297906146ec565b60405180910390fd5b505050565b60006132c68473ffffffffffffffffffffffffffffffffffffffff166139aa565b1561342f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132ef612723565b8786866040518563ffffffff1660e01b815260040161331194939291906145d4565b602060405180830381600087803b15801561332b57600080fd5b505af192505050801561335c57506040513d601f19601f820116820180604052508101906133599190613e97565b60015b6133df573d806000811461338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b506000815114156133d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ce906146ec565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613434565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161349784610fab565b6134a19190614c47565b9050600060076000848152602001908152602001600020549050818114613586576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061360b9190614c47565b9050600060096000848152602001908152602001600020549050600060088381548110613661577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106136a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061371e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061374583610fab565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613840576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138379061490c565b60405180910390fd5b613849816126b7565b15613889576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138809061474c565b60405180910390fd5b61389560008383613096565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138e59190614b66565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139a6600083836131aa565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546139d990614d3b565b90600052602060002090601f0160209004810192826139fb5760008555613a42565b82601f10613a1457805160ff1916838001178555613a42565b82800160010185558215613a42579182015b82811115613a41578251825591602001919060010190613a26565b5b509050613a4f9190613a53565b5090565b5b80821115613a6c576000816000905550600101613a54565b5090565b6000613a83613a7e84614a6c565b614a47565b905082815260208101848484011115613a9b57600080fd5b613aa6848285614cf9565b509392505050565b6000613ac1613abc84614a9d565b614a47565b905082815260208101848484011115613ad957600080fd5b613ae4848285614cf9565b509392505050565b600081359050613afb81615580565b92915050565b60008083601f840112613b1357600080fd5b8235905067ffffffffffffffff811115613b2c57600080fd5b602083019150836020820283011115613b4457600080fd5b9250929050565b600081359050613b5a81615597565b92915050565b600081519050613b6f81615597565b92915050565b600081359050613b84816155ae565b92915050565b600081359050613b99816155c5565b92915050565b600081519050613bae816155c5565b92915050565b600082601f830112613bc557600080fd5b8135613bd5848260208601613a70565b91505092915050565b600082601f830112613bef57600080fd5b8135613bff848260208601613aae565b91505092915050565b600081359050613c17816155dc565b92915050565b600060208284031215613c2f57600080fd5b6000613c3d84828501613aec565b91505092915050565b60008060408385031215613c5957600080fd5b6000613c6785828601613aec565b9250506020613c7885828601613aec565b9150509250929050565b600080600060608486031215613c9757600080fd5b6000613ca586828701613aec565b9350506020613cb686828701613aec565b9250506040613cc786828701613c08565b9150509250925092565b60008060008060808587031215613ce757600080fd5b6000613cf587828801613aec565b9450506020613d0687828801613aec565b9350506040613d1787828801613c08565b925050606085013567ffffffffffffffff811115613d3457600080fd5b613d4087828801613bb4565b91505092959194509250565b600080600060408486031215613d6157600080fd5b6000613d6f86828701613aec565b935050602084013567ffffffffffffffff811115613d8c57600080fd5b613d9886828701613b01565b92509250509250925092565b60008060408385031215613db757600080fd5b6000613dc585828601613aec565b9250506020613dd685828601613b4b565b9150509250929050565b60008060408385031215613df357600080fd5b6000613e0185828601613aec565b9250506020613e1285828601613c08565b9150509250929050565b600060208284031215613e2e57600080fd5b6000613e3c84828501613b60565b91505092915050565b600060208284031215613e5757600080fd5b6000613e6584828501613b75565b91505092915050565b600060208284031215613e8057600080fd5b6000613e8e84828501613b8a565b91505092915050565b600060208284031215613ea957600080fd5b6000613eb784828501613b9f565b91505092915050565b600060208284031215613ed257600080fd5b600082013567ffffffffffffffff811115613eec57600080fd5b613ef884828501613bde565b91505092915050565b600060208284031215613f1357600080fd5b6000613f2184828501613c08565b91505092915050565b60008060408385031215613f3d57600080fd5b6000613f4b85828601613c08565b9250506020613f5c85828601613aec565b9150509250929050565b600080600060408486031215613f7b57600080fd5b6000613f8986828701613c08565b935050602084013567ffffffffffffffff811115613fa657600080fd5b613fb286828701613b01565b92509250509250925092565b6000613fca8383614547565b60208301905092915050565b613fdf81614c7b565b82525050565b613ff6613ff182614c7b565b614de7565b82525050565b60006140088385614b0c565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561403757600080fd5b602083029250614048838584614cf9565b82840190509392505050565b600061405f82614ade565b6140698185614b1d565b935061407483614ace565b8060005b838110156140a557815161408c8882613fbe565b975061409783614aff565b925050600181019050614078565b5085935050505092915050565b6140bb81614c8d565b82525050565b6140ca81614c99565b82525050565b60006140db82614ae9565b6140e58185614b2e565b93506140f5818560208601614d08565b6140fe81614ef8565b840191505092915050565b600061411482614af4565b61411e8185614b4a565b935061412e818560208601614d08565b61413781614ef8565b840191505092915050565b600061414d82614af4565b6141578185614b5b565b9350614167818560208601614d08565b80840191505092915050565b6000614180602b83614b4a565b915061418b82614f16565b604082019050919050565b60006141a3603283614b4a565b91506141ae82614f65565b604082019050919050565b60006141c6602683614b4a565b91506141d182614fb4565b604082019050919050565b60006141e9602583614b4a565b91506141f482615003565b604082019050919050565b600061420c601c83614b4a565b915061421782615052565b602082019050919050565b600061422f601283614b4a565b915061423a8261507b565b602082019050919050565b6000614252602483614b4a565b915061425d826150a4565b604082019050919050565b6000614275601383614b4a565b9150614280826150f3565b602082019050919050565b6000614298601983614b4a565b91506142a38261511c565b602082019050919050565b60006142bb601383614b4a565b91506142c682615145565b602082019050919050565b60006142de602c83614b4a565b91506142e98261516e565b604082019050919050565b6000614301603883614b4a565b915061430c826151bd565b604082019050919050565b6000614324600f83614b4a565b915061432f8261520c565b602082019050919050565b6000614347602a83614b4a565b915061435282615235565b604082019050919050565b600061436a602983614b4a565b915061437582615284565b604082019050919050565b600061438d601783614b4a565b9150614398826152d3565b602082019050919050565b60006143b0600f83614b4a565b91506143bb826152fc565b602082019050919050565b60006143d3601583614b4a565b91506143de82615325565b602082019050919050565b60006143f6602083614b4a565b91506144018261534e565b602082019050919050565b6000614419602c83614b4a565b915061442482615377565b604082019050919050565b600061443c602083614b4a565b9150614447826153c6565b602082019050919050565b600061445f602f83614b4a565b915061446a826153ef565b604082019050919050565b6000614482602183614b4a565b915061448d8261543e565b604082019050919050565b60006144a5601a83614b4a565b91506144b08261548d565b602082019050919050565b60006144c8600083614b3f565b91506144d3826154b6565b600082019050919050565b60006144eb603183614b4a565b91506144f6826154b9565b604082019050919050565b600061450e601983614b4a565b915061451982615508565b602082019050919050565b6000614531602c83614b4a565b915061453c82615531565b604082019050919050565b61455081614cef565b82525050565b61455f81614cef565b82525050565b60006145718284613fe5565b60148201915081905092915050565b600061458c8285614142565b91506145988284614142565b91508190509392505050565b60006145af826144bb565b9150819050919050565b60006020820190506145ce6000830184613fd6565b92915050565b60006080820190506145e96000830187613fd6565b6145f66020830186613fd6565b6146036040830185614556565b818103606083015261461581846140d0565b905095945050505050565b60006040820190506146356000830186613fd6565b8181036020830152614648818486613ffc565b9050949350505050565b6000602082019050818103600083015261466c8184614054565b905092915050565b600060208201905061468960008301846140b2565b92915050565b60006020820190506146a460008301846140c1565b92915050565b600060208201905081810360008301526146c48184614109565b905092915050565b600060208201905081810360008301526146e581614173565b9050919050565b6000602082019050818103600083015261470581614196565b9050919050565b60006020820190508181036000830152614725816141b9565b9050919050565b60006020820190508181036000830152614745816141dc565b9050919050565b60006020820190508181036000830152614765816141ff565b9050919050565b6000602082019050818103600083015261478581614222565b9050919050565b600060208201905081810360008301526147a581614245565b9050919050565b600060208201905081810360008301526147c581614268565b9050919050565b600060208201905081810360008301526147e58161428b565b9050919050565b60006020820190508181036000830152614805816142ae565b9050919050565b60006020820190508181036000830152614825816142d1565b9050919050565b60006020820190508181036000830152614845816142f4565b9050919050565b6000602082019050818103600083015261486581614317565b9050919050565b600060208201905081810360008301526148858161433a565b9050919050565b600060208201905081810360008301526148a58161435d565b9050919050565b600060208201905081810360008301526148c581614380565b9050919050565b600060208201905081810360008301526148e5816143a3565b9050919050565b60006020820190508181036000830152614905816143c6565b9050919050565b60006020820190508181036000830152614925816143e9565b9050919050565b600060208201905081810360008301526149458161440c565b9050919050565b600060208201905081810360008301526149658161442f565b9050919050565b6000602082019050818103600083015261498581614452565b9050919050565b600060208201905081810360008301526149a581614475565b9050919050565b600060208201905081810360008301526149c581614498565b9050919050565b600060208201905081810360008301526149e5816144de565b9050919050565b60006020820190508181036000830152614a0581614501565b9050919050565b60006020820190508181036000830152614a2581614524565b9050919050565b6000602082019050614a416000830184614556565b92915050565b6000614a51614a62565b9050614a5d8282614d6d565b919050565b6000604051905090565b600067ffffffffffffffff821115614a8757614a86614ec9565b5b614a9082614ef8565b9050602081019050919050565b600067ffffffffffffffff821115614ab857614ab7614ec9565b5b614ac182614ef8565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b7182614cef565b9150614b7c83614cef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bb157614bb0614e3c565b5b828201905092915050565b6000614bc782614cef565b9150614bd283614cef565b925082614be257614be1614e6b565b5b828204905092915050565b6000614bf882614cef565b9150614c0383614cef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c3c57614c3b614e3c565b5b828202905092915050565b6000614c5282614cef565b9150614c5d83614cef565b925082821015614c7057614c6f614e3c565b5b828203905092915050565b6000614c8682614ccf565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d26578082015181840152602081019050614d0b565b83811115614d35576000848401525b50505050565b60006002820490506001821680614d5357607f821691505b60208210811415614d6757614d66614e9a565b5b50919050565b614d7682614ef8565b810181811067ffffffffffffffff82111715614d9557614d94614ec9565b5b80604052505050565b6000614da982614cef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ddc57614ddb614e3c565b5b600182019050919050565b6000614df282614df9565b9050919050565b6000614e0482614f09565b9050919050565b6000614e1682614cef565b9150614e2183614cef565b925082614e3157614e30614e6b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f7472616e73616374696f6e5f6661696c65640000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f7072655f73616c655f6e6f745f61637469766500000000000000000000000000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f756e617574686f72697a65645f73656e64657200000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f6e6f745f77686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d61785f6d696e745f636f756e745f6578636565646564000000000000000000600082015250565b7f73616c655f6e6f745f6163746976650000000000000000000000000000000000600082015250565b7f746f6b656e5f737570706c795f6e6f745f7a65726f0000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e745f7061796d656e745f76616c7565000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d61785f746f6b656e5f737570706c795f657863656564656400000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61558981614c7b565b811461559457600080fd5b50565b6155a081614c8d565b81146155ab57600080fd5b50565b6155b781614c99565b81146155c257600080fd5b50565b6155ce81614ca3565b81146155d957600080fd5b50565b6155e581614cef565b81146155f057600080fd5b5056fea26469706673582212203fb12c576d29de665e6d2759b4434f1093c513a60ddf087752ccd3eafc5a461b64736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000404b22bf14cebe0e80316f9de932f10feb9bde43c5458e243e1e2dc566c3e658ea0000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d66526f3745786b59513159444b7634586d52446242724b4c35526158345237727332396d5746477367776f4c3f00000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmfRo7ExkYQ1YDKv4XmRDbBrKL5RaX4R7rs29mWFGsgwoL?
Arg [1] : merkleRoot (bytes32): 0x4b22bf14cebe0e80316f9de932f10feb9bde43c5458e243e1e2dc566c3e658ea

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 4b22bf14cebe0e80316f9de932f10feb9bde43c5458e243e1e2dc566c3e658ea
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d66526f3745786b59513159444b7634586d52446242724b
Arg [4] : 4c35526158345237727332396d5746477367776f4c3f00000000000000000000


Deployed Bytecode Sourcemap

48114:5212:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36953:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22681:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24240:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23763:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37593:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48337:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48295:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24990:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37261:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48376:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25400:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37783:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51195:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50832:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48452:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22375:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22105:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47217:103;;;;;;;;;;;;;:::i;:::-;;51525:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51745:90;;;;;;;;;;;;;:::i;:::-;;51843:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51307:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46566:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51432:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22850:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49033:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24533:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48245:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25656:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52856:467;;;;;;;;;;;;;:::i;:::-;;52193:483;;;;;;;;;;;;;:::i;:::-;;23025:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52684:164;;;;;;;;;;;;;:::i;:::-;;51638:99;;;;;;;;;;;;;:::i;:::-;;48211:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48494:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50012:812;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49571:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48409:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24759:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47475:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36953:224;37055:4;37094:35;37079:50;;;:11;:50;;;;:90;;;;37133:36;37157:11;37133:23;:36::i;:::-;37079:90;37072:97;;36953:224;;;:::o;22681:100::-;22735:13;22768:5;22761:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22681:100;:::o;24240:221::-;24316:7;24344:16;24352:7;24344;:16::i;:::-;24336:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24429:15;:24;24445:7;24429:24;;;;;;;;;;;;;;;;;;;;;24422:31;;24240:221;;;:::o;23763:411::-;23844:13;23860:23;23875:7;23860:14;:23::i;:::-;23844:39;;23908:5;23902:11;;:2;:11;;;;23894:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24002:5;23986:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24011:37;24028:5;24035:12;:10;:12::i;:::-;24011:16;:37::i;:::-;23986:62;23964:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24145:21;24154:2;24158:7;24145:8;:21::i;:::-;23763:411;;;:::o;37593:113::-;37654:7;37681:10;:17;;;;37674:24;;37593:113;:::o;48337:32::-;;;;:::o;48295:35::-;;;;:::o;24990:339::-;25185:41;25204:12;:10;:12::i;:::-;25218:7;25185:18;:41::i;:::-;25177:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25293:28;25303:4;25309:2;25313:7;25293:9;:28::i;:::-;24990:339;;;:::o;37261:256::-;37358:7;37394:23;37411:5;37394:16;:23::i;:::-;37386:5;:31;37378:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37483:12;:19;37496:5;37483:19;;;;;;;;;;;;;;;:26;37503:5;37483:26;;;;;;;;;;;;37476:33;;37261:256;;;;:::o;48376:26::-;;;;:::o;25400:185::-;25538:39;25555:4;25561:2;25565:7;25538:39;;;;;;;;;;;;:16;:39::i;:::-;25400:185;;;:::o;37783:233::-;37858:7;37894:30;:28;:30::i;:::-;37886:5;:38;37878:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37991:10;38002:5;37991:17;;;;;;;;;;;;;;;;;;;;;;;;37984:24;;37783:233;;;:::o;51195:104::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51284:7:::1;51268:13;:23;;;;;;;;;;;;:::i;:::-;;51195:104:::0;:::o;50832:233::-;50924:4;50941:12;50983:4;50966:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;50956:33;;;;;;50941:48;;51007:50;51026:11;;51007:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51039:11;;51052:4;51007:18;:50::i;:::-;51000:57;;;50832:233;;;;;:::o;48452:33::-;;;;;;;;;;;;;:::o;22375:239::-;22447:7;22467:13;22483:7;:16;22491:7;22483:16;;;;;;;;;;;;;;;;;;;;;22467:32;;22535:1;22518:19;;:5;:19;;;;22510:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22601:5;22594:12;;;22375:239;;;:::o;22105:208::-;22177:7;22222:1;22205:19;;:5;:19;;;;22197:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22289:9;:16;22299:5;22289:16;;;;;;;;;;;;;;;;22282:23;;22105:208;;;:::o;47217:103::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47282:30:::1;47309:1;47282:18;:30::i;:::-;47217:103::o:0;51525:105::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51612:10:::1;51598:11;:24;;;;51525:105:::0;:::o;51745:90::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51814:13:::1;;;;;;;;;;;51813:14;51797:13;;:30;;;;;;;;;;;;;;;;;;51745:90::o:0;51843:342::-;51904:16;51933:18;51954:16;51964:5;51954:9;:16::i;:::-;51933:37;;51981:25;52023:10;52009:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51981:53;;52050:9;52045:107;52065:10;52061:1;:14;52045:107;;;52111:29;52131:5;52138:1;52111:19;:29::i;:::-;52097:8;52106:1;52097:11;;;;;;;;;;;;;;;;;;;;;:43;;;;;52077:3;;;;;:::i;:::-;;;;52045:107;;;;52169:8;52162:15;;;;51843:342;;;:::o;51307:117::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51403:13:::1;51386:14;:30;;;;51307:117:::0;:::o;46566:87::-;46612:7;46639:6;;;;;;;;;;;46632:13;;46566:87;:::o;51432:85::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51504:5:::1;51495:6;:14;;;;51432:85:::0;:::o;22850:104::-;22906:13;22939:7;22932:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22850:104;:::o;49033:530::-;49094:14;49111:13;:11;:13::i;:::-;49094:30;;49145:13;;;;;;;;;;;49137:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49231:2;49218:9;:15;;49210:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49321:10;;49308:9;49299:6;:18;;;;:::i;:::-;:32;;49291:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49404:9;49395:6;;:18;;;;:::i;:::-;49382:9;:31;;49374:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49465:9;49460:96;49480:9;49476:1;:13;49460:96;;;49511:33;49521:10;49542:1;49533:6;:10;;;;:::i;:::-;49511:9;:33::i;:::-;49491:3;;;;;:::i;:::-;;;;49460:96;;;;49033:530;;:::o;24533:155::-;24628:52;24647:12;:10;:12::i;:::-;24661:8;24671;24628:18;:52::i;:::-;24533:155;;:::o;48245:43::-;;;;:::o;25656:328::-;25831:41;25850:12;:10;:12::i;:::-;25864:7;25831:18;:41::i;:::-;25823:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25937:39;25951:4;25957:2;25961:7;25970:5;25937:13;:39::i;:::-;25656:328;;;;:::o;52856:467::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52910:15:::1;52928:21;52910:39;;52963:7;52984:2;;;;;;;;;;;52976:16;;53018:6;53010:5;53000:7;:15;;;;:::i;:::-;:24;;;;:::i;:::-;52976:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52962:67;;;53048:2;53040:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;53087:7;53108:2;;;;;;;;;;;53100:16;;53142:6;53134:5;53124:7;:15;;;;:::i;:::-;:24;;;;:::i;:::-;53100:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53086:67;;;53172:2;53164:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;53211:7;53232:2;;;;;;;;;;;53224:16;;53263:3;53258:2;53248:7;:12;;;;:::i;:::-;:18;;;;:::i;:::-;53224:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53210:61;;;53290:2;53282:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;46857:1;;;;52856:467::o:0;52193:483::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52277:1:::1;52260:13;:11;:13::i;:::-;:18;52252:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52322:9;52317:352;52337:2;52333:1;:6;52317:352;;;52369:2;52365:1;:6;52361:297;;;52392:16;52402:2;;;;;;;;;;;52406:1;52392:9;:16::i;:::-;52361:297;;;52451:2;52447:1;:6;52443:215;;;52474:16;52484:2;;;;;;;;;;;52488:1;52474:9;:16::i;:::-;52443:215;;;52533:2;52529:1;:6;52525:133;;;52556:16;52566:2;;;;;;;;;;;52570:1;52556:9;:16::i;:::-;52525:133;;;52626:16;52636:2;;;;;;;;;;;52640:1;52626:9;:16::i;:::-;52525:133;52443:215;52361:297;52341:3;;;;;:::i;:::-;;;;52317:352;;;;52193:483::o:0;23025:334::-;23098:13;23132:16;23140:7;23132;:16::i;:::-;23124:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23213:21;23237:10;:8;:10::i;:::-;23213:34;;23289:1;23271:7;23265:21;:25;:86;;;;;;;;;;;;;;;;;23317:7;23326:18;:7;:16;:18::i;:::-;23300:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23265:86;23258:93;;;23025:334;;;:::o;52684:164::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52746:7:::1;52767:2;;;;;;;;;;;52759:16;;52783:8;52759:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52745:51;;;52815:2;52807:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;46857:1;52684:164::o:0;51638:99::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51713:16:::1;;;;;;;;;;;51712:17;51693:16;;:36;;;;;;;;;;;;;;;;;;51638:99::o:0;48211:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48494:45::-;;;;;;;;;;;;;;;;;:::o;50012:812::-;50114:14;50131:13;:11;:13::i;:::-;50114:30;;50155:14;50172:10;:22;50183:10;50172:22;;;;;;;;;;;;;;;;50155:39;;50245:9;50228:14;;:26;;;;:::i;:::-;50215:9;:39;;50207:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;50311:4;:18;;;50330:10;50342:11;;50311:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50303:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50396:16;;;;;;;;;;;50388:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50507:1;50497:6;50485:9;:18;;;;:::i;:::-;:23;;50477:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50600:10;;50587:9;50578:6;:18;;;;:::i;:::-;:32;;50570:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;50672:9;50667:96;50687:9;50683:1;:13;50667:96;;;50718:33;50728:10;50749:1;50740:6;:10;;;;:::i;:::-;50718:9;:33::i;:::-;50698:3;;;;;:::i;:::-;;;;50667:96;;;;50810:6;50798:9;:18;;;;:::i;:::-;50773:10;:22;50784:10;50773:22;;;;;;;;;;;;;;;:43;;;;50012:812;;;;;:::o;49571:433::-;49648:14;49665:13;:11;:13::i;:::-;49648:30;;49689:9;49701:10;49689:22;;49737:2;;;;;;;;;;;49732:7;;:1;:7;;;:18;;;;49748:2;;;;;;;;;;;49743:7;;:1;:7;;;49732:18;:29;;;;49759:2;;;;;;;;;;;49754:7;;:1;:7;;;49732:29;:40;;;;49770:2;;;;;;;;;;;49765:7;;:1;:7;;;49732:40;49724:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49839:10;;49826:9;49817:6;:18;;;;:::i;:::-;:32;;49809:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;49907:9;49902:95;49922:9;49918:1;:13;49902:95;;;49953:32;49963:9;49983:1;49974:6;:10;;;;:::i;:::-;49953:9;:32::i;:::-;49933:3;;;;;:::i;:::-;;;;49902:95;;;;49571:433;;;;:::o;48409:36::-;;;;;;;;;;;;;:::o;24759:164::-;24856:4;24880:18;:25;24899:5;24880:25;;;;;;;;;;;;;;;:35;24906:8;24880:35;;;;;;;;;;;;;;;;;;;;;;;;;24873:42;;24759:164;;;;:::o;47475:201::-;46797:12;:10;:12::i;:::-;46786:23;;:7;:5;:7::i;:::-;:23;;;46778:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47584:1:::1;47564:22;;:8;:22;;;;47556:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47640:28;47659:8;47640:18;:28::i;:::-;47475:201:::0;:::o;21736:305::-;21838:4;21890:25;21875:40;;;:11;:40;;;;:105;;;;21947:33;21932:48;;;:11;:48;;;;21875:105;:158;;;;21997:36;22021:11;21997:23;:36::i;:::-;21875:158;21855:178;;21736:305;;;:::o;27494:127::-;27559:4;27611:1;27583:30;;:7;:16;27591:7;27583:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27576:37;;27494:127;;;:::o;16942:98::-;16995:7;17022:10;17015:17;;16942:98;:::o;31640:174::-;31742:2;31715:15;:24;31731:7;31715:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31798:7;31794:2;31760:46;;31769:23;31784:7;31769:14;:23::i;:::-;31760:46;;;;;;;;;;;;31640:174;;:::o;27788:348::-;27881:4;27906:16;27914:7;27906;:16::i;:::-;27898:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27982:13;27998:23;28013:7;27998:14;:23::i;:::-;27982:39;;28051:5;28040:16;;:7;:16;;;:51;;;;28084:7;28060:31;;:20;28072:7;28060:11;:20::i;:::-;:31;;;28040:51;:87;;;;28095:32;28112:5;28119:7;28095:16;:32::i;:::-;28040:87;28032:96;;;27788:348;;;;:::o;30897:625::-;31056:4;31029:31;;:23;31044:7;31029:14;:23::i;:::-;:31;;;31021:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31135:1;31121:16;;:2;:16;;;;31113:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31191:39;31212:4;31218:2;31222:7;31191:20;:39::i;:::-;31295:29;31312:1;31316:7;31295:8;:29::i;:::-;31356:1;31337:9;:15;31347:4;31337:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31385:1;31368:9;:13;31378:2;31368:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31416:2;31397:7;:16;31405:7;31397:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31455:7;31451:2;31436:27;;31445:4;31436:27;;;;;;;;;;;;31476:38;31496:4;31502:2;31506:7;31476:19;:38::i;:::-;30897:625;;;:::o;44032:190::-;44157:4;44210;44181:25;44194:5;44201:4;44181:12;:25::i;:::-;:33;44174:40;;44032:190;;;;;:::o;47836:191::-;47910:16;47929:6;;;;;;;;;;;47910:25;;47955:8;47946:6;;:17;;;;;;;;;;;;;;;;;;48010:8;47979:40;;48000:8;47979:40;;;;;;;;;;;;47836:191;;:::o;28478:110::-;28554:26;28564:2;28568:7;28554:26;;;;;;;;;;;;:9;:26::i;:::-;28478:110;;:::o;31956:315::-;32111:8;32102:17;;:5;:17;;;;32094:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32198:8;32160:18;:25;32179:5;32160:25;;;;;;;;;;;;;;;:35;32186:8;32160:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32244:8;32222:41;;32237:5;32222:41;;;32254:8;32222:41;;;;;;:::i;:::-;;;;;;;;31956:315;;;:::o;26866:::-;27023:28;27033:4;27039:2;27043:7;27023:9;:28::i;:::-;27070:48;27093:4;27099:2;27103:7;27112:5;27070:22;:48::i;:::-;27062:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26866:315;;;;:::o;51073:114::-;51133:13;51166;51159:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51073:114;:::o;17529:723::-;17585:13;17815:1;17806:5;:10;17802:53;;;17833:10;;;;;;;;;;;;;;;;;;;;;17802:53;17865:12;17880:5;17865:20;;17896:14;17921:78;17936:1;17928:4;:9;17921:78;;17954:8;;;;;:::i;:::-;;;;17985:2;17977:10;;;;;:::i;:::-;;;17921:78;;;18009:19;18041:6;18031:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18009:39;;18059:154;18075:1;18066:5;:10;18059:154;;18103:1;18093:11;;;;;:::i;:::-;;;18170:2;18162:5;:10;;;;:::i;:::-;18149:2;:24;;;;:::i;:::-;18136:39;;18119:6;18126;18119:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18199:2;18190:11;;;;;:::i;:::-;;;18059:154;;;18237:6;18223:21;;;;;17529:723;;;;:::o;20159:157::-;20244:4;20283:25;20268:40;;;:11;:40;;;;20261:47;;20159:157;;;:::o;38629:589::-;38773:45;38800:4;38806:2;38810:7;38773:26;:45::i;:::-;38851:1;38835:18;;:4;:18;;;38831:187;;;38870:40;38902:7;38870:31;:40::i;:::-;38831:187;;;38940:2;38932:10;;:4;:10;;;38928:90;;38959:47;38992:4;38998:7;38959:32;:47::i;:::-;38928:90;38831:187;39046:1;39032:16;;:2;:16;;;39028:183;;;39065:45;39102:7;39065:36;:45::i;:::-;39028:183;;;39138:4;39132:10;;:2;:10;;;39128:83;;39159:40;39187:2;39191:7;39159:27;:40::i;:::-;39128:83;39028:183;38629:589;;;:::o;34718:125::-;;;;:::o;44584:675::-;44667:7;44687:20;44710:4;44687:27;;44730:9;44725:497;44749:5;:12;44745:1;:16;44725:497;;;44783:20;44806:5;44812:1;44806:8;;;;;;;;;;;;;;;;;;;;;;44783:31;;44849:12;44833;:28;44829:382;;44976:42;44991:12;45005;44976:14;:42::i;:::-;44961:57;;44829:382;;;45153:42;45168:12;45182;45153:14;:42::i;:::-;45138:57;;44829:382;44725:497;44763:3;;;;;:::i;:::-;;;;44725:497;;;;45239:12;45232:19;;;44584:675;;;;:::o;28815:321::-;28945:18;28951:2;28955:7;28945:5;:18::i;:::-;28996:54;29027:1;29031:2;29035:7;29044:5;28996:22;:54::i;:::-;28974:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28815:321;;;:::o;32836:799::-;32991:4;33012:15;:2;:13;;;:15::i;:::-;33008:620;;;33064:2;33048:36;;;33085:12;:10;:12::i;:::-;33099:4;33105:7;33114:5;33048:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33044:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33307:1;33290:6;:13;:18;33286:272;;;33333:60;;;;;;;;;;:::i;:::-;;;;;;;;33286:272;33508:6;33502:13;33493:6;33489:2;33485:15;33478:38;33044:529;33181:41;;;33171:51;;;:6;:51;;;;33164:58;;;;;33008:620;33612:4;33605:11;;32836:799;;;;;;;:::o;34207:126::-;;;;:::o;39941:164::-;40045:10;:17;;;;40018:15;:24;40034:7;40018:24;;;;;;;;;;;:44;;;;40073:10;40089:7;40073:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39941:164;:::o;40732:988::-;40998:22;41048:1;41023:22;41040:4;41023:16;:22::i;:::-;:26;;;;:::i;:::-;40998:51;;41060:18;41081:17;:26;41099:7;41081:26;;;;;;;;;;;;41060:47;;41228:14;41214:10;:28;41210:328;;41259:19;41281:12;:18;41294:4;41281:18;;;;;;;;;;;;;;;:34;41300:14;41281:34;;;;;;;;;;;;41259:56;;41365:11;41332:12;:18;41345:4;41332:18;;;;;;;;;;;;;;;:30;41351:10;41332:30;;;;;;;;;;;:44;;;;41482:10;41449:17;:30;41467:11;41449:30;;;;;;;;;;;:43;;;;41210:328;;41634:17;:26;41652:7;41634:26;;;;;;;;;;;41627:33;;;41678:12;:18;41691:4;41678:18;;;;;;;;;;;;;;;:34;41697:14;41678:34;;;;;;;;;;;41671:41;;;40732:988;;;;:::o;42015:1079::-;42268:22;42313:1;42293:10;:17;;;;:21;;;;:::i;:::-;42268:46;;42325:18;42346:15;:24;42362:7;42346:24;;;;;;;;;;;;42325:45;;42697:19;42719:10;42730:14;42719:26;;;;;;;;;;;;;;;;;;;;;;;;42697:48;;42783:11;42758:10;42769;42758:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42894:10;42863:15;:28;42879:11;42863:28;;;;;;;;;;;:41;;;;43035:15;:24;43051:7;43035:24;;;;;;;;;;;43028:31;;;43070:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42015:1079;;;;:::o;39519:221::-;39604:14;39621:20;39638:2;39621:16;:20::i;:::-;39604:37;;39679:7;39652:12;:16;39665:2;39652:16;;;;;;;;;;;;;;;:24;39669:6;39652:24;;;;;;;;;;;:34;;;;39726:6;39697:17;:26;39715:7;39697:26;;;;;;;;;;;:35;;;;39519:221;;;:::o;45267:224::-;45335:13;45398:1;45392:4;45385:15;45427:1;45421:4;45414:15;45468:4;45462;45452:21;45443:30;;45370:114;;;;:::o;29472:439::-;29566:1;29552:16;;:2;:16;;;;29544:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29625:16;29633:7;29625;:16::i;:::-;29624:17;29616:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29687:45;29716:1;29720:2;29724:7;29687:20;:45::i;:::-;29762:1;29745:9;:13;29755:2;29745:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29793:2;29774:7;:16;29782:7;29774:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29838:7;29834:2;29813:33;;29830:1;29813:33;;;;;;;;;;;;29859:44;29887:1;29891:2;29895:7;29859:19;:44::i;:::-;29472:439;;:::o;8985:326::-;9045:4;9302:1;9280:7;:19;;;:23;9273:30;;8985:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;1435:5;1466:6;1460:13;1451:22;;1482:30;1506:5;1482:30;:::i;:::-;1441:77;;;;:::o;1524:139::-;1570:5;1608:6;1595:20;1586:29;;1624:33;1651:5;1624:33;:::i;:::-;1576:87;;;;:::o;1669:137::-;1714:5;1752:6;1739:20;1730:29;;1768:32;1794:5;1768:32;:::i;:::-;1720:86;;;;:::o;1812:141::-;1868:5;1899:6;1893:13;1884:22;;1915:32;1941:5;1915:32;:::i;:::-;1874:79;;;;:::o;1972:271::-;2027:5;2076:3;2069:4;2061:6;2057:17;2053:27;2043:2;;2094:1;2091;2084:12;2043:2;2134:6;2121:20;2159:78;2233:3;2225:6;2218:4;2210:6;2206:17;2159:78;:::i;:::-;2150:87;;2033:210;;;;;:::o;2263:273::-;2319:5;2368:3;2361:4;2353:6;2349:17;2345:27;2335:2;;2386:1;2383;2376:12;2335:2;2426:6;2413:20;2451:79;2526:3;2518:6;2511:4;2503:6;2499:17;2451:79;:::i;:::-;2442:88;;2325:211;;;;;:::o;2542:139::-;2588:5;2626:6;2613:20;2604:29;;2642:33;2669:5;2642:33;:::i;:::-;2594:87;;;;:::o;2687:262::-;2746:6;2795:2;2783:9;2774:7;2770:23;2766:32;2763:2;;;2811:1;2808;2801:12;2763:2;2854:1;2879:53;2924:7;2915:6;2904:9;2900:22;2879:53;:::i;:::-;2869:63;;2825:117;2753:196;;;;:::o;2955:407::-;3023:6;3031;3080:2;3068:9;3059:7;3055:23;3051:32;3048:2;;;3096:1;3093;3086:12;3048:2;3139:1;3164:53;3209:7;3200:6;3189:9;3185:22;3164:53;:::i;:::-;3154:63;;3110:117;3266:2;3292:53;3337:7;3328:6;3317:9;3313:22;3292:53;:::i;:::-;3282:63;;3237:118;3038:324;;;;;:::o;3368:552::-;3445:6;3453;3461;3510:2;3498:9;3489:7;3485:23;3481:32;3478:2;;;3526:1;3523;3516:12;3478:2;3569:1;3594:53;3639:7;3630:6;3619:9;3615:22;3594:53;:::i;:::-;3584:63;;3540:117;3696:2;3722:53;3767:7;3758:6;3747:9;3743:22;3722:53;:::i;:::-;3712:63;;3667:118;3824:2;3850:53;3895:7;3886:6;3875:9;3871:22;3850:53;:::i;:::-;3840:63;;3795:118;3468:452;;;;;:::o;3926:809::-;4021:6;4029;4037;4045;4094:3;4082:9;4073:7;4069:23;4065:33;4062:2;;;4111:1;4108;4101:12;4062:2;4154:1;4179:53;4224:7;4215:6;4204:9;4200:22;4179:53;:::i;:::-;4169:63;;4125:117;4281:2;4307:53;4352:7;4343:6;4332:9;4328:22;4307:53;:::i;:::-;4297:63;;4252:118;4409:2;4435:53;4480:7;4471:6;4460:9;4456:22;4435:53;:::i;:::-;4425:63;;4380:118;4565:2;4554:9;4550:18;4537:32;4596:18;4588:6;4585:30;4582:2;;;4628:1;4625;4618:12;4582:2;4656:62;4710:7;4701:6;4690:9;4686:22;4656:62;:::i;:::-;4646:72;;4508:220;4052:683;;;;;;;:::o;4741:570::-;4836:6;4844;4852;4901:2;4889:9;4880:7;4876:23;4872:32;4869:2;;;4917:1;4914;4907:12;4869:2;4960:1;4985:53;5030:7;5021:6;5010:9;5006:22;4985:53;:::i;:::-;4975:63;;4931:117;5115:2;5104:9;5100:18;5087:32;5146:18;5138:6;5135:30;5132:2;;;5178:1;5175;5168:12;5132:2;5214:80;5286:7;5277:6;5266:9;5262:22;5214:80;:::i;:::-;5196:98;;;;5058:246;4859:452;;;;;:::o;5317:401::-;5382:6;5390;5439:2;5427:9;5418:7;5414:23;5410:32;5407:2;;;5455:1;5452;5445:12;5407:2;5498:1;5523:53;5568:7;5559:6;5548:9;5544:22;5523:53;:::i;:::-;5513:63;;5469:117;5625:2;5651:50;5693:7;5684:6;5673:9;5669:22;5651:50;:::i;:::-;5641:60;;5596:115;5397:321;;;;;:::o;5724:407::-;5792:6;5800;5849:2;5837:9;5828:7;5824:23;5820:32;5817:2;;;5865:1;5862;5855:12;5817:2;5908:1;5933:53;5978:7;5969:6;5958:9;5954:22;5933:53;:::i;:::-;5923:63;;5879:117;6035:2;6061:53;6106:7;6097:6;6086:9;6082:22;6061:53;:::i;:::-;6051:63;;6006:118;5807:324;;;;;:::o;6137:278::-;6204:6;6253:2;6241:9;6232:7;6228:23;6224:32;6221:2;;;6269:1;6266;6259:12;6221:2;6312:1;6337:61;6390:7;6381:6;6370:9;6366:22;6337:61;:::i;:::-;6327:71;;6283:125;6211:204;;;;:::o;6421:262::-;6480:6;6529:2;6517:9;6508:7;6504:23;6500:32;6497:2;;;6545:1;6542;6535:12;6497:2;6588:1;6613:53;6658:7;6649:6;6638:9;6634:22;6613:53;:::i;:::-;6603:63;;6559:117;6487:196;;;;:::o;6689:260::-;6747:6;6796:2;6784:9;6775:7;6771:23;6767:32;6764:2;;;6812:1;6809;6802:12;6764:2;6855:1;6880:52;6924:7;6915:6;6904:9;6900:22;6880:52;:::i;:::-;6870:62;;6826:116;6754:195;;;;:::o;6955:282::-;7024:6;7073:2;7061:9;7052:7;7048:23;7044:32;7041:2;;;7089:1;7086;7079:12;7041:2;7132:1;7157:63;7212:7;7203:6;7192:9;7188:22;7157:63;:::i;:::-;7147:73;;7103:127;7031:206;;;;:::o;7243:375::-;7312:6;7361:2;7349:9;7340:7;7336:23;7332:32;7329:2;;;7377:1;7374;7367:12;7329:2;7448:1;7437:9;7433:17;7420:31;7478:18;7470:6;7467:30;7464:2;;;7510:1;7507;7500:12;7464:2;7538:63;7593:7;7584:6;7573:9;7569:22;7538:63;:::i;:::-;7528:73;;7391:220;7319:299;;;;:::o;7624:262::-;7683:6;7732:2;7720:9;7711:7;7707:23;7703:32;7700:2;;;7748:1;7745;7738:12;7700:2;7791:1;7816:53;7861:7;7852:6;7841:9;7837:22;7816:53;:::i;:::-;7806:63;;7762:117;7690:196;;;;:::o;7892:407::-;7960:6;7968;8017:2;8005:9;7996:7;7992:23;7988:32;7985:2;;;8033:1;8030;8023:12;7985:2;8076:1;8101:53;8146:7;8137:6;8126:9;8122:22;8101:53;:::i;:::-;8091:63;;8047:117;8203:2;8229:53;8274:7;8265:6;8254:9;8250:22;8229:53;:::i;:::-;8219:63;;8174:118;7975:324;;;;;:::o;8305:570::-;8400:6;8408;8416;8465:2;8453:9;8444:7;8440:23;8436:32;8433:2;;;8481:1;8478;8471:12;8433:2;8524:1;8549:53;8594:7;8585:6;8574:9;8570:22;8549:53;:::i;:::-;8539:63;;8495:117;8679:2;8668:9;8664:18;8651:32;8710:18;8702:6;8699:30;8696:2;;;8742:1;8739;8732:12;8696:2;8778:80;8850:7;8841:6;8830:9;8826:22;8778:80;:::i;:::-;8760:98;;;;8622:246;8423:452;;;;;:::o;8881:179::-;8950:10;8971:46;9013:3;9005:6;8971:46;:::i;:::-;9049:4;9044:3;9040:14;9026:28;;8961:99;;;;:::o;9066:118::-;9153:24;9171:5;9153:24;:::i;:::-;9148:3;9141:37;9131:53;;:::o;9190:157::-;9295:45;9315:24;9333:5;9315:24;:::i;:::-;9295:45;:::i;:::-;9290:3;9283:58;9273:74;;:::o;9383:470::-;9511:3;9532:86;9611:6;9606:3;9532:86;:::i;:::-;9525:93;;9642:66;9634:6;9631:78;9628:2;;;9722:1;9719;9712:12;9628:2;9757:4;9749:6;9745:17;9735:27;;9772:43;9808:6;9803:3;9796:5;9772:43;:::i;:::-;9840:6;9835:3;9831:16;9824:23;;9515:338;;;;;:::o;9889:732::-;10008:3;10037:54;10085:5;10037:54;:::i;:::-;10107:86;10186:6;10181:3;10107:86;:::i;:::-;10100:93;;10217:56;10267:5;10217:56;:::i;:::-;10296:7;10327:1;10312:284;10337:6;10334:1;10331:13;10312:284;;;10413:6;10407:13;10440:63;10499:3;10484:13;10440:63;:::i;:::-;10433:70;;10526:60;10579:6;10526:60;:::i;:::-;10516:70;;10372:224;10359:1;10356;10352:9;10347:14;;10312:284;;;10316:14;10612:3;10605:10;;10013:608;;;;;;;:::o;10627:109::-;10708:21;10723:5;10708:21;:::i;:::-;10703:3;10696:34;10686:50;;:::o;10742:118::-;10829:24;10847:5;10829:24;:::i;:::-;10824:3;10817:37;10807:53;;:::o;10866:360::-;10952:3;10980:38;11012:5;10980:38;:::i;:::-;11034:70;11097:6;11092:3;11034:70;:::i;:::-;11027:77;;11113:52;11158:6;11153:3;11146:4;11139:5;11135:16;11113:52;:::i;:::-;11190:29;11212:6;11190:29;:::i;:::-;11185:3;11181:39;11174:46;;10956:270;;;;;:::o;11232:364::-;11320:3;11348:39;11381:5;11348:39;:::i;:::-;11403:71;11467:6;11462:3;11403:71;:::i;:::-;11396:78;;11483:52;11528:6;11523:3;11516:4;11509:5;11505:16;11483:52;:::i;:::-;11560:29;11582:6;11560:29;:::i;:::-;11555:3;11551:39;11544:46;;11324:272;;;;;:::o;11602:377::-;11708:3;11736:39;11769:5;11736:39;:::i;:::-;11791:89;11873:6;11868:3;11791:89;:::i;:::-;11784:96;;11889:52;11934:6;11929:3;11922:4;11915:5;11911:16;11889:52;:::i;:::-;11966:6;11961:3;11957:16;11950:23;;11712:267;;;;;:::o;11985:366::-;12127:3;12148:67;12212:2;12207:3;12148:67;:::i;:::-;12141:74;;12224:93;12313:3;12224:93;:::i;:::-;12342:2;12337:3;12333:12;12326:19;;12131:220;;;:::o;12357:366::-;12499:3;12520:67;12584:2;12579:3;12520:67;:::i;:::-;12513:74;;12596:93;12685:3;12596:93;:::i;:::-;12714:2;12709:3;12705:12;12698:19;;12503:220;;;:::o;12729:366::-;12871:3;12892:67;12956:2;12951:3;12892:67;:::i;:::-;12885:74;;12968:93;13057:3;12968:93;:::i;:::-;13086:2;13081:3;13077:12;13070:19;;12875:220;;;:::o;13101:366::-;13243:3;13264:67;13328:2;13323:3;13264:67;:::i;:::-;13257:74;;13340:93;13429:3;13340:93;:::i;:::-;13458:2;13453:3;13449:12;13442:19;;13247:220;;;:::o;13473:366::-;13615:3;13636:67;13700:2;13695:3;13636:67;:::i;:::-;13629:74;;13712:93;13801:3;13712:93;:::i;:::-;13830:2;13825:3;13821:12;13814:19;;13619:220;;;:::o;13845:366::-;13987:3;14008:67;14072:2;14067:3;14008:67;:::i;:::-;14001:74;;14084:93;14173:3;14084:93;:::i;:::-;14202:2;14197:3;14193:12;14186:19;;13991:220;;;:::o;14217:366::-;14359:3;14380:67;14444:2;14439:3;14380:67;:::i;:::-;14373:74;;14456:93;14545:3;14456:93;:::i;:::-;14574:2;14569:3;14565:12;14558:19;;14363:220;;;:::o;14589:366::-;14731:3;14752:67;14816:2;14811:3;14752:67;:::i;:::-;14745:74;;14828:93;14917:3;14828:93;:::i;:::-;14946:2;14941:3;14937:12;14930:19;;14735:220;;;:::o;14961:366::-;15103:3;15124:67;15188:2;15183:3;15124:67;:::i;:::-;15117:74;;15200:93;15289:3;15200:93;:::i;:::-;15318:2;15313:3;15309:12;15302:19;;15107:220;;;:::o;15333:366::-;15475:3;15496:67;15560:2;15555:3;15496:67;:::i;:::-;15489:74;;15572:93;15661:3;15572:93;:::i;:::-;15690:2;15685:3;15681:12;15674:19;;15479:220;;;:::o;15705:366::-;15847:3;15868:67;15932:2;15927:3;15868:67;:::i;:::-;15861:74;;15944:93;16033:3;15944:93;:::i;:::-;16062:2;16057:3;16053:12;16046:19;;15851:220;;;:::o;16077:366::-;16219:3;16240:67;16304:2;16299:3;16240:67;:::i;:::-;16233:74;;16316:93;16405:3;16316:93;:::i;:::-;16434:2;16429:3;16425:12;16418:19;;16223:220;;;:::o;16449:366::-;16591:3;16612:67;16676:2;16671:3;16612:67;:::i;:::-;16605:74;;16688:93;16777:3;16688:93;:::i;:::-;16806:2;16801:3;16797:12;16790:19;;16595:220;;;:::o;16821:366::-;16963:3;16984:67;17048:2;17043:3;16984:67;:::i;:::-;16977:74;;17060:93;17149:3;17060:93;:::i;:::-;17178:2;17173:3;17169:12;17162:19;;16967:220;;;:::o;17193:366::-;17335:3;17356:67;17420:2;17415:3;17356:67;:::i;:::-;17349:74;;17432:93;17521:3;17432:93;:::i;:::-;17550:2;17545:3;17541:12;17534:19;;17339:220;;;:::o;17565:366::-;17707:3;17728:67;17792:2;17787:3;17728:67;:::i;:::-;17721:74;;17804:93;17893:3;17804:93;:::i;:::-;17922:2;17917:3;17913:12;17906:19;;17711:220;;;:::o;17937:366::-;18079:3;18100:67;18164:2;18159:3;18100:67;:::i;:::-;18093:74;;18176:93;18265:3;18176:93;:::i;:::-;18294:2;18289:3;18285:12;18278:19;;18083:220;;;:::o;18309:366::-;18451:3;18472:67;18536:2;18531:3;18472:67;:::i;:::-;18465:74;;18548:93;18637:3;18548:93;:::i;:::-;18666:2;18661:3;18657:12;18650:19;;18455:220;;;:::o;18681:366::-;18823:3;18844:67;18908:2;18903:3;18844:67;:::i;:::-;18837:74;;18920:93;19009:3;18920:93;:::i;:::-;19038:2;19033:3;19029:12;19022:19;;18827:220;;;:::o;19053:366::-;19195:3;19216:67;19280:2;19275:3;19216:67;:::i;:::-;19209:74;;19292:93;19381:3;19292:93;:::i;:::-;19410:2;19405:3;19401:12;19394:19;;19199:220;;;:::o;19425:366::-;19567:3;19588:67;19652:2;19647:3;19588:67;:::i;:::-;19581:74;;19664:93;19753:3;19664:93;:::i;:::-;19782:2;19777:3;19773:12;19766:19;;19571:220;;;:::o;19797:366::-;19939:3;19960:67;20024:2;20019:3;19960:67;:::i;:::-;19953:74;;20036:93;20125:3;20036:93;:::i;:::-;20154:2;20149:3;20145:12;20138:19;;19943:220;;;:::o;20169:366::-;20311:3;20332:67;20396:2;20391:3;20332:67;:::i;:::-;20325:74;;20408:93;20497:3;20408:93;:::i;:::-;20526:2;20521:3;20517:12;20510:19;;20315:220;;;:::o;20541:366::-;20683:3;20704:67;20768:2;20763:3;20704:67;:::i;:::-;20697:74;;20780:93;20869:3;20780:93;:::i;:::-;20898:2;20893:3;20889:12;20882:19;;20687:220;;;:::o;20913:398::-;21072:3;21093:83;21174:1;21169:3;21093:83;:::i;:::-;21086:90;;21185:93;21274:3;21185:93;:::i;:::-;21303:1;21298:3;21294:11;21287:18;;21076:235;;;:::o;21317:366::-;21459:3;21480:67;21544:2;21539:3;21480:67;:::i;:::-;21473:74;;21556:93;21645:3;21556:93;:::i;:::-;21674:2;21669:3;21665:12;21658:19;;21463:220;;;:::o;21689:366::-;21831:3;21852:67;21916:2;21911:3;21852:67;:::i;:::-;21845:74;;21928:93;22017:3;21928:93;:::i;:::-;22046:2;22041:3;22037:12;22030:19;;21835:220;;;:::o;22061:366::-;22203:3;22224:67;22288:2;22283:3;22224:67;:::i;:::-;22217:74;;22300:93;22389:3;22300:93;:::i;:::-;22418:2;22413:3;22409:12;22402:19;;22207:220;;;:::o;22433:108::-;22510:24;22528:5;22510:24;:::i;:::-;22505:3;22498:37;22488:53;;:::o;22547:118::-;22634:24;22652:5;22634:24;:::i;:::-;22629:3;22622:37;22612:53;;:::o;22671:256::-;22783:3;22798:75;22869:3;22860:6;22798:75;:::i;:::-;22898:2;22893:3;22889:12;22882:19;;22918:3;22911:10;;22787:140;;;;:::o;22933:435::-;23113:3;23135:95;23226:3;23217:6;23135:95;:::i;:::-;23128:102;;23247:95;23338:3;23329:6;23247:95;:::i;:::-;23240:102;;23359:3;23352:10;;23117:251;;;;;:::o;23374:379::-;23558:3;23580:147;23723:3;23580:147;:::i;:::-;23573:154;;23744:3;23737:10;;23562:191;;;:::o;23759:222::-;23852:4;23890:2;23879:9;23875:18;23867:26;;23903:71;23971:1;23960:9;23956:17;23947:6;23903:71;:::i;:::-;23857:124;;;;:::o;23987:640::-;24182:4;24220:3;24209:9;24205:19;24197:27;;24234:71;24302:1;24291:9;24287:17;24278:6;24234:71;:::i;:::-;24315:72;24383:2;24372:9;24368:18;24359:6;24315:72;:::i;:::-;24397;24465:2;24454:9;24450:18;24441:6;24397:72;:::i;:::-;24516:9;24510:4;24506:20;24501:2;24490:9;24486:18;24479:48;24544:76;24615:4;24606:6;24544:76;:::i;:::-;24536:84;;24187:440;;;;;;;:::o;24633:503::-;24814:4;24852:2;24841:9;24837:18;24829:26;;24865:71;24933:1;24922:9;24918:17;24909:6;24865:71;:::i;:::-;24983:9;24977:4;24973:20;24968:2;24957:9;24953:18;24946:48;25011:118;25124:4;25115:6;25107;25011:118;:::i;:::-;25003:126;;24819:317;;;;;;:::o;25142:373::-;25285:4;25323:2;25312:9;25308:18;25300:26;;25372:9;25366:4;25362:20;25358:1;25347:9;25343:17;25336:47;25400:108;25503:4;25494:6;25400:108;:::i;:::-;25392:116;;25290:225;;;;:::o;25521:210::-;25608:4;25646:2;25635:9;25631:18;25623:26;;25659:65;25721:1;25710:9;25706:17;25697:6;25659:65;:::i;:::-;25613:118;;;;:::o;25737:222::-;25830:4;25868:2;25857:9;25853:18;25845:26;;25881:71;25949:1;25938:9;25934:17;25925:6;25881:71;:::i;:::-;25835:124;;;;:::o;25965:313::-;26078:4;26116:2;26105:9;26101:18;26093:26;;26165:9;26159:4;26155:20;26151:1;26140:9;26136:17;26129:47;26193:78;26266:4;26257:6;26193:78;:::i;:::-;26185:86;;26083:195;;;;:::o;26284:419::-;26450:4;26488:2;26477:9;26473:18;26465:26;;26537:9;26531:4;26527:20;26523:1;26512:9;26508:17;26501:47;26565:131;26691:4;26565:131;:::i;:::-;26557:139;;26455:248;;;:::o;26709:419::-;26875:4;26913:2;26902:9;26898:18;26890:26;;26962:9;26956:4;26952:20;26948:1;26937:9;26933:17;26926:47;26990:131;27116:4;26990:131;:::i;:::-;26982:139;;26880:248;;;:::o;27134:419::-;27300:4;27338:2;27327:9;27323:18;27315:26;;27387:9;27381:4;27377:20;27373:1;27362:9;27358:17;27351:47;27415:131;27541:4;27415:131;:::i;:::-;27407:139;;27305:248;;;:::o;27559:419::-;27725:4;27763:2;27752:9;27748:18;27740:26;;27812:9;27806:4;27802:20;27798:1;27787:9;27783:17;27776:47;27840:131;27966:4;27840:131;:::i;:::-;27832:139;;27730:248;;;:::o;27984:419::-;28150:4;28188:2;28177:9;28173:18;28165:26;;28237:9;28231:4;28227:20;28223:1;28212:9;28208:17;28201:47;28265:131;28391:4;28265:131;:::i;:::-;28257:139;;28155:248;;;:::o;28409:419::-;28575:4;28613:2;28602:9;28598:18;28590:26;;28662:9;28656:4;28652:20;28648:1;28637:9;28633:17;28626:47;28690:131;28816:4;28690:131;:::i;:::-;28682:139;;28580:248;;;:::o;28834:419::-;29000:4;29038:2;29027:9;29023:18;29015:26;;29087:9;29081:4;29077:20;29073:1;29062:9;29058:17;29051:47;29115:131;29241:4;29115:131;:::i;:::-;29107:139;;29005:248;;;:::o;29259:419::-;29425:4;29463:2;29452:9;29448:18;29440:26;;29512:9;29506:4;29502:20;29498:1;29487:9;29483:17;29476:47;29540:131;29666:4;29540:131;:::i;:::-;29532:139;;29430:248;;;:::o;29684:419::-;29850:4;29888:2;29877:9;29873:18;29865:26;;29937:9;29931:4;29927:20;29923:1;29912:9;29908:17;29901:47;29965:131;30091:4;29965:131;:::i;:::-;29957:139;;29855:248;;;:::o;30109:419::-;30275:4;30313:2;30302:9;30298:18;30290:26;;30362:9;30356:4;30352:20;30348:1;30337:9;30333:17;30326:47;30390:131;30516:4;30390:131;:::i;:::-;30382:139;;30280:248;;;:::o;30534:419::-;30700:4;30738:2;30727:9;30723:18;30715:26;;30787:9;30781:4;30777:20;30773:1;30762:9;30758:17;30751:47;30815:131;30941:4;30815:131;:::i;:::-;30807:139;;30705:248;;;:::o;30959:419::-;31125:4;31163:2;31152:9;31148:18;31140:26;;31212:9;31206:4;31202:20;31198:1;31187:9;31183:17;31176:47;31240:131;31366:4;31240:131;:::i;:::-;31232:139;;31130:248;;;:::o;31384:419::-;31550:4;31588:2;31577:9;31573:18;31565:26;;31637:9;31631:4;31627:20;31623:1;31612:9;31608:17;31601:47;31665:131;31791:4;31665:131;:::i;:::-;31657:139;;31555:248;;;:::o;31809:419::-;31975:4;32013:2;32002:9;31998:18;31990:26;;32062:9;32056:4;32052:20;32048:1;32037:9;32033:17;32026:47;32090:131;32216:4;32090:131;:::i;:::-;32082:139;;31980:248;;;:::o;32234:419::-;32400:4;32438:2;32427:9;32423:18;32415:26;;32487:9;32481:4;32477:20;32473:1;32462:9;32458:17;32451:47;32515:131;32641:4;32515:131;:::i;:::-;32507:139;;32405:248;;;:::o;32659:419::-;32825:4;32863:2;32852:9;32848:18;32840:26;;32912:9;32906:4;32902:20;32898:1;32887:9;32883:17;32876:47;32940:131;33066:4;32940:131;:::i;:::-;32932:139;;32830:248;;;:::o;33084:419::-;33250:4;33288:2;33277:9;33273:18;33265:26;;33337:9;33331:4;33327:20;33323:1;33312:9;33308:17;33301:47;33365:131;33491:4;33365:131;:::i;:::-;33357:139;;33255:248;;;:::o;33509:419::-;33675:4;33713:2;33702:9;33698:18;33690:26;;33762:9;33756:4;33752:20;33748:1;33737:9;33733:17;33726:47;33790:131;33916:4;33790:131;:::i;:::-;33782:139;;33680:248;;;:::o;33934:419::-;34100:4;34138:2;34127:9;34123:18;34115:26;;34187:9;34181:4;34177:20;34173:1;34162:9;34158:17;34151:47;34215:131;34341:4;34215:131;:::i;:::-;34207:139;;34105:248;;;:::o;34359:419::-;34525:4;34563:2;34552:9;34548:18;34540:26;;34612:9;34606:4;34602:20;34598:1;34587:9;34583:17;34576:47;34640:131;34766:4;34640:131;:::i;:::-;34632:139;;34530:248;;;:::o;34784:419::-;34950:4;34988:2;34977:9;34973:18;34965:26;;35037:9;35031:4;35027:20;35023:1;35012:9;35008:17;35001:47;35065:131;35191:4;35065:131;:::i;:::-;35057:139;;34955:248;;;:::o;35209:419::-;35375:4;35413:2;35402:9;35398:18;35390:26;;35462:9;35456:4;35452:20;35448:1;35437:9;35433:17;35426:47;35490:131;35616:4;35490:131;:::i;:::-;35482:139;;35380:248;;;:::o;35634:419::-;35800:4;35838:2;35827:9;35823:18;35815:26;;35887:9;35881:4;35877:20;35873:1;35862:9;35858:17;35851:47;35915:131;36041:4;35915:131;:::i;:::-;35907:139;;35805:248;;;:::o;36059:419::-;36225:4;36263:2;36252:9;36248:18;36240:26;;36312:9;36306:4;36302:20;36298:1;36287:9;36283:17;36276:47;36340:131;36466:4;36340:131;:::i;:::-;36332:139;;36230:248;;;:::o;36484:419::-;36650:4;36688:2;36677:9;36673:18;36665:26;;36737:9;36731:4;36727:20;36723:1;36712:9;36708:17;36701:47;36765:131;36891:4;36765:131;:::i;:::-;36757:139;;36655:248;;;:::o;36909:419::-;37075:4;37113:2;37102:9;37098:18;37090:26;;37162:9;37156:4;37152:20;37148:1;37137:9;37133:17;37126:47;37190:131;37316:4;37190:131;:::i;:::-;37182:139;;37080:248;;;:::o;37334:419::-;37500:4;37538:2;37527:9;37523:18;37515:26;;37587:9;37581:4;37577:20;37573:1;37562:9;37558:17;37551:47;37615:131;37741:4;37615:131;:::i;:::-;37607:139;;37505:248;;;:::o;37759:222::-;37852:4;37890:2;37879:9;37875:18;37867:26;;37903:71;37971:1;37960:9;37956:17;37947:6;37903:71;:::i;:::-;37857:124;;;;:::o;37987:129::-;38021:6;38048:20;;:::i;:::-;38038:30;;38077:33;38105:4;38097:6;38077:33;:::i;:::-;38028:88;;;:::o;38122:75::-;38155:6;38188:2;38182:9;38172:19;;38162:35;:::o;38203:307::-;38264:4;38354:18;38346:6;38343:30;38340:2;;;38376:18;;:::i;:::-;38340:2;38414:29;38436:6;38414:29;:::i;:::-;38406:37;;38498:4;38492;38488:15;38480:23;;38269:241;;;:::o;38516:308::-;38578:4;38668:18;38660:6;38657:30;38654:2;;;38690:18;;:::i;:::-;38654:2;38728:29;38750:6;38728:29;:::i;:::-;38720:37;;38812:4;38806;38802:15;38794:23;;38583:241;;;:::o;38830:132::-;38897:4;38920:3;38912:11;;38950:4;38945:3;38941:14;38933:22;;38902:60;;;:::o;38968:114::-;39035:6;39069:5;39063:12;39053:22;;39042:40;;;:::o;39088:98::-;39139:6;39173:5;39167:12;39157:22;;39146:40;;;:::o;39192:99::-;39244:6;39278:5;39272:12;39262:22;;39251:40;;;:::o;39297:113::-;39367:4;39399;39394:3;39390:14;39382:22;;39372:38;;;:::o;39416:184::-;39515:11;39549:6;39544:3;39537:19;39589:4;39584:3;39580:14;39565:29;;39527:73;;;;:::o;39606:184::-;39705:11;39739:6;39734:3;39727:19;39779:4;39774:3;39770:14;39755:29;;39717:73;;;;:::o;39796:168::-;39879:11;39913:6;39908:3;39901:19;39953:4;39948:3;39944:14;39929:29;;39891:73;;;;:::o;39970:147::-;40071:11;40108:3;40093:18;;40083:34;;;;:::o;40123:169::-;40207:11;40241:6;40236:3;40229:19;40281:4;40276:3;40272:14;40257:29;;40219:73;;;;:::o;40298:148::-;40400:11;40437:3;40422:18;;40412:34;;;;:::o;40452:305::-;40492:3;40511:20;40529:1;40511:20;:::i;:::-;40506:25;;40545:20;40563:1;40545:20;:::i;:::-;40540:25;;40699:1;40631:66;40627:74;40624:1;40621:81;40618:2;;;40705:18;;:::i;:::-;40618:2;40749:1;40746;40742:9;40735:16;;40496:261;;;;:::o;40763:185::-;40803:1;40820:20;40838:1;40820:20;:::i;:::-;40815:25;;40854:20;40872:1;40854:20;:::i;:::-;40849:25;;40893:1;40883:2;;40898:18;;:::i;:::-;40883:2;40940:1;40937;40933:9;40928:14;;40805:143;;;;:::o;40954:348::-;40994:7;41017:20;41035:1;41017:20;:::i;:::-;41012:25;;41051:20;41069:1;41051:20;:::i;:::-;41046:25;;41239:1;41171:66;41167:74;41164:1;41161:81;41156:1;41149:9;41142:17;41138:105;41135:2;;;41246:18;;:::i;:::-;41135:2;41294:1;41291;41287:9;41276:20;;41002:300;;;;:::o;41308:191::-;41348:4;41368:20;41386:1;41368:20;:::i;:::-;41363:25;;41402:20;41420:1;41402:20;:::i;:::-;41397:25;;41441:1;41438;41435:8;41432:2;;;41446:18;;:::i;:::-;41432:2;41491:1;41488;41484:9;41476:17;;41353:146;;;;:::o;41505:96::-;41542:7;41571:24;41589:5;41571:24;:::i;:::-;41560:35;;41550:51;;;:::o;41607:90::-;41641:7;41684:5;41677:13;41670:21;41659:32;;41649:48;;;:::o;41703:77::-;41740:7;41769:5;41758:16;;41748:32;;;:::o;41786:149::-;41822:7;41862:66;41855:5;41851:78;41840:89;;41830:105;;;:::o;41941:126::-;41978:7;42018:42;42011:5;42007:54;41996:65;;41986:81;;;:::o;42073:77::-;42110:7;42139:5;42128:16;;42118:32;;;:::o;42156:154::-;42240:6;42235:3;42230;42217:30;42302:1;42293:6;42288:3;42284:16;42277:27;42207:103;;;:::o;42316:307::-;42384:1;42394:113;42408:6;42405:1;42402:13;42394:113;;;42493:1;42488:3;42484:11;42478:18;42474:1;42469:3;42465:11;42458:39;42430:2;42427:1;42423:10;42418:15;;42394:113;;;42525:6;42522:1;42519:13;42516:2;;;42605:1;42596:6;42591:3;42587:16;42580:27;42516:2;42365:258;;;;:::o;42629:320::-;42673:6;42710:1;42704:4;42700:12;42690:22;;42757:1;42751:4;42747:12;42778:18;42768:2;;42834:4;42826:6;42822:17;42812:27;;42768:2;42896;42888:6;42885:14;42865:18;42862:38;42859:2;;;42915:18;;:::i;:::-;42859:2;42680:269;;;;:::o;42955:281::-;43038:27;43060:4;43038:27;:::i;:::-;43030:6;43026:40;43168:6;43156:10;43153:22;43132:18;43120:10;43117:34;43114:62;43111:2;;;43179:18;;:::i;:::-;43111:2;43219:10;43215:2;43208:22;42998:238;;;:::o;43242:233::-;43281:3;43304:24;43322:5;43304:24;:::i;:::-;43295:33;;43350:66;43343:5;43340:77;43337:2;;;43420:18;;:::i;:::-;43337:2;43467:1;43460:5;43456:13;43449:20;;43285:190;;;:::o;43481:100::-;43520:7;43549:26;43569:5;43549:26;:::i;:::-;43538:37;;43528:53;;;:::o;43587:94::-;43626:7;43655:20;43669:5;43655:20;:::i;:::-;43644:31;;43634:47;;;:::o;43687:176::-;43719:1;43736:20;43754:1;43736:20;:::i;:::-;43731:25;;43770:20;43788:1;43770:20;:::i;:::-;43765:25;;43809:1;43799:2;;43814:18;;:::i;:::-;43799:2;43855:1;43852;43848:9;43843:14;;43721:142;;;;:::o;43869:180::-;43917:77;43914:1;43907:88;44014:4;44011:1;44004:15;44038:4;44035:1;44028:15;44055:180;44103:77;44100:1;44093:88;44200:4;44197:1;44190:15;44224:4;44221:1;44214:15;44241:180;44289:77;44286:1;44279:88;44386:4;44383:1;44376:15;44410:4;44407:1;44400:15;44427:180;44475:77;44472:1;44465:88;44572:4;44569:1;44562:15;44596:4;44593:1;44586:15;44613:102;44654:6;44705:2;44701:7;44696:2;44689:5;44685:14;44681:28;44671:38;;44661:54;;;:::o;44721:94::-;44754:8;44802:5;44798:2;44794:14;44773:35;;44763:52;;;:::o;44821:230::-;44961:34;44957:1;44949:6;44945:14;44938:58;45030:13;45025:2;45017:6;45013:15;45006:38;44927:124;:::o;45057:237::-;45197:34;45193:1;45185:6;45181:14;45174:58;45266:20;45261:2;45253:6;45249:15;45242:45;45163:131;:::o;45300:225::-;45440:34;45436:1;45428:6;45424:14;45417:58;45509:8;45504:2;45496:6;45492:15;45485:33;45406:119;:::o;45531:224::-;45671:34;45667:1;45659:6;45655:14;45648:58;45740:7;45735:2;45727:6;45723:15;45716:32;45637:118;:::o;45761:178::-;45901:30;45897:1;45889:6;45885:14;45878:54;45867:72;:::o;45945:168::-;46085:20;46081:1;46073:6;46069:14;46062:44;46051:62;:::o;46119:223::-;46259:34;46255:1;46247:6;46243:14;46236:58;46328:6;46323:2;46315:6;46311:15;46304:31;46225:117;:::o;46348:169::-;46488:21;46484:1;46476:6;46472:14;46465:45;46454:63;:::o;46523:175::-;46663:27;46659:1;46651:6;46647:14;46640:51;46629:69;:::o;46704:169::-;46844:21;46840:1;46832:6;46828:14;46821:45;46810:63;:::o;46879:231::-;47019:34;47015:1;47007:6;47003:14;46996:58;47088:14;47083:2;47075:6;47071:15;47064:39;46985:125;:::o;47116:243::-;47256:34;47252:1;47244:6;47240:14;47233:58;47325:26;47320:2;47312:6;47308:15;47301:51;47222:137;:::o;47365:165::-;47505:17;47501:1;47493:6;47489:14;47482:41;47471:59;:::o;47536:229::-;47676:34;47672:1;47664:6;47660:14;47653:58;47745:12;47740:2;47732:6;47728:15;47721:37;47642:123;:::o;47771:228::-;47911:34;47907:1;47899:6;47895:14;47888:58;47980:11;47975:2;47967:6;47963:15;47956:36;47877:122;:::o;48005:173::-;48145:25;48141:1;48133:6;48129:14;48122:49;48111:67;:::o;48184:165::-;48324:17;48320:1;48312:6;48308:14;48301:41;48290:59;:::o;48355:171::-;48495:23;48491:1;48483:6;48479:14;48472:47;48461:65;:::o;48532:182::-;48672:34;48668:1;48660:6;48656:14;48649:58;48638:76;:::o;48720:231::-;48860:34;48856:1;48848:6;48844:14;48837:58;48929:14;48924:2;48916:6;48912:15;48905:39;48826:125;:::o;48957:182::-;49097:34;49093:1;49085:6;49081:14;49074:58;49063:76;:::o;49145:234::-;49285:34;49281:1;49273:6;49269:14;49262:58;49354:17;49349:2;49341:6;49337:15;49330:42;49251:128;:::o;49385:220::-;49525:34;49521:1;49513:6;49509:14;49502:58;49594:3;49589:2;49581:6;49577:15;49570:28;49491:114;:::o;49611:176::-;49751:28;49747:1;49739:6;49735:14;49728:52;49717:70;:::o;49793:114::-;49899:8;:::o;49913:236::-;50053:34;50049:1;50041:6;50037:14;50030:58;50122:19;50117:2;50109:6;50105:15;50098:44;50019:130;:::o;50155:175::-;50295:27;50291:1;50283:6;50279:14;50272:51;50261:69;:::o;50336:231::-;50476:34;50472:1;50464:6;50460:14;50453:58;50545:14;50540:2;50532:6;50528:15;50521:39;50442:125;:::o;50573:122::-;50646:24;50664:5;50646:24;:::i;:::-;50639:5;50636:35;50626:2;;50685:1;50682;50675:12;50626:2;50616:79;:::o;50701:116::-;50771:21;50786:5;50771:21;:::i;:::-;50764:5;50761:32;50751:2;;50807:1;50804;50797:12;50751:2;50741:76;:::o;50823:122::-;50896:24;50914:5;50896:24;:::i;:::-;50889:5;50886:35;50876:2;;50935:1;50932;50925:12;50876:2;50866:79;:::o;50951:120::-;51023:23;51040:5;51023:23;:::i;:::-;51016:5;51013:34;51003:2;;51061:1;51058;51051:12;51003:2;50993:78;:::o;51077:122::-;51150:24;51168:5;51150:24;:::i;:::-;51143:5;51140:35;51130:2;;51189:1;51186;51179:12;51130:2;51120:79;:::o

Swarm Source

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