ETH Price: $3,178.04 (-8.16%)
Gas: 3 Gwei

Token

KOSMO Collector Pass (KCP)
 

Overview

Max Total Supply

139 KCP

Holders

60

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 KCP
0xbff411219284fc7f6e70bad2a70b5eeb6d882e75
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KOSMOCollectorPassNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity >=0.7.0 <0.9.0;

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

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

    /**
     * @dev 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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

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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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 overridden 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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 {}
}

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

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

// SPDX-License-Identifier: MIT

contract KOSMOCollectorPassNFT is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string public baseURI;
  uint256 public cost = 0.05 ether;
  uint256 public maxSupply = 5555;
  uint256 public maxMintAmount = 20;
  uint256 public nftPerAddressLimit = 50;
  bool public paused = false;
  bool public onlyWhitelisted = false;
  address[] public whitelistedAddresses;
  mapping(address => uint256) public addressMintedBalance;

  constructor(
    string memory _initBaseURI
  ) ERC721("KOSMO Collector Pass", "KCP") {
    setBaseURI(_initBaseURI);
  }

  // internaln
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  // public
  function mint(uint256 _mintAmount) public payable {
    require(!paused, "the contract is paused");
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    uint256 ownerMintedCount = addressMintedBalance[msg.sender];
    require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");

    if (msg.sender != owner()) {
      if (onlyWhitelisted == true) {
        require(isWhitelisted(msg.sender), "user is not whitelisted");
        require(supply + _mintAmount <= 1000, "First whitelist limit exceeded (1000)");
      }
      require(msg.value >= cost * _mintAmount, "insufficient funds");
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      addressMintedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }
  }

  function mintReserved(address to, uint8 amount) external onlyOwner {
    require(amount > 0, "No amount specified");
    uint256 supply = totalSupply();
    require(supply + amount <= maxSupply, "max NFT limit exceeded");
    
    for (uint256 i = 1; i <= amount; i++) {
      addressMintedBalance[to]++;
      _safeMint(to, supply + i);
    }
  }

  function isWhitelisted(address _user) public view returns (bool) {
    if (onlyWhitelisted == true) {
      for (uint i = 0; i < whitelistedAddresses.length; i++) {
        if (whitelistedAddresses[i] == _user) {
          return true;
        }
      }
    }
    return false;
  }

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

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

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

  //only owner
  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }

  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }

  function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
    setCost(4000000000000000000);
  }

  function endOnlyWhitelisted() public onlyOwner {
    onlyWhitelisted = false;
    setCost(50000000000000000);
  }

  function whitelistUsers(address[] calldata _users) public onlyOwner {
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }

  function withdraw() public payable onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405266b1a2bc2ec50000600c556115b3600d556014600e556032600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055503480156200006257600080fd5b506040516200564c3803806200564c833981810160405281019062000088919062000431565b6040518060400160405280601481526020017f4b4f534d4f20436f6c6c6563746f7220506173730000000000000000000000008152506040518060400160405280600381526020017f4b4350000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010c92919062000303565b5080600190805190602001906200012592919062000303565b505050620001486200013c6200016060201b60201c565b6200016860201b60201c565b62000159816200022e60201b60201c565b5062000689565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200023e6200016060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000264620002d960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b490620004a9565b60405180910390fd5b80600b9080519060200190620002d592919062000303565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003119062000571565b90600052602060002090601f01602090048101928262000335576000855562000381565b82601f106200035057805160ff191683800117855562000381565b8280016001018555821562000381579182015b828111156200038057825182559160200191906001019062000363565b5b50905062000390919062000394565b5090565b5b80821115620003af57600081600090555060010162000395565b5090565b6000620003ca620003c484620004f4565b620004cb565b905082815260208101848484011115620003e957620003e862000640565b5b620003f68482856200053b565b509392505050565b600082601f8301126200041657620004156200063b565b5b815162000428848260208601620003b3565b91505092915050565b6000602082840312156200044a57620004496200064a565b5b600082015167ffffffffffffffff8111156200046b576200046a62000645565b5b6200047984828501620003fe565b91505092915050565b6000620004916020836200052a565b91506200049e8262000660565b602082019050919050565b60006020820190508181036000830152620004c48162000482565b9050919050565b6000620004d7620004ea565b9050620004e58282620005a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156200051257620005116200060c565b5b6200051d826200064f565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200055b5780820151818401526020810190506200053e565b838111156200056b576000848401525b50505050565b600060028204905060018216806200058a57607f821691505b60208210811415620005a157620005a0620005dd565b5b50919050565b620005b2826200064f565b810181811067ffffffffffffffff82111715620005d457620005d36200060c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614fb380620006996000396000f3fe6080604052600436106102465760003560e01c80635c975abb11610139578063a0712d68116100b6578063c87b56dd1161007a578063c87b56dd14610872578063d0eb26b0146108af578063d5abeb01146108d8578063e985e9c514610903578063edec5f2714610940578063f2fde38b1461096957610246565b8063a0712d681461079c578063a22cb465146107b8578063b88d4fde146107e1578063ba4e5c491461080a578063ba7d2c761461084757610246565b80637f00c7a6116100fd5780637f00c7a6146106c95780638da5cb5b146106f25780638eb563961461071d57806395d89b41146107465780639c70b5121461077157610246565b80635c975abb146105e25780636352211e1461060d5780636c0360eb1461064a57806370a0823114610675578063715018a6146106b257610246565b806328fb1eff116101c757806342842e0e1161018b57806342842e0e146104ed578063438b63001461051657806344a0d68a146105535780634f6ccce71461057c57806355f804b3146105b957610246565b806328fb1eff146104295780632f745c59146104405780633af32abf1461047d5780633c952764146104ba5780633ccfd60b146104e357610246565b806313faede61161020e57806313faede61461034257806318160ddd1461036d57806318cae26914610398578063239c70ae146103d557806323b872dd1461040057610246565b806301ffc9a71461024b57806302329a291461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906138d5565b610992565b60405161027f9190613f90565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa91906138a8565b610a0c565b005b3480156102bd57600080fd5b506102c6610aa5565b6040516102d39190613fab565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613978565b610b37565b6040516103109190613f07565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906137db565b610bbc565b005b34801561034e57600080fd5b50610357610cd4565b604051610364919061432d565b60405180910390f35b34801561037957600080fd5b50610382610cda565b60405161038f919061432d565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613658565b610ce7565b6040516103cc919061432d565b60405180910390f35b3480156103e157600080fd5b506103ea610cff565b6040516103f7919061432d565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906136c5565b610d05565b005b34801561043557600080fd5b5061043e610d65565b005b34801561044c57600080fd5b50610467600480360381019061046291906137db565b610e0e565b604051610474919061432d565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f9190613658565b610eb3565b6040516104b19190613f90565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc91906138a8565b610f7c565b005b6104eb611026565b005b3480156104f957600080fd5b50610514600480360381019061050f91906136c5565b611122565b005b34801561052257600080fd5b5061053d60048036038101906105389190613658565b611142565b60405161054a9190613f6e565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613978565b6111f0565b005b34801561058857600080fd5b506105a3600480360381019061059e9190613978565b611276565b6040516105b0919061432d565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db919061392f565b6112e7565b005b3480156105ee57600080fd5b506105f761137d565b6040516106049190613f90565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613978565b611390565b6040516106419190613f07565b60405180910390f35b34801561065657600080fd5b5061065f611442565b60405161066c9190613fab565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613658565b6114d0565b6040516106a9919061432d565b60405180910390f35b3480156106be57600080fd5b506106c7611588565b005b3480156106d557600080fd5b506106f060048036038101906106eb9190613978565b611610565b005b3480156106fe57600080fd5b50610707611696565b6040516107149190613f07565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f919061381b565b6116c0565b005b34801561075257600080fd5b5061075b611875565b6040516107689190613fab565b60405180910390f35b34801561077d57600080fd5b50610786611907565b6040516107939190613f90565b60405180910390f35b6107b660048036038101906107b19190613978565b61191a565b005b3480156107c457600080fd5b506107df60048036038101906107da919061379b565b611cb3565b005b3480156107ed57600080fd5b5061080860048036038101906108039190613718565b611cc9565b005b34801561081657600080fd5b50610831600480360381019061082c9190613978565b611d2b565b60405161083e9190613f07565b60405180910390f35b34801561085357600080fd5b5061085c611d6a565b604051610869919061432d565b60405180910390f35b34801561087e57600080fd5b5061089960048036038101906108949190613978565b611d70565b6040516108a69190613fab565b60405180910390f35b3480156108bb57600080fd5b506108d660048036038101906108d19190613978565b611e17565b005b3480156108e457600080fd5b506108ed611e9d565b6040516108fa919061432d565b60405180910390f35b34801561090f57600080fd5b5061092a60048036038101906109259190613685565b611ea3565b6040516109379190613f90565b60405180910390f35b34801561094c57600080fd5b506109676004803603810190610962919061385b565b611f37565b005b34801561097557600080fd5b50610990600480360381019061098b9190613658565b611fd7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a055750610a04826120cf565b5b9050919050565b610a146121b1565b73ffffffffffffffffffffffffffffffffffffffff16610a32611696565b73ffffffffffffffffffffffffffffffffffffffff1614610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906141cd565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060008054610ab49061462e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae09061462e565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b6000610b42826121b9565b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b78906141ad565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bc782611390565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f9061422d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c576121b1565b73ffffffffffffffffffffffffffffffffffffffff161480610c865750610c8581610c806121b1565b611ea3565b5b610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc906140ed565b60405180910390fd5b610ccf8383612225565b505050565b600c5481565b6000600880549050905090565b60126020528060005260406000206000915090505481565b600e5481565b610d16610d106121b1565b826122de565b610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c9061428d565b60405180910390fd5b610d608383836123bc565b505050565b610d6d6121b1565b73ffffffffffffffffffffffffffffffffffffffff16610d8b611696565b73ffffffffffffffffffffffffffffffffffffffff1614610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd8906141cd565b60405180910390fd5b6000601060016101000a81548160ff021916908315150217905550610e0c66b1a2bc2ec500006111f0565b565b6000610e19836114d0565b8210610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5190613fcd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600060011515601060019054906101000a900460ff1615151415610f725760005b601180549050811015610f70578273ffffffffffffffffffffffffffffffffffffffff1660118281548110610f0c57610f0b6147c7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f5d576001915050610f77565b8080610f6890614691565b915050610ed4565b505b600090505b919050565b610f846121b1565b73ffffffffffffffffffffffffffffffffffffffff16610fa2611696565b73ffffffffffffffffffffffffffffffffffffffff1614610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef906141cd565b60405180910390fd5b80601060016101000a81548160ff021916908315150217905550611023673782dace9d9000006111f0565b50565b61102e6121b1565b73ffffffffffffffffffffffffffffffffffffffff1661104c611696565b73ffffffffffffffffffffffffffffffffffffffff16146110a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611099906141cd565b60405180910390fd5b60006110ac611696565b73ffffffffffffffffffffffffffffffffffffffff16476040516110cf90613ef2565b60006040518083038185875af1925050503d806000811461110c576040519150601f19603f3d011682016040523d82523d6000602084013e611111565b606091505b505090508061111f57600080fd5b50565b61113d83838360405180602001604052806000815250611cc9565b505050565b6060600061114f836114d0565b905060008167ffffffffffffffff81111561116d5761116c6147f6565b5b60405190808252806020026020018201604052801561119b5781602001602082028036833780820191505090505b50905060005b828110156111e5576111b38582610e0e565b8282815181106111c6576111c56147c7565b5b60200260200101818152505080806111dd90614691565b9150506111a1565b508092505050919050565b6111f86121b1565b73ffffffffffffffffffffffffffffffffffffffff16611216611696565b73ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611263906141cd565b60405180910390fd5b80600c8190555050565b6000611280610cda565b82106112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b8906142ad565b60405180910390fd5b600882815481106112d5576112d46147c7565b5b90600052602060002001549050919050565b6112ef6121b1565b73ffffffffffffffffffffffffffffffffffffffff1661130d611696565b73ffffffffffffffffffffffffffffffffffffffff1614611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a906141cd565b60405180910390fd5b80600b9080519060200190611379929190613340565b5050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114309061412d565b60405180910390fd5b80915050919050565b600b805461144f9061462e565b80601f016020809104026020016040519081016040528092919081815260200182805461147b9061462e565b80156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115389061410d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115906121b1565b73ffffffffffffffffffffffffffffffffffffffff166115ae611696565b73ffffffffffffffffffffffffffffffffffffffff1614611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb906141cd565b60405180910390fd5b61160e6000612623565b565b6116186121b1565b73ffffffffffffffffffffffffffffffffffffffff16611636611696565b73ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906141cd565b60405180910390fd5b80600e8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116c86121b1565b73ffffffffffffffffffffffffffffffffffffffff166116e6611696565b73ffffffffffffffffffffffffffffffffffffffff161461173c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611733906141cd565b60405180910390fd5b60008160ff1611611782576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117799061424d565b60405180910390fd5b600061178c610cda565b9050600d548260ff16826117a09190614456565b11156117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d89061414d565b60405180910390fd5b6000600190505b8260ff16811161186f57601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061184290614691565b919050555061185c8482846118579190614456565b6126e9565b808061186790614691565b9150506117e8565b50505050565b6060600180546118849061462e565b80601f01602080910402602001604051908101604052809291908181526020018280546118b09061462e565b80156118fd5780601f106118d2576101008083540402835291602001916118fd565b820191906000526020600020905b8154815290600101906020018083116118e057829003601f168201915b5050505050905090565b601060019054906101000a900460ff1681565b601060009054906101000a900460ff161561196a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611961906141ed565b60405180910390fd5b6000611974610cda565b9050600082116119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b09061430d565b60405180910390fd5b600e548211156119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f59061416d565b60405180910390fd5b600d548282611a0d9190614456565b1115611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a459061414d565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548382611aa19190614456565b1115611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad99061406d565b60405180910390fd5b611aea611696565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c225760011515601060019054906101000a900460ff1615151415611bd157611b4133610eb3565b611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b77906142ed565b60405180910390fd5b6103e88383611b8f9190614456565b1115611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906142cd565b60405180910390fd5b5b82600c54611bdf91906144dd565b341015611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c189061426d565b60405180910390fd5b5b6000600190505b838111611cad57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611c8090614691565b9190505550611c9a338285611c959190614456565b6126e9565b8080611ca590614691565b915050611c29565b50505050565b611cc5611cbe6121b1565b8383612707565b5050565b611cda611cd46121b1565b836122de565b611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d109061428d565b60405180910390fd5b611d2584848484612874565b50505050565b60118181548110611d3b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6060611d7b826121b9565b611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db19061420d565b60405180910390fd5b6000611dc46128d0565b90506000815111611de45760405180602001604052806000815250611e0f565b80611dee84612962565b604051602001611dff929190613ece565b6040516020818303038152906040525b915050919050565b611e1f6121b1565b73ffffffffffffffffffffffffffffffffffffffff16611e3d611696565b73ffffffffffffffffffffffffffffffffffffffff1614611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a906141cd565b60405180910390fd5b80600f8190555050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f3f6121b1565b73ffffffffffffffffffffffffffffffffffffffff16611f5d611696565b73ffffffffffffffffffffffffffffffffffffffff1614611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa906141cd565b60405180910390fd5b60116000611fc191906133c6565b818160119190611fd29291906133e7565b505050565b611fdf6121b1565b73ffffffffffffffffffffffffffffffffffffffff16611ffd611696565b73ffffffffffffffffffffffffffffffffffffffff1614612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906141cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba9061400d565b60405180910390fd5b6120cc81612623565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121aa57506121a982612ac3565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661229883611390565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122e9826121b9565b612328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231f906140cd565b60405180910390fd5b600061233383611390565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061237557506123748185611ea3565b5b806123b357508373ffffffffffffffffffffffffffffffffffffffff1661239b84610b37565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123dc82611390565b73ffffffffffffffffffffffffffffffffffffffff1614612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061402d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124999061408d565b60405180910390fd5b6124ad838383612b2d565b6124b8600082612225565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125089190614537565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461255f9190614456565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261e838383612c41565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612703828260405180602001604052806000815250612c46565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d906140ad565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128679190613f90565b60405180910390a3505050565b61287f8484846123bc565b61288b84848484612ca1565b6128ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c190613fed565b60405180910390fd5b50505050565b6060600b80546128df9061462e565b80601f016020809104026020016040519081016040528092919081815260200182805461290b9061462e565b80156129585780601f1061292d57610100808354040283529160200191612958565b820191906000526020600020905b81548152906001019060200180831161293b57829003601f168201915b5050505050905090565b606060008214156129aa576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612abe565b600082905060005b600082146129dc5780806129c590614691565b915050600a826129d591906144ac565b91506129b2565b60008167ffffffffffffffff8111156129f8576129f76147f6565b5b6040519080825280601f01601f191660200182016040528015612a2a5781602001600182028036833780820191505090505b5090505b60008514612ab757600182612a439190614537565b9150600a85612a5291906146da565b6030612a5e9190614456565b60f81b818381518110612a7457612a736147c7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ab091906144ac565b9450612a2e565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b38838383612e38565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7b57612b7681612e3d565b612bba565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bb957612bb88382612e86565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bfd57612bf881612ff3565b612c3c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3b57612c3a82826130c4565b5b5b505050565b505050565b612c508383613143565b612c5d6000848484612ca1565b612c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9390613fed565b60405180910390fd5b505050565b6000612cc28473ffffffffffffffffffffffffffffffffffffffff1661331d565b15612e2b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ceb6121b1565b8786866040518563ffffffff1660e01b8152600401612d0d9493929190613f22565b602060405180830381600087803b158015612d2757600080fd5b505af1925050508015612d5857506040513d601f19601f82011682018060405250810190612d559190613902565b60015b612ddb573d8060008114612d88576040519150601f19603f3d011682016040523d82523d6000602084013e612d8d565b606091505b50600081511415612dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dca90613fed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e30565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e93846114d0565b612e9d9190614537565b9050600060076000848152602001908152602001600020549050818114612f82576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130079190614537565b9050600060096000848152602001908152602001600020549050600060088381548110613037576130366147c7565b5b906000526020600020015490508060088381548110613059576130586147c7565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130a8576130a7614798565b5b6001900381819060005260206000200160009055905550505050565b60006130cf836114d0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131aa9061418d565b60405180910390fd5b6131bc816121b9565b156131fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f39061404d565b60405180910390fd5b61320860008383612b2d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132589190614456565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461331960008383612c41565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461334c9061462e565b90600052602060002090601f01602090048101928261336e57600085556133b5565b82601f1061338757805160ff19168380011785556133b5565b828001600101855582156133b5579182015b828111156133b4578251825591602001919060010190613399565b5b5090506133c29190613487565b5090565b50805460008255906000526020600020908101906133e49190613487565b50565b828054828255906000526020600020908101928215613476579160200282015b8281111561347557823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613407565b5b5090506134839190613487565b5090565b5b808211156134a0576000816000905550600101613488565b5090565b60006134b76134b28461436d565b614348565b9050828152602081018484840111156134d3576134d2614834565b5b6134de8482856145ec565b509392505050565b60006134f96134f48461439e565b614348565b90508281526020810184848401111561351557613514614834565b5b6135208482856145ec565b509392505050565b60008135905061353781614f0a565b92915050565b60008083601f8401126135535761355261482a565b5b8235905067ffffffffffffffff8111156135705761356f614825565b5b60208301915083602082028301111561358c5761358b61482f565b5b9250929050565b6000813590506135a281614f21565b92915050565b6000813590506135b781614f38565b92915050565b6000815190506135cc81614f38565b92915050565b600082601f8301126135e7576135e661482a565b5b81356135f78482602086016134a4565b91505092915050565b600082601f8301126136155761361461482a565b5b81356136258482602086016134e6565b91505092915050565b60008135905061363d81614f4f565b92915050565b60008135905061365281614f66565b92915050565b60006020828403121561366e5761366d61483e565b5b600061367c84828501613528565b91505092915050565b6000806040838503121561369c5761369b61483e565b5b60006136aa85828601613528565b92505060206136bb85828601613528565b9150509250929050565b6000806000606084860312156136de576136dd61483e565b5b60006136ec86828701613528565b93505060206136fd86828701613528565b925050604061370e8682870161362e565b9150509250925092565b600080600080608085870312156137325761373161483e565b5b600061374087828801613528565b945050602061375187828801613528565b93505060406137628782880161362e565b925050606085013567ffffffffffffffff81111561378357613782614839565b5b61378f878288016135d2565b91505092959194509250565b600080604083850312156137b2576137b161483e565b5b60006137c085828601613528565b92505060206137d185828601613593565b9150509250929050565b600080604083850312156137f2576137f161483e565b5b600061380085828601613528565b92505060206138118582860161362e565b9150509250929050565b600080604083850312156138325761383161483e565b5b600061384085828601613528565b925050602061385185828601613643565b9150509250929050565b600080602083850312156138725761387161483e565b5b600083013567ffffffffffffffff8111156138905761388f614839565b5b61389c8582860161353d565b92509250509250929050565b6000602082840312156138be576138bd61483e565b5b60006138cc84828501613593565b91505092915050565b6000602082840312156138eb576138ea61483e565b5b60006138f9848285016135a8565b91505092915050565b6000602082840312156139185761391761483e565b5b6000613926848285016135bd565b91505092915050565b6000602082840312156139455761394461483e565b5b600082013567ffffffffffffffff81111561396357613962614839565b5b61396f84828501613600565b91505092915050565b60006020828403121561398e5761398d61483e565b5b600061399c8482850161362e565b91505092915050565b60006139b18383613eb0565b60208301905092915050565b6139c68161456b565b82525050565b60006139d7826143df565b6139e1818561440d565b93506139ec836143cf565b8060005b83811015613a1d578151613a0488826139a5565b9750613a0f83614400565b9250506001810190506139f0565b5085935050505092915050565b613a338161457d565b82525050565b6000613a44826143ea565b613a4e818561441e565b9350613a5e8185602086016145fb565b613a6781614843565b840191505092915050565b6000613a7d826143f5565b613a87818561443a565b9350613a978185602086016145fb565b613aa081614843565b840191505092915050565b6000613ab6826143f5565b613ac0818561444b565b9350613ad08185602086016145fb565b80840191505092915050565b6000613ae9602b8361443a565b9150613af482614854565b604082019050919050565b6000613b0c60328361443a565b9150613b17826148a3565b604082019050919050565b6000613b2f60268361443a565b9150613b3a826148f2565b604082019050919050565b6000613b5260258361443a565b9150613b5d82614941565b604082019050919050565b6000613b75601c8361443a565b9150613b8082614990565b602082019050919050565b6000613b98601c8361443a565b9150613ba3826149b9565b602082019050919050565b6000613bbb60248361443a565b9150613bc6826149e2565b604082019050919050565b6000613bde60198361443a565b9150613be982614a31565b602082019050919050565b6000613c01602c8361443a565b9150613c0c82614a5a565b604082019050919050565b6000613c2460388361443a565b9150613c2f82614aa9565b604082019050919050565b6000613c47602a8361443a565b9150613c5282614af8565b604082019050919050565b6000613c6a60298361443a565b9150613c7582614b47565b604082019050919050565b6000613c8d60168361443a565b9150613c9882614b96565b602082019050919050565b6000613cb060248361443a565b9150613cbb82614bbf565b604082019050919050565b6000613cd360208361443a565b9150613cde82614c0e565b602082019050919050565b6000613cf6602c8361443a565b9150613d0182614c37565b604082019050919050565b6000613d1960208361443a565b9150613d2482614c86565b602082019050919050565b6000613d3c60168361443a565b9150613d4782614caf565b602082019050919050565b6000613d5f602f8361443a565b9150613d6a82614cd8565b604082019050919050565b6000613d8260218361443a565b9150613d8d82614d27565b604082019050919050565b6000613da560138361443a565b9150613db082614d76565b602082019050919050565b6000613dc860008361442f565b9150613dd382614d9f565b600082019050919050565b6000613deb60128361443a565b9150613df682614da2565b602082019050919050565b6000613e0e60318361443a565b9150613e1982614dcb565b604082019050919050565b6000613e31602c8361443a565b9150613e3c82614e1a565b604082019050919050565b6000613e5460258361443a565b9150613e5f82614e69565b604082019050919050565b6000613e7760178361443a565b9150613e8282614eb8565b602082019050919050565b6000613e9a601b8361443a565b9150613ea582614ee1565b602082019050919050565b613eb9816145d5565b82525050565b613ec8816145d5565b82525050565b6000613eda8285613aab565b9150613ee68284613aab565b91508190509392505050565b6000613efd82613dbb565b9150819050919050565b6000602082019050613f1c60008301846139bd565b92915050565b6000608082019050613f3760008301876139bd565b613f4460208301866139bd565b613f516040830185613ebf565b8181036060830152613f638184613a39565b905095945050505050565b60006020820190508181036000830152613f8881846139cc565b905092915050565b6000602082019050613fa56000830184613a2a565b92915050565b60006020820190508181036000830152613fc58184613a72565b905092915050565b60006020820190508181036000830152613fe681613adc565b9050919050565b6000602082019050818103600083015261400681613aff565b9050919050565b6000602082019050818103600083015261402681613b22565b9050919050565b6000602082019050818103600083015261404681613b45565b9050919050565b6000602082019050818103600083015261406681613b68565b9050919050565b6000602082019050818103600083015261408681613b8b565b9050919050565b600060208201905081810360008301526140a681613bae565b9050919050565b600060208201905081810360008301526140c681613bd1565b9050919050565b600060208201905081810360008301526140e681613bf4565b9050919050565b6000602082019050818103600083015261410681613c17565b9050919050565b6000602082019050818103600083015261412681613c3a565b9050919050565b6000602082019050818103600083015261414681613c5d565b9050919050565b6000602082019050818103600083015261416681613c80565b9050919050565b6000602082019050818103600083015261418681613ca3565b9050919050565b600060208201905081810360008301526141a681613cc6565b9050919050565b600060208201905081810360008301526141c681613ce9565b9050919050565b600060208201905081810360008301526141e681613d0c565b9050919050565b6000602082019050818103600083015261420681613d2f565b9050919050565b6000602082019050818103600083015261422681613d52565b9050919050565b6000602082019050818103600083015261424681613d75565b9050919050565b6000602082019050818103600083015261426681613d98565b9050919050565b6000602082019050818103600083015261428681613dde565b9050919050565b600060208201905081810360008301526142a681613e01565b9050919050565b600060208201905081810360008301526142c681613e24565b9050919050565b600060208201905081810360008301526142e681613e47565b9050919050565b6000602082019050818103600083015261430681613e6a565b9050919050565b6000602082019050818103600083015261432681613e8d565b9050919050565b60006020820190506143426000830184613ebf565b92915050565b6000614352614363565b905061435e8282614660565b919050565b6000604051905090565b600067ffffffffffffffff821115614388576143876147f6565b5b61439182614843565b9050602081019050919050565b600067ffffffffffffffff8211156143b9576143b86147f6565b5b6143c282614843565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614461826145d5565b915061446c836145d5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144a1576144a061470b565b5b828201905092915050565b60006144b7826145d5565b91506144c2836145d5565b9250826144d2576144d161473a565b5b828204905092915050565b60006144e8826145d5565b91506144f3836145d5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561452c5761452b61470b565b5b828202905092915050565b6000614542826145d5565b915061454d836145d5565b9250828210156145605761455f61470b565b5b828203905092915050565b6000614576826145b5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156146195780820151818401526020810190506145fe565b83811115614628576000848401525b50505050565b6000600282049050600182168061464657607f821691505b6020821081141561465a57614659614769565b5b50919050565b61466982614843565b810181811067ffffffffffffffff82111715614688576146876147f6565b5b80604052505050565b600061469c826145d5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146cf576146ce61470b565b5b600182019050919050565b60006146e5826145d5565b91506146f0836145d5565b925082614700576146ff61473a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20616d6f756e742073706563696669656400000000000000000000000000600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f46697273742077686974656c697374206c696d6974206578636565646564202860008201527f3130303029000000000000000000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b614f138161456b565b8114614f1e57600080fd5b50565b614f2a8161457d565b8114614f3557600080fd5b50565b614f4181614589565b8114614f4c57600080fd5b50565b614f58816145d5565b8114614f6357600080fd5b50565b614f6f816145df565b8114614f7a57600080fd5b5056fea2646970667358221220bc2c129ca12ba708ec52539ee5f62770779810068d67e3d10b9db265b5a8e27c64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d65636e4b637748536a583156474455677845654b59577a6a666b6963764d6536446a764636586641446d42772f00000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c80635c975abb11610139578063a0712d68116100b6578063c87b56dd1161007a578063c87b56dd14610872578063d0eb26b0146108af578063d5abeb01146108d8578063e985e9c514610903578063edec5f2714610940578063f2fde38b1461096957610246565b8063a0712d681461079c578063a22cb465146107b8578063b88d4fde146107e1578063ba4e5c491461080a578063ba7d2c761461084757610246565b80637f00c7a6116100fd5780637f00c7a6146106c95780638da5cb5b146106f25780638eb563961461071d57806395d89b41146107465780639c70b5121461077157610246565b80635c975abb146105e25780636352211e1461060d5780636c0360eb1461064a57806370a0823114610675578063715018a6146106b257610246565b806328fb1eff116101c757806342842e0e1161018b57806342842e0e146104ed578063438b63001461051657806344a0d68a146105535780634f6ccce71461057c57806355f804b3146105b957610246565b806328fb1eff146104295780632f745c59146104405780633af32abf1461047d5780633c952764146104ba5780633ccfd60b146104e357610246565b806313faede61161020e57806313faede61461034257806318160ddd1461036d57806318cae26914610398578063239c70ae146103d557806323b872dd1461040057610246565b806301ffc9a71461024b57806302329a291461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906138d5565b610992565b60405161027f9190613f90565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa91906138a8565b610a0c565b005b3480156102bd57600080fd5b506102c6610aa5565b6040516102d39190613fab565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613978565b610b37565b6040516103109190613f07565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906137db565b610bbc565b005b34801561034e57600080fd5b50610357610cd4565b604051610364919061432d565b60405180910390f35b34801561037957600080fd5b50610382610cda565b60405161038f919061432d565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613658565b610ce7565b6040516103cc919061432d565b60405180910390f35b3480156103e157600080fd5b506103ea610cff565b6040516103f7919061432d565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906136c5565b610d05565b005b34801561043557600080fd5b5061043e610d65565b005b34801561044c57600080fd5b50610467600480360381019061046291906137db565b610e0e565b604051610474919061432d565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f9190613658565b610eb3565b6040516104b19190613f90565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc91906138a8565b610f7c565b005b6104eb611026565b005b3480156104f957600080fd5b50610514600480360381019061050f91906136c5565b611122565b005b34801561052257600080fd5b5061053d60048036038101906105389190613658565b611142565b60405161054a9190613f6e565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613978565b6111f0565b005b34801561058857600080fd5b506105a3600480360381019061059e9190613978565b611276565b6040516105b0919061432d565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db919061392f565b6112e7565b005b3480156105ee57600080fd5b506105f761137d565b6040516106049190613f90565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613978565b611390565b6040516106419190613f07565b60405180910390f35b34801561065657600080fd5b5061065f611442565b60405161066c9190613fab565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613658565b6114d0565b6040516106a9919061432d565b60405180910390f35b3480156106be57600080fd5b506106c7611588565b005b3480156106d557600080fd5b506106f060048036038101906106eb9190613978565b611610565b005b3480156106fe57600080fd5b50610707611696565b6040516107149190613f07565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f919061381b565b6116c0565b005b34801561075257600080fd5b5061075b611875565b6040516107689190613fab565b60405180910390f35b34801561077d57600080fd5b50610786611907565b6040516107939190613f90565b60405180910390f35b6107b660048036038101906107b19190613978565b61191a565b005b3480156107c457600080fd5b506107df60048036038101906107da919061379b565b611cb3565b005b3480156107ed57600080fd5b5061080860048036038101906108039190613718565b611cc9565b005b34801561081657600080fd5b50610831600480360381019061082c9190613978565b611d2b565b60405161083e9190613f07565b60405180910390f35b34801561085357600080fd5b5061085c611d6a565b604051610869919061432d565b60405180910390f35b34801561087e57600080fd5b5061089960048036038101906108949190613978565b611d70565b6040516108a69190613fab565b60405180910390f35b3480156108bb57600080fd5b506108d660048036038101906108d19190613978565b611e17565b005b3480156108e457600080fd5b506108ed611e9d565b6040516108fa919061432d565b60405180910390f35b34801561090f57600080fd5b5061092a60048036038101906109259190613685565b611ea3565b6040516109379190613f90565b60405180910390f35b34801561094c57600080fd5b506109676004803603810190610962919061385b565b611f37565b005b34801561097557600080fd5b50610990600480360381019061098b9190613658565b611fd7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a055750610a04826120cf565b5b9050919050565b610a146121b1565b73ffffffffffffffffffffffffffffffffffffffff16610a32611696565b73ffffffffffffffffffffffffffffffffffffffff1614610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906141cd565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060008054610ab49061462e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae09061462e565b8015610b2d5780601f10610b0257610100808354040283529160200191610b2d565b820191906000526020600020905b815481529060010190602001808311610b1057829003601f168201915b5050505050905090565b6000610b42826121b9565b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b78906141ad565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bc782611390565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f9061422d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c576121b1565b73ffffffffffffffffffffffffffffffffffffffff161480610c865750610c8581610c806121b1565b611ea3565b5b610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc906140ed565b60405180910390fd5b610ccf8383612225565b505050565b600c5481565b6000600880549050905090565b60126020528060005260406000206000915090505481565b600e5481565b610d16610d106121b1565b826122de565b610d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4c9061428d565b60405180910390fd5b610d608383836123bc565b505050565b610d6d6121b1565b73ffffffffffffffffffffffffffffffffffffffff16610d8b611696565b73ffffffffffffffffffffffffffffffffffffffff1614610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd8906141cd565b60405180910390fd5b6000601060016101000a81548160ff021916908315150217905550610e0c66b1a2bc2ec500006111f0565b565b6000610e19836114d0565b8210610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5190613fcd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600060011515601060019054906101000a900460ff1615151415610f725760005b601180549050811015610f70578273ffffffffffffffffffffffffffffffffffffffff1660118281548110610f0c57610f0b6147c7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f5d576001915050610f77565b8080610f6890614691565b915050610ed4565b505b600090505b919050565b610f846121b1565b73ffffffffffffffffffffffffffffffffffffffff16610fa2611696565b73ffffffffffffffffffffffffffffffffffffffff1614610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef906141cd565b60405180910390fd5b80601060016101000a81548160ff021916908315150217905550611023673782dace9d9000006111f0565b50565b61102e6121b1565b73ffffffffffffffffffffffffffffffffffffffff1661104c611696565b73ffffffffffffffffffffffffffffffffffffffff16146110a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611099906141cd565b60405180910390fd5b60006110ac611696565b73ffffffffffffffffffffffffffffffffffffffff16476040516110cf90613ef2565b60006040518083038185875af1925050503d806000811461110c576040519150601f19603f3d011682016040523d82523d6000602084013e611111565b606091505b505090508061111f57600080fd5b50565b61113d83838360405180602001604052806000815250611cc9565b505050565b6060600061114f836114d0565b905060008167ffffffffffffffff81111561116d5761116c6147f6565b5b60405190808252806020026020018201604052801561119b5781602001602082028036833780820191505090505b50905060005b828110156111e5576111b38582610e0e565b8282815181106111c6576111c56147c7565b5b60200260200101818152505080806111dd90614691565b9150506111a1565b508092505050919050565b6111f86121b1565b73ffffffffffffffffffffffffffffffffffffffff16611216611696565b73ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611263906141cd565b60405180910390fd5b80600c8190555050565b6000611280610cda565b82106112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b8906142ad565b60405180910390fd5b600882815481106112d5576112d46147c7565b5b90600052602060002001549050919050565b6112ef6121b1565b73ffffffffffffffffffffffffffffffffffffffff1661130d611696565b73ffffffffffffffffffffffffffffffffffffffff1614611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a906141cd565b60405180910390fd5b80600b9080519060200190611379929190613340565b5050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114309061412d565b60405180910390fd5b80915050919050565b600b805461144f9061462e565b80601f016020809104026020016040519081016040528092919081815260200182805461147b9061462e565b80156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115389061410d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115906121b1565b73ffffffffffffffffffffffffffffffffffffffff166115ae611696565b73ffffffffffffffffffffffffffffffffffffffff1614611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb906141cd565b60405180910390fd5b61160e6000612623565b565b6116186121b1565b73ffffffffffffffffffffffffffffffffffffffff16611636611696565b73ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906141cd565b60405180910390fd5b80600e8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116c86121b1565b73ffffffffffffffffffffffffffffffffffffffff166116e6611696565b73ffffffffffffffffffffffffffffffffffffffff161461173c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611733906141cd565b60405180910390fd5b60008160ff1611611782576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117799061424d565b60405180910390fd5b600061178c610cda565b9050600d548260ff16826117a09190614456565b11156117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d89061414d565b60405180910390fd5b6000600190505b8260ff16811161186f57601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061184290614691565b919050555061185c8482846118579190614456565b6126e9565b808061186790614691565b9150506117e8565b50505050565b6060600180546118849061462e565b80601f01602080910402602001604051908101604052809291908181526020018280546118b09061462e565b80156118fd5780601f106118d2576101008083540402835291602001916118fd565b820191906000526020600020905b8154815290600101906020018083116118e057829003601f168201915b5050505050905090565b601060019054906101000a900460ff1681565b601060009054906101000a900460ff161561196a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611961906141ed565b60405180910390fd5b6000611974610cda565b9050600082116119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b09061430d565b60405180910390fd5b600e548211156119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f59061416d565b60405180910390fd5b600d548282611a0d9190614456565b1115611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a459061414d565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548382611aa19190614456565b1115611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad99061406d565b60405180910390fd5b611aea611696565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c225760011515601060019054906101000a900460ff1615151415611bd157611b4133610eb3565b611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b77906142ed565b60405180910390fd5b6103e88383611b8f9190614456565b1115611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906142cd565b60405180910390fd5b5b82600c54611bdf91906144dd565b341015611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c189061426d565b60405180910390fd5b5b6000600190505b838111611cad57601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611c8090614691565b9190505550611c9a338285611c959190614456565b6126e9565b8080611ca590614691565b915050611c29565b50505050565b611cc5611cbe6121b1565b8383612707565b5050565b611cda611cd46121b1565b836122de565b611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d109061428d565b60405180910390fd5b611d2584848484612874565b50505050565b60118181548110611d3b57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6060611d7b826121b9565b611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db19061420d565b60405180910390fd5b6000611dc46128d0565b90506000815111611de45760405180602001604052806000815250611e0f565b80611dee84612962565b604051602001611dff929190613ece565b6040516020818303038152906040525b915050919050565b611e1f6121b1565b73ffffffffffffffffffffffffffffffffffffffff16611e3d611696565b73ffffffffffffffffffffffffffffffffffffffff1614611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a906141cd565b60405180910390fd5b80600f8190555050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f3f6121b1565b73ffffffffffffffffffffffffffffffffffffffff16611f5d611696565b73ffffffffffffffffffffffffffffffffffffffff1614611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa906141cd565b60405180910390fd5b60116000611fc191906133c6565b818160119190611fd29291906133e7565b505050565b611fdf6121b1565b73ffffffffffffffffffffffffffffffffffffffff16611ffd611696565b73ffffffffffffffffffffffffffffffffffffffff1614612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906141cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba9061400d565b60405180910390fd5b6120cc81612623565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121aa57506121a982612ac3565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661229883611390565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122e9826121b9565b612328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231f906140cd565b60405180910390fd5b600061233383611390565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061237557506123748185611ea3565b5b806123b357508373ffffffffffffffffffffffffffffffffffffffff1661239b84610b37565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123dc82611390565b73ffffffffffffffffffffffffffffffffffffffff1614612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061402d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124999061408d565b60405180910390fd5b6124ad838383612b2d565b6124b8600082612225565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125089190614537565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461255f9190614456565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261e838383612c41565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612703828260405180602001604052806000815250612c46565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d906140ad565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128679190613f90565b60405180910390a3505050565b61287f8484846123bc565b61288b84848484612ca1565b6128ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c190613fed565b60405180910390fd5b50505050565b6060600b80546128df9061462e565b80601f016020809104026020016040519081016040528092919081815260200182805461290b9061462e565b80156129585780601f1061292d57610100808354040283529160200191612958565b820191906000526020600020905b81548152906001019060200180831161293b57829003601f168201915b5050505050905090565b606060008214156129aa576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612abe565b600082905060005b600082146129dc5780806129c590614691565b915050600a826129d591906144ac565b91506129b2565b60008167ffffffffffffffff8111156129f8576129f76147f6565b5b6040519080825280601f01601f191660200182016040528015612a2a5781602001600182028036833780820191505090505b5090505b60008514612ab757600182612a439190614537565b9150600a85612a5291906146da565b6030612a5e9190614456565b60f81b818381518110612a7457612a736147c7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ab091906144ac565b9450612a2e565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b38838383612e38565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7b57612b7681612e3d565b612bba565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bb957612bb88382612e86565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bfd57612bf881612ff3565b612c3c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3b57612c3a82826130c4565b5b5b505050565b505050565b612c508383613143565b612c5d6000848484612ca1565b612c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9390613fed565b60405180910390fd5b505050565b6000612cc28473ffffffffffffffffffffffffffffffffffffffff1661331d565b15612e2b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ceb6121b1565b8786866040518563ffffffff1660e01b8152600401612d0d9493929190613f22565b602060405180830381600087803b158015612d2757600080fd5b505af1925050508015612d5857506040513d601f19601f82011682018060405250810190612d559190613902565b60015b612ddb573d8060008114612d88576040519150601f19603f3d011682016040523d82523d6000602084013e612d8d565b606091505b50600081511415612dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dca90613fed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e30565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e93846114d0565b612e9d9190614537565b9050600060076000848152602001908152602001600020549050818114612f82576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130079190614537565b9050600060096000848152602001908152602001600020549050600060088381548110613037576130366147c7565b5b906000526020600020015490508060088381548110613059576130586147c7565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130a8576130a7614798565b5b6001900381819060005260206000200160009055905550505050565b60006130cf836114d0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131aa9061418d565b60405180910390fd5b6131bc816121b9565b156131fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f39061404d565b60405180910390fd5b61320860008383612b2d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132589190614456565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461331960008383612c41565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461334c9061462e565b90600052602060002090601f01602090048101928261336e57600085556133b5565b82601f1061338757805160ff19168380011785556133b5565b828001600101855582156133b5579182015b828111156133b4578251825591602001919060010190613399565b5b5090506133c29190613487565b5090565b50805460008255906000526020600020908101906133e49190613487565b50565b828054828255906000526020600020908101928215613476579160200282015b8281111561347557823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613407565b5b5090506134839190613487565b5090565b5b808211156134a0576000816000905550600101613488565b5090565b60006134b76134b28461436d565b614348565b9050828152602081018484840111156134d3576134d2614834565b5b6134de8482856145ec565b509392505050565b60006134f96134f48461439e565b614348565b90508281526020810184848401111561351557613514614834565b5b6135208482856145ec565b509392505050565b60008135905061353781614f0a565b92915050565b60008083601f8401126135535761355261482a565b5b8235905067ffffffffffffffff8111156135705761356f614825565b5b60208301915083602082028301111561358c5761358b61482f565b5b9250929050565b6000813590506135a281614f21565b92915050565b6000813590506135b781614f38565b92915050565b6000815190506135cc81614f38565b92915050565b600082601f8301126135e7576135e661482a565b5b81356135f78482602086016134a4565b91505092915050565b600082601f8301126136155761361461482a565b5b81356136258482602086016134e6565b91505092915050565b60008135905061363d81614f4f565b92915050565b60008135905061365281614f66565b92915050565b60006020828403121561366e5761366d61483e565b5b600061367c84828501613528565b91505092915050565b6000806040838503121561369c5761369b61483e565b5b60006136aa85828601613528565b92505060206136bb85828601613528565b9150509250929050565b6000806000606084860312156136de576136dd61483e565b5b60006136ec86828701613528565b93505060206136fd86828701613528565b925050604061370e8682870161362e565b9150509250925092565b600080600080608085870312156137325761373161483e565b5b600061374087828801613528565b945050602061375187828801613528565b93505060406137628782880161362e565b925050606085013567ffffffffffffffff81111561378357613782614839565b5b61378f878288016135d2565b91505092959194509250565b600080604083850312156137b2576137b161483e565b5b60006137c085828601613528565b92505060206137d185828601613593565b9150509250929050565b600080604083850312156137f2576137f161483e565b5b600061380085828601613528565b92505060206138118582860161362e565b9150509250929050565b600080604083850312156138325761383161483e565b5b600061384085828601613528565b925050602061385185828601613643565b9150509250929050565b600080602083850312156138725761387161483e565b5b600083013567ffffffffffffffff8111156138905761388f614839565b5b61389c8582860161353d565b92509250509250929050565b6000602082840312156138be576138bd61483e565b5b60006138cc84828501613593565b91505092915050565b6000602082840312156138eb576138ea61483e565b5b60006138f9848285016135a8565b91505092915050565b6000602082840312156139185761391761483e565b5b6000613926848285016135bd565b91505092915050565b6000602082840312156139455761394461483e565b5b600082013567ffffffffffffffff81111561396357613962614839565b5b61396f84828501613600565b91505092915050565b60006020828403121561398e5761398d61483e565b5b600061399c8482850161362e565b91505092915050565b60006139b18383613eb0565b60208301905092915050565b6139c68161456b565b82525050565b60006139d7826143df565b6139e1818561440d565b93506139ec836143cf565b8060005b83811015613a1d578151613a0488826139a5565b9750613a0f83614400565b9250506001810190506139f0565b5085935050505092915050565b613a338161457d565b82525050565b6000613a44826143ea565b613a4e818561441e565b9350613a5e8185602086016145fb565b613a6781614843565b840191505092915050565b6000613a7d826143f5565b613a87818561443a565b9350613a978185602086016145fb565b613aa081614843565b840191505092915050565b6000613ab6826143f5565b613ac0818561444b565b9350613ad08185602086016145fb565b80840191505092915050565b6000613ae9602b8361443a565b9150613af482614854565b604082019050919050565b6000613b0c60328361443a565b9150613b17826148a3565b604082019050919050565b6000613b2f60268361443a565b9150613b3a826148f2565b604082019050919050565b6000613b5260258361443a565b9150613b5d82614941565b604082019050919050565b6000613b75601c8361443a565b9150613b8082614990565b602082019050919050565b6000613b98601c8361443a565b9150613ba3826149b9565b602082019050919050565b6000613bbb60248361443a565b9150613bc6826149e2565b604082019050919050565b6000613bde60198361443a565b9150613be982614a31565b602082019050919050565b6000613c01602c8361443a565b9150613c0c82614a5a565b604082019050919050565b6000613c2460388361443a565b9150613c2f82614aa9565b604082019050919050565b6000613c47602a8361443a565b9150613c5282614af8565b604082019050919050565b6000613c6a60298361443a565b9150613c7582614b47565b604082019050919050565b6000613c8d60168361443a565b9150613c9882614b96565b602082019050919050565b6000613cb060248361443a565b9150613cbb82614bbf565b604082019050919050565b6000613cd360208361443a565b9150613cde82614c0e565b602082019050919050565b6000613cf6602c8361443a565b9150613d0182614c37565b604082019050919050565b6000613d1960208361443a565b9150613d2482614c86565b602082019050919050565b6000613d3c60168361443a565b9150613d4782614caf565b602082019050919050565b6000613d5f602f8361443a565b9150613d6a82614cd8565b604082019050919050565b6000613d8260218361443a565b9150613d8d82614d27565b604082019050919050565b6000613da560138361443a565b9150613db082614d76565b602082019050919050565b6000613dc860008361442f565b9150613dd382614d9f565b600082019050919050565b6000613deb60128361443a565b9150613df682614da2565b602082019050919050565b6000613e0e60318361443a565b9150613e1982614dcb565b604082019050919050565b6000613e31602c8361443a565b9150613e3c82614e1a565b604082019050919050565b6000613e5460258361443a565b9150613e5f82614e69565b604082019050919050565b6000613e7760178361443a565b9150613e8282614eb8565b602082019050919050565b6000613e9a601b8361443a565b9150613ea582614ee1565b602082019050919050565b613eb9816145d5565b82525050565b613ec8816145d5565b82525050565b6000613eda8285613aab565b9150613ee68284613aab565b91508190509392505050565b6000613efd82613dbb565b9150819050919050565b6000602082019050613f1c60008301846139bd565b92915050565b6000608082019050613f3760008301876139bd565b613f4460208301866139bd565b613f516040830185613ebf565b8181036060830152613f638184613a39565b905095945050505050565b60006020820190508181036000830152613f8881846139cc565b905092915050565b6000602082019050613fa56000830184613a2a565b92915050565b60006020820190508181036000830152613fc58184613a72565b905092915050565b60006020820190508181036000830152613fe681613adc565b9050919050565b6000602082019050818103600083015261400681613aff565b9050919050565b6000602082019050818103600083015261402681613b22565b9050919050565b6000602082019050818103600083015261404681613b45565b9050919050565b6000602082019050818103600083015261406681613b68565b9050919050565b6000602082019050818103600083015261408681613b8b565b9050919050565b600060208201905081810360008301526140a681613bae565b9050919050565b600060208201905081810360008301526140c681613bd1565b9050919050565b600060208201905081810360008301526140e681613bf4565b9050919050565b6000602082019050818103600083015261410681613c17565b9050919050565b6000602082019050818103600083015261412681613c3a565b9050919050565b6000602082019050818103600083015261414681613c5d565b9050919050565b6000602082019050818103600083015261416681613c80565b9050919050565b6000602082019050818103600083015261418681613ca3565b9050919050565b600060208201905081810360008301526141a681613cc6565b9050919050565b600060208201905081810360008301526141c681613ce9565b9050919050565b600060208201905081810360008301526141e681613d0c565b9050919050565b6000602082019050818103600083015261420681613d2f565b9050919050565b6000602082019050818103600083015261422681613d52565b9050919050565b6000602082019050818103600083015261424681613d75565b9050919050565b6000602082019050818103600083015261426681613d98565b9050919050565b6000602082019050818103600083015261428681613dde565b9050919050565b600060208201905081810360008301526142a681613e01565b9050919050565b600060208201905081810360008301526142c681613e24565b9050919050565b600060208201905081810360008301526142e681613e47565b9050919050565b6000602082019050818103600083015261430681613e6a565b9050919050565b6000602082019050818103600083015261432681613e8d565b9050919050565b60006020820190506143426000830184613ebf565b92915050565b6000614352614363565b905061435e8282614660565b919050565b6000604051905090565b600067ffffffffffffffff821115614388576143876147f6565b5b61439182614843565b9050602081019050919050565b600067ffffffffffffffff8211156143b9576143b86147f6565b5b6143c282614843565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614461826145d5565b915061446c836145d5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144a1576144a061470b565b5b828201905092915050565b60006144b7826145d5565b91506144c2836145d5565b9250826144d2576144d161473a565b5b828204905092915050565b60006144e8826145d5565b91506144f3836145d5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561452c5761452b61470b565b5b828202905092915050565b6000614542826145d5565b915061454d836145d5565b9250828210156145605761455f61470b565b5b828203905092915050565b6000614576826145b5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156146195780820151818401526020810190506145fe565b83811115614628576000848401525b50505050565b6000600282049050600182168061464657607f821691505b6020821081141561465a57614659614769565b5b50919050565b61466982614843565b810181811067ffffffffffffffff82111715614688576146876147f6565b5b80604052505050565b600061469c826145d5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146cf576146ce61470b565b5b600182019050919050565b60006146e5826145d5565b91506146f0836145d5565b925082614700576146ff61473a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20616d6f756e742073706563696669656400000000000000000000000000600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f46697273742077686974656c697374206c696d6974206578636565646564202860008201527f3130303029000000000000000000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b614f138161456b565b8114614f1e57600080fd5b50565b614f2a8161457d565b8114614f3557600080fd5b50565b614f4181614589565b8114614f4c57600080fd5b50565b614f58816145d5565b8114614f6357600080fd5b50565b614f6f816145df565b8114614f7a57600080fd5b5056fea2646970667358221220bc2c129ca12ba708ec52539ee5f62770779810068d67e3d10b9db265b5a8e27c64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d65636e4b637748536a583156474455677845654b59577a6a666b6963764d6536446a764636586641446d42772f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmecnKcwHSjX1VGDUgxEeKYWzjfkicvMe6DjvF6XfADmBw/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d65636e4b637748536a583156474455677845654b59577a
Arg [3] : 6a666b6963764d6536446a764636586641446d42772f00000000000000000000


Deployed Bytecode Sourcemap

40558:4222:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32495:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44145:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19716:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21276:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20799:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40681:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33135:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40948:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40754:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22026:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44360:116;;;;;;;;;;;;;:::i;:::-;;32803:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42643:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44224:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44632:145;;;:::i;:::-;;22436:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42939:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43833:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33325:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44041:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40835:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19410:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40655:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19140:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39706:103;;;;;;;;;;;;;:::i;:::-;;43919:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39055:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42281:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19885:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40866:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41278:997;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21569:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22692:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40906:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40792:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43293:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43723:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40718:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21795:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44482:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39964:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32495:224;32597:4;32636:35;32621:50;;;:11;:50;;;;:90;;;;32675:36;32699:11;32675:23;:36::i;:::-;32621:90;32614:97;;32495:224;;;:::o;44145:73::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44206:6:::1;44197;;:15;;;;;;;;;;;;;;;;;;44145:73:::0;:::o;19716:100::-;19770:13;19803:5;19796:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19716:100;:::o;21276:221::-;21352:7;21380:16;21388:7;21380;:16::i;:::-;21372:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21465:15;:24;21481:7;21465:24;;;;;;;;;;;;;;;;;;;;;21458:31;;21276:221;;;:::o;20799:411::-;20880:13;20896:23;20911:7;20896:14;:23::i;:::-;20880:39;;20944:5;20938:11;;:2;:11;;;;20930:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21038:5;21022:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21047:37;21064:5;21071:12;:10;:12::i;:::-;21047:16;:37::i;:::-;21022:62;21000:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;21181:21;21190:2;21194:7;21181:8;:21::i;:::-;20869:341;20799:411;;:::o;40681:32::-;;;;:::o;33135:113::-;33196:7;33223:10;:17;;;;33216:24;;33135:113;:::o;40948:55::-;;;;;;;;;;;;;;;;;:::o;40754:33::-;;;;:::o;22026:339::-;22221:41;22240:12;:10;:12::i;:::-;22254:7;22221:18;:41::i;:::-;22213:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22329:28;22339:4;22345:2;22349:7;22329:9;:28::i;:::-;22026:339;;;:::o;44360:116::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44432:5:::1;44414:15;;:23;;;;;;;;;;;;;;;;;;44444:26;44452:17;44444:7;:26::i;:::-;44360:116::o:0;32803:256::-;32900:7;32936:23;32953:5;32936:16;:23::i;:::-;32928:5;:31;32920:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33025:12;:19;33038:5;33025:19;;;;;;;;;;;;;;;:26;33045:5;33025:26;;;;;;;;;;;;33018:33;;32803:256;;;;:::o;42643:290::-;42702:4;42738;42719:23;;:15;;;;;;;;;;;:23;;;42715:194;;;42758:6;42753:149;42774:20;:27;;;;42770:1;:31;42753:149;;;42850:5;42823:32;;:20;42844:1;42823:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;42819:74;;;42877:4;42870:11;;;;;42819:74;42803:3;;;;;:::i;:::-;;;;42753:149;;;;42715:194;42922:5;42915:12;;42643:290;;;;:::o;44224:130::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44307:6:::1;44289:15;;:24;;;;;;;;;;;;;;;;;;44320:28;44328:19;44320:7;:28::i;:::-;44224:130:::0;:::o;44632:145::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44685:7:::1;44706;:5;:7::i;:::-;44698:21;;44727;44698:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44684:69;;;44768:2;44760:11;;;::::0;::::1;;44677:100;44632:145::o:0;22436:185::-;22574:39;22591:4;22597:2;22601:7;22574:39;;;;;;;;;;;;:16;:39::i;:::-;22436:185;;;:::o;42939:348::-;43014:16;43042:23;43068:17;43078:6;43068:9;:17::i;:::-;43042:43;;43092:25;43134:15;43120:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43092:58;;43162:9;43157:103;43177:15;43173:1;:19;43157:103;;;43222:30;43242:6;43250:1;43222:19;:30::i;:::-;43208:8;43217:1;43208:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;43194:3;;;;;:::i;:::-;;;;43157:103;;;;43273:8;43266:15;;;;42939:348;;;:::o;43833:80::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43899:8:::1;43892:4;:15;;;;43833:80:::0;:::o;33325:233::-;33400:7;33436:30;:28;:30::i;:::-;33428:5;:38;33420:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;33533:10;33544:5;33533:17;;;;;;;;:::i;:::-;;;;;;;;;;33526:24;;33325:233;;;:::o;44041:98::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44122:11:::1;44112:7;:21;;;;;;;;;;;;:::i;:::-;;44041:98:::0;:::o;40835:26::-;;;;;;;;;;;;;:::o;19410:239::-;19482:7;19502:13;19518:7;:16;19526:7;19518:16;;;;;;;;;;;;;;;;;;;;;19502:32;;19570:1;19553:19;;:5;:19;;;;19545:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19636:5;19629:12;;;19410:239;;;:::o;40655:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19140:208::-;19212:7;19257:1;19240:19;;:5;:19;;;;19232:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;19324:9;:16;19334:5;19324:16;;;;;;;;;;;;;;;;19317:23;;19140:208;;;:::o;39706:103::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39771:30:::1;39798:1;39771:18;:30::i;:::-;39706:103::o:0;43919:116::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44012:17:::1;43996:13;:33;;;;43919:116:::0;:::o;39055:87::-;39101:7;39128:6;;;;;;;;;;;39121:13;;39055:87;:::o;42281:356::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42372:1:::1;42363:6;:10;;;42355:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;42404:14;42421:13;:11;:13::i;:::-;42404:30;;42468:9;;42458:6;42449:15;;:6;:15;;;;:::i;:::-;:28;;42441:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;42522:9;42534:1;42522:13;;42517:115;42542:6;42537:11;;:1;:11;42517:115;;42564:20;:24;42585:2;42564:24;;;;;;;;;;;;;;;;:26;;;;;;;;;:::i;:::-;;;;;;42599:25;42609:2;42622:1;42613:6;:10;;;;:::i;:::-;42599:9;:25::i;:::-;42550:3;;;;;:::i;:::-;;;;42517:115;;;;42348:289;42281:356:::0;;:::o;19885:104::-;19941:13;19974:7;19967:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19885:104;:::o;40866:35::-;;;;;;;;;;;;;:::o;41278:997::-;41344:6;;;;;;;;;;;41343:7;41335:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;41384:14;41401:13;:11;:13::i;:::-;41384:30;;41443:1;41429:11;:15;41421:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41506:13;;41491:11;:28;;41483:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;41599:9;;41584:11;41575:6;:20;;;;:::i;:::-;:33;;41567:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41644:24;41671:20;:32;41692:10;41671:32;;;;;;;;;;;;;;;;41644:59;;41752:18;;41737:11;41718:16;:30;;;;:::i;:::-;:52;;41710:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;41830:7;:5;:7::i;:::-;41816:21;;:10;:21;;;41812:314;;41871:4;41852:23;;:15;;;;;;;;;;;:23;;;41848:200;;;41896:25;41910:10;41896:13;:25::i;:::-;41888:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41992:4;41977:11;41968:6;:20;;;;:::i;:::-;:28;;41960:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;41848:200;42084:11;42077:4;;:18;;;;:::i;:::-;42064:9;:31;;42056:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41812:314;42139:9;42151:1;42139:13;;42134:136;42159:11;42154:1;:16;42134:136;;42186:20;:32;42207:10;42186:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;42229:33;42239:10;42260:1;42251:6;:10;;;;:::i;:::-;42229:9;:33::i;:::-;42172:3;;;;;:::i;:::-;;;;42134:136;;;;41328:947;;41278:997;:::o;21569:155::-;21664:52;21683:12;:10;:12::i;:::-;21697:8;21707;21664:18;:52::i;:::-;21569:155;;:::o;22692:328::-;22867:41;22886:12;:10;:12::i;:::-;22900:7;22867:18;:41::i;:::-;22859:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22973:39;22987:4;22993:2;22997:7;23006:5;22973:13;:39::i;:::-;22692:328;;;;:::o;40906:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40792:38::-;;;;:::o;43293:408::-;43391:13;43432:16;43440:7;43432;:16::i;:::-;43416:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;43522:28;43553:10;:8;:10::i;:::-;43522:41;;43608:1;43583:14;43577:28;:32;:118;;;;;;;;;;;;;;;;;43645:14;43661:18;:7;:16;:18::i;:::-;43628:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43577:118;43570:125;;;43293:408;;;:::o;43723:104::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43815:6:::1;43794:18;:27;;;;43723:104:::0;:::o;40718:31::-;;;;:::o;21795:164::-;21892:4;21916:18;:25;21935:5;21916:25;;;;;;;;;;;;;;;:35;21942:8;21916:35;;;;;;;;;;;;;;;;;;;;;;;;;21909:42;;21795:164;;;;:::o;44482:144::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44564:20:::1;;44557:27;;;;:::i;:::-;44614:6;;44591:20;:29;;;;;;;:::i;:::-;;44482:144:::0;;:::o;39964:201::-;39286:12;:10;:12::i;:::-;39275:23;;:7;:5;:7::i;:::-;:23;;;39267:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40073:1:::1;40053:22;;:8;:22;;;;40045:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40129:28;40148:8;40129:18;:28::i;:::-;39964:201:::0;:::o;18771:305::-;18873:4;18925:25;18910:40;;;:11;:40;;;;:105;;;;18982:33;18967:48;;;:11;:48;;;;18910:105;:158;;;;19032:36;19056:11;19032:23;:36::i;:::-;18910:158;18890:178;;18771:305;;;:::o;7086:98::-;7139:7;7166:10;7159:17;;7086:98;:::o;24530:127::-;24595:4;24647:1;24619:30;;:7;:16;24627:7;24619:16;;;;;;;;;;;;;;;;;;;;;:30;;;;24612:37;;24530:127;;;:::o;28676:174::-;28778:2;28751:15;:24;28767:7;28751:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;28834:7;28830:2;28796:46;;28805:23;28820:7;28805:14;:23::i;:::-;28796:46;;;;;;;;;;;;28676:174;;:::o;24824:348::-;24917:4;24942:16;24950:7;24942;:16::i;:::-;24934:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25018:13;25034:23;25049:7;25034:14;:23::i;:::-;25018:39;;25087:5;25076:16;;:7;:16;;;:52;;;;25096:32;25113:5;25120:7;25096:16;:32::i;:::-;25076:52;:87;;;;25156:7;25132:31;;:20;25144:7;25132:11;:20::i;:::-;:31;;;25076:87;25068:96;;;24824:348;;;;:::o;27933:625::-;28092:4;28065:31;;:23;28080:7;28065:14;:23::i;:::-;:31;;;28057:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28171:1;28157:16;;:2;:16;;;;28149:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28227:39;28248:4;28254:2;28258:7;28227:20;:39::i;:::-;28331:29;28348:1;28352:7;28331:8;:29::i;:::-;28392:1;28373:9;:15;28383:4;28373:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;28421:1;28404:9;:13;28414:2;28404:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28452:2;28433:7;:16;28441:7;28433:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28491:7;28487:2;28472:27;;28481:4;28472:27;;;;;;;;;;;;28512:38;28532:4;28538:2;28542:7;28512:19;:38::i;:::-;27933:625;;;:::o;40325:191::-;40399:16;40418:6;;;;;;;;;;;40399:25;;40444:8;40435:6;;:17;;;;;;;;;;;;;;;;;;40499:8;40468:40;;40489:8;40468:40;;;;;;;;;;;;40388:128;40325:191;:::o;25514:110::-;25590:26;25600:2;25604:7;25590:26;;;;;;;;;;;;:9;:26::i;:::-;25514:110;;:::o;28992:315::-;29147:8;29138:17;;:5;:17;;;;29130:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;29234:8;29196:18;:25;29215:5;29196:25;;;;;;;;;;;;;;;:35;29222:8;29196:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;29280:8;29258:41;;29273:5;29258:41;;;29290:8;29258:41;;;;;;:::i;:::-;;;;;;;;28992:315;;;:::o;23902:::-;24059:28;24069:4;24075:2;24079:7;24059:9;:28::i;:::-;24106:48;24129:4;24135:2;24139:7;24148:5;24106:22;:48::i;:::-;24098:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;23902:315;;;;:::o;41157:102::-;41217:13;41246:7;41239:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41157:102;:::o;7488:723::-;7544:13;7774:1;7765:5;:10;7761:53;;;7792:10;;;;;;;;;;;;;;;;;;;;;7761:53;7824:12;7839:5;7824:20;;7855:14;7880:78;7895:1;7887:4;:9;7880:78;;7913:8;;;;;:::i;:::-;;;;7944:2;7936:10;;;;;:::i;:::-;;;7880:78;;;7968:19;8000:6;7990:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7968:39;;8018:154;8034:1;8025:5;:10;8018:154;;8062:1;8052:11;;;;;:::i;:::-;;;8129:2;8121:5;:10;;;;:::i;:::-;8108:2;:24;;;;:::i;:::-;8095:39;;8078:6;8085;8078:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8158:2;8149:11;;;;;:::i;:::-;;;8018:154;;;8196:6;8182:21;;;;;7488:723;;;;:::o;17632:157::-;17717:4;17756:25;17741:40;;;:11;:40;;;;17734:47;;17632:157;;;:::o;34171:589::-;34315:45;34342:4;34348:2;34352:7;34315:26;:45::i;:::-;34393:1;34377:18;;:4;:18;;;34373:187;;;34412:40;34444:7;34412:31;:40::i;:::-;34373:187;;;34482:2;34474:10;;:4;:10;;;34470:90;;34501:47;34534:4;34540:7;34501:32;:47::i;:::-;34470:90;34373:187;34588:1;34574:16;;:2;:16;;;34570:183;;;34607:45;34644:7;34607:36;:45::i;:::-;34570:183;;;34680:4;34674:10;;:2;:10;;;34670:83;;34701:40;34729:2;34733:7;34701:27;:40::i;:::-;34670:83;34570:183;34171:589;;;:::o;31754:125::-;;;;:::o;25851:321::-;25981:18;25987:2;25991:7;25981:5;:18::i;:::-;26032:54;26063:1;26067:2;26071:7;26080:5;26032:22;:54::i;:::-;26010:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;25851:321;;;:::o;29872:799::-;30027:4;30048:15;:2;:13;;;:15::i;:::-;30044:620;;;30100:2;30084:36;;;30121:12;:10;:12::i;:::-;30135:4;30141:7;30150:5;30084:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30080:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30343:1;30326:6;:13;:18;30322:272;;;30369:60;;;;;;;;;;:::i;:::-;;;;;;;;30322:272;30544:6;30538:13;30529:6;30525:2;30521:15;30514:38;30080:529;30217:41;;;30207:51;;;:6;:51;;;;30200:58;;;;;30044:620;30648:4;30641:11;;29872:799;;;;;;;:::o;31243:126::-;;;;:::o;35483:164::-;35587:10;:17;;;;35560:15;:24;35576:7;35560:24;;;;;;;;;;;:44;;;;35615:10;35631:7;35615:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35483:164;:::o;36274:988::-;36540:22;36590:1;36565:22;36582:4;36565:16;:22::i;:::-;:26;;;;:::i;:::-;36540:51;;36602:18;36623:17;:26;36641:7;36623:26;;;;;;;;;;;;36602:47;;36770:14;36756:10;:28;36752:328;;36801:19;36823:12;:18;36836:4;36823:18;;;;;;;;;;;;;;;:34;36842:14;36823:34;;;;;;;;;;;;36801:56;;36907:11;36874:12;:18;36887:4;36874:18;;;;;;;;;;;;;;;:30;36893:10;36874:30;;;;;;;;;;;:44;;;;37024:10;36991:17;:30;37009:11;36991:30;;;;;;;;;;;:43;;;;36786:294;36752:328;37176:17;:26;37194:7;37176:26;;;;;;;;;;;37169:33;;;37220:12;:18;37233:4;37220:18;;;;;;;;;;;;;;;:34;37239:14;37220:34;;;;;;;;;;;37213:41;;;36355:907;;36274:988;;:::o;37557:1079::-;37810:22;37855:1;37835:10;:17;;;;:21;;;;:::i;:::-;37810:46;;37867:18;37888:15;:24;37904:7;37888:24;;;;;;;;;;;;37867:45;;38239:19;38261:10;38272:14;38261:26;;;;;;;;:::i;:::-;;;;;;;;;;38239:48;;38325:11;38300:10;38311;38300:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;38436:10;38405:15;:28;38421:11;38405:28;;;;;;;;;;;:41;;;;38577:15;:24;38593:7;38577:24;;;;;;;;;;;38570:31;;;38612:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37628:1008;;;37557:1079;:::o;35061:221::-;35146:14;35163:20;35180:2;35163:16;:20::i;:::-;35146:37;;35221:7;35194:12;:16;35207:2;35194:16;;;;;;;;;;;;;;;:24;35211:6;35194:24;;;;;;;;;;;:34;;;;35268:6;35239:17;:26;35257:7;35239:26;;;;;;;;;;;:35;;;;35135:147;35061:221;;:::o;26508:439::-;26602:1;26588:16;;:2;:16;;;;26580:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;26661:16;26669:7;26661;:16::i;:::-;26660:17;26652:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26723:45;26752:1;26756:2;26760:7;26723:20;:45::i;:::-;26798:1;26781:9;:13;26791:2;26781:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;26829:2;26810:7;:16;26818:7;26810:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;26874:7;26870:2;26849:33;;26866:1;26849:33;;;;;;;;;;;;26895:44;26923:1;26927:2;26931:7;26895:19;:44::i;:::-;26508:439;;:::o;10255:326::-;10315:4;10572:1;10550:7;:19;;;:23;10543:30;;10255:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:135::-;2912:5;2950:6;2937:20;2928:29;;2966:31;2991:5;2966:31;:::i;:::-;2868:135;;;;:::o;3009:329::-;3068:6;3117:2;3105:9;3096:7;3092:23;3088:32;3085:119;;;3123:79;;:::i;:::-;3085:119;3243:1;3268:53;3313:7;3304:6;3293:9;3289:22;3268:53;:::i;:::-;3258:63;;3214:117;3009:329;;;;:::o;3344:474::-;3412:6;3420;3469:2;3457:9;3448:7;3444:23;3440:32;3437:119;;;3475:79;;:::i;:::-;3437:119;3595:1;3620:53;3665:7;3656:6;3645:9;3641:22;3620:53;:::i;:::-;3610:63;;3566:117;3722:2;3748:53;3793:7;3784:6;3773:9;3769:22;3748:53;:::i;:::-;3738:63;;3693:118;3344:474;;;;;:::o;3824:619::-;3901:6;3909;3917;3966:2;3954:9;3945:7;3941:23;3937:32;3934:119;;;3972:79;;:::i;:::-;3934:119;4092:1;4117:53;4162:7;4153:6;4142:9;4138:22;4117:53;:::i;:::-;4107:63;;4063:117;4219:2;4245:53;4290:7;4281:6;4270:9;4266:22;4245:53;:::i;:::-;4235:63;;4190:118;4347:2;4373:53;4418:7;4409:6;4398:9;4394:22;4373:53;:::i;:::-;4363:63;;4318:118;3824:619;;;;;:::o;4449:943::-;4544:6;4552;4560;4568;4617:3;4605:9;4596:7;4592:23;4588:33;4585:120;;;4624:79;;:::i;:::-;4585:120;4744:1;4769:53;4814:7;4805:6;4794:9;4790:22;4769:53;:::i;:::-;4759:63;;4715:117;4871:2;4897:53;4942:7;4933:6;4922:9;4918:22;4897:53;:::i;:::-;4887:63;;4842:118;4999:2;5025:53;5070:7;5061:6;5050:9;5046:22;5025:53;:::i;:::-;5015:63;;4970:118;5155:2;5144:9;5140:18;5127:32;5186:18;5178:6;5175:30;5172:117;;;5208:79;;:::i;:::-;5172:117;5313:62;5367:7;5358:6;5347:9;5343:22;5313:62;:::i;:::-;5303:72;;5098:287;4449:943;;;;;;;:::o;5398:468::-;5463:6;5471;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:53;5716:7;5707:6;5696:9;5692:22;5671:53;:::i;:::-;5661:63;;5617:117;5773:2;5799:50;5841:7;5832:6;5821:9;5817:22;5799:50;:::i;:::-;5789:60;;5744:115;5398:468;;;;;:::o;5872:474::-;5940:6;5948;5997:2;5985:9;5976:7;5972:23;5968:32;5965:119;;;6003:79;;:::i;:::-;5965:119;6123:1;6148:53;6193:7;6184:6;6173:9;6169:22;6148:53;:::i;:::-;6138:63;;6094:117;6250:2;6276:53;6321:7;6312:6;6301:9;6297:22;6276:53;:::i;:::-;6266:63;;6221:118;5872:474;;;;;:::o;6352:470::-;6418:6;6426;6475:2;6463:9;6454:7;6450:23;6446:32;6443:119;;;6481:79;;:::i;:::-;6443:119;6601:1;6626:53;6671:7;6662:6;6651:9;6647:22;6626:53;:::i;:::-;6616:63;;6572:117;6728:2;6754:51;6797:7;6788:6;6777:9;6773:22;6754:51;:::i;:::-;6744:61;;6699:116;6352:470;;;;;:::o;6828:559::-;6914:6;6922;6971:2;6959:9;6950:7;6946:23;6942:32;6939:119;;;6977:79;;:::i;:::-;6939:119;7125:1;7114:9;7110:17;7097:31;7155:18;7147:6;7144:30;7141:117;;;7177:79;;:::i;:::-;7141:117;7290:80;7362:7;7353:6;7342:9;7338:22;7290:80;:::i;:::-;7272:98;;;;7068:312;6828:559;;;;;:::o;7393:323::-;7449:6;7498:2;7486:9;7477:7;7473:23;7469:32;7466:119;;;7504:79;;:::i;:::-;7466:119;7624:1;7649:50;7691:7;7682:6;7671:9;7667:22;7649:50;:::i;:::-;7639:60;;7595:114;7393:323;;;;:::o;7722:327::-;7780:6;7829:2;7817:9;7808:7;7804:23;7800:32;7797:119;;;7835:79;;:::i;:::-;7797:119;7955:1;7980:52;8024:7;8015:6;8004:9;8000:22;7980:52;:::i;:::-;7970:62;;7926:116;7722:327;;;;:::o;8055:349::-;8124:6;8173:2;8161:9;8152:7;8148:23;8144:32;8141:119;;;8179:79;;:::i;:::-;8141:119;8299:1;8324:63;8379:7;8370:6;8359:9;8355:22;8324:63;:::i;:::-;8314:73;;8270:127;8055:349;;;;:::o;8410:509::-;8479:6;8528:2;8516:9;8507:7;8503:23;8499:32;8496:119;;;8534:79;;:::i;:::-;8496:119;8682:1;8671:9;8667:17;8654:31;8712:18;8704:6;8701:30;8698:117;;;8734:79;;:::i;:::-;8698:117;8839:63;8894:7;8885:6;8874:9;8870:22;8839:63;:::i;:::-;8829:73;;8625:287;8410:509;;;;:::o;8925:329::-;8984:6;9033:2;9021:9;9012:7;9008:23;9004:32;9001:119;;;9039:79;;:::i;:::-;9001:119;9159:1;9184:53;9229:7;9220:6;9209:9;9205:22;9184:53;:::i;:::-;9174:63;;9130:117;8925:329;;;;:::o;9260:179::-;9329:10;9350:46;9392:3;9384:6;9350:46;:::i;:::-;9428:4;9423:3;9419:14;9405:28;;9260:179;;;;:::o;9445:118::-;9532:24;9550:5;9532:24;:::i;:::-;9527:3;9520:37;9445:118;;:::o;9599:732::-;9718:3;9747:54;9795:5;9747:54;:::i;:::-;9817:86;9896:6;9891:3;9817:86;:::i;:::-;9810:93;;9927:56;9977:5;9927:56;:::i;:::-;10006:7;10037:1;10022:284;10047:6;10044:1;10041:13;10022:284;;;10123:6;10117:13;10150:63;10209:3;10194:13;10150:63;:::i;:::-;10143:70;;10236:60;10289:6;10236:60;:::i;:::-;10226:70;;10082:224;10069:1;10066;10062:9;10057:14;;10022:284;;;10026:14;10322:3;10315:10;;9723:608;;;9599:732;;;;:::o;10337:109::-;10418:21;10433:5;10418:21;:::i;:::-;10413:3;10406:34;10337:109;;:::o;10452:360::-;10538:3;10566:38;10598:5;10566:38;:::i;:::-;10620:70;10683:6;10678:3;10620:70;:::i;:::-;10613:77;;10699:52;10744:6;10739:3;10732:4;10725:5;10721:16;10699:52;:::i;:::-;10776:29;10798:6;10776:29;:::i;:::-;10771:3;10767:39;10760:46;;10542:270;10452:360;;;;:::o;10818:364::-;10906:3;10934:39;10967:5;10934:39;:::i;:::-;10989:71;11053:6;11048:3;10989:71;:::i;:::-;10982:78;;11069:52;11114:6;11109:3;11102:4;11095:5;11091:16;11069:52;:::i;:::-;11146:29;11168:6;11146:29;:::i;:::-;11141:3;11137:39;11130:46;;10910:272;10818:364;;;;:::o;11188:377::-;11294:3;11322:39;11355:5;11322:39;:::i;:::-;11377:89;11459:6;11454:3;11377:89;:::i;:::-;11370:96;;11475:52;11520:6;11515:3;11508:4;11501:5;11497:16;11475:52;:::i;:::-;11552:6;11547:3;11543:16;11536:23;;11298:267;11188:377;;;;:::o;11571:366::-;11713:3;11734:67;11798:2;11793:3;11734:67;:::i;:::-;11727:74;;11810:93;11899:3;11810:93;:::i;:::-;11928:2;11923:3;11919:12;11912:19;;11571:366;;;:::o;11943:::-;12085:3;12106:67;12170:2;12165:3;12106:67;:::i;:::-;12099:74;;12182:93;12271:3;12182:93;:::i;:::-;12300:2;12295:3;12291:12;12284:19;;11943:366;;;:::o;12315:::-;12457:3;12478:67;12542:2;12537:3;12478:67;:::i;:::-;12471:74;;12554:93;12643:3;12554:93;:::i;:::-;12672:2;12667:3;12663:12;12656:19;;12315:366;;;:::o;12687:::-;12829:3;12850:67;12914:2;12909:3;12850:67;:::i;:::-;12843:74;;12926:93;13015:3;12926:93;:::i;:::-;13044:2;13039:3;13035:12;13028:19;;12687:366;;;:::o;13059:::-;13201:3;13222:67;13286:2;13281:3;13222:67;:::i;:::-;13215:74;;13298:93;13387:3;13298:93;:::i;:::-;13416:2;13411:3;13407:12;13400:19;;13059:366;;;:::o;13431:::-;13573:3;13594:67;13658:2;13653:3;13594:67;:::i;:::-;13587:74;;13670:93;13759:3;13670:93;:::i;:::-;13788:2;13783:3;13779:12;13772:19;;13431:366;;;:::o;13803:::-;13945:3;13966:67;14030:2;14025:3;13966:67;:::i;:::-;13959:74;;14042:93;14131:3;14042:93;:::i;:::-;14160:2;14155:3;14151:12;14144:19;;13803:366;;;:::o;14175:::-;14317:3;14338:67;14402:2;14397:3;14338:67;:::i;:::-;14331:74;;14414:93;14503:3;14414:93;:::i;:::-;14532:2;14527:3;14523:12;14516:19;;14175:366;;;:::o;14547:::-;14689:3;14710:67;14774:2;14769:3;14710:67;:::i;:::-;14703:74;;14786:93;14875:3;14786:93;:::i;:::-;14904:2;14899:3;14895:12;14888:19;;14547:366;;;:::o;14919:::-;15061:3;15082:67;15146:2;15141:3;15082:67;:::i;:::-;15075:74;;15158:93;15247:3;15158:93;:::i;:::-;15276:2;15271:3;15267:12;15260:19;;14919:366;;;:::o;15291:::-;15433:3;15454:67;15518:2;15513:3;15454:67;:::i;:::-;15447:74;;15530:93;15619:3;15530:93;:::i;:::-;15648:2;15643:3;15639:12;15632:19;;15291:366;;;:::o;15663:::-;15805:3;15826:67;15890:2;15885:3;15826:67;:::i;:::-;15819:74;;15902:93;15991:3;15902:93;:::i;:::-;16020:2;16015:3;16011:12;16004:19;;15663:366;;;:::o;16035:::-;16177:3;16198:67;16262:2;16257:3;16198:67;:::i;:::-;16191:74;;16274:93;16363:3;16274:93;:::i;:::-;16392:2;16387:3;16383:12;16376:19;;16035:366;;;:::o;16407:::-;16549:3;16570:67;16634:2;16629:3;16570:67;:::i;:::-;16563:74;;16646:93;16735:3;16646:93;:::i;:::-;16764:2;16759:3;16755:12;16748:19;;16407:366;;;:::o;16779:::-;16921:3;16942:67;17006:2;17001:3;16942:67;:::i;:::-;16935:74;;17018:93;17107:3;17018:93;:::i;:::-;17136:2;17131:3;17127:12;17120:19;;16779:366;;;:::o;17151:::-;17293:3;17314:67;17378:2;17373:3;17314:67;:::i;:::-;17307:74;;17390:93;17479:3;17390:93;:::i;:::-;17508:2;17503:3;17499:12;17492:19;;17151:366;;;:::o;17523:::-;17665:3;17686:67;17750:2;17745:3;17686:67;:::i;:::-;17679:74;;17762:93;17851:3;17762:93;:::i;:::-;17880:2;17875:3;17871:12;17864:19;;17523:366;;;:::o;17895:::-;18037:3;18058:67;18122:2;18117:3;18058:67;:::i;:::-;18051:74;;18134:93;18223:3;18134:93;:::i;:::-;18252:2;18247:3;18243:12;18236:19;;17895:366;;;:::o;18267:::-;18409:3;18430:67;18494:2;18489:3;18430:67;:::i;:::-;18423:74;;18506:93;18595:3;18506:93;:::i;:::-;18624:2;18619:3;18615:12;18608:19;;18267:366;;;:::o;18639:::-;18781:3;18802:67;18866:2;18861:3;18802:67;:::i;:::-;18795:74;;18878:93;18967:3;18878:93;:::i;:::-;18996:2;18991:3;18987:12;18980:19;;18639:366;;;:::o;19011:::-;19153:3;19174:67;19238:2;19233:3;19174:67;:::i;:::-;19167:74;;19250:93;19339:3;19250:93;:::i;:::-;19368:2;19363:3;19359:12;19352:19;;19011:366;;;:::o;19383:398::-;19542:3;19563:83;19644:1;19639:3;19563:83;:::i;:::-;19556:90;;19655:93;19744:3;19655:93;:::i;:::-;19773:1;19768:3;19764:11;19757:18;;19383:398;;;:::o;19787:366::-;19929:3;19950:67;20014:2;20009:3;19950:67;:::i;:::-;19943:74;;20026:93;20115:3;20026:93;:::i;:::-;20144:2;20139:3;20135:12;20128:19;;19787:366;;;:::o;20159:::-;20301:3;20322:67;20386:2;20381:3;20322:67;:::i;:::-;20315:74;;20398:93;20487:3;20398:93;:::i;:::-;20516:2;20511:3;20507:12;20500:19;;20159:366;;;:::o;20531:::-;20673:3;20694:67;20758:2;20753:3;20694:67;:::i;:::-;20687:74;;20770:93;20859:3;20770:93;:::i;:::-;20888:2;20883:3;20879:12;20872:19;;20531:366;;;:::o;20903:::-;21045:3;21066:67;21130:2;21125:3;21066:67;:::i;:::-;21059:74;;21142:93;21231:3;21142:93;:::i;:::-;21260:2;21255:3;21251:12;21244:19;;20903:366;;;:::o;21275:::-;21417:3;21438:67;21502:2;21497:3;21438:67;:::i;:::-;21431:74;;21514:93;21603:3;21514:93;:::i;:::-;21632:2;21627:3;21623:12;21616:19;;21275:366;;;:::o;21647:::-;21789:3;21810:67;21874:2;21869:3;21810:67;:::i;:::-;21803:74;;21886:93;21975:3;21886:93;:::i;:::-;22004:2;21999:3;21995:12;21988:19;;21647:366;;;:::o;22019:108::-;22096:24;22114:5;22096:24;:::i;:::-;22091:3;22084:37;22019:108;;:::o;22133:118::-;22220:24;22238:5;22220:24;:::i;:::-;22215:3;22208:37;22133:118;;:::o;22257:435::-;22437:3;22459:95;22550:3;22541:6;22459:95;:::i;:::-;22452:102;;22571:95;22662:3;22653:6;22571:95;:::i;:::-;22564:102;;22683:3;22676:10;;22257:435;;;;;:::o;22698:379::-;22882:3;22904:147;23047:3;22904:147;:::i;:::-;22897:154;;23068:3;23061:10;;22698:379;;;:::o;23083:222::-;23176:4;23214:2;23203:9;23199:18;23191:26;;23227:71;23295:1;23284:9;23280:17;23271:6;23227:71;:::i;:::-;23083:222;;;;:::o;23311:640::-;23506:4;23544:3;23533:9;23529:19;23521:27;;23558:71;23626:1;23615:9;23611:17;23602:6;23558:71;:::i;:::-;23639:72;23707:2;23696:9;23692:18;23683:6;23639:72;:::i;:::-;23721;23789:2;23778:9;23774:18;23765:6;23721:72;:::i;:::-;23840:9;23834:4;23830:20;23825:2;23814:9;23810:18;23803:48;23868:76;23939:4;23930:6;23868:76;:::i;:::-;23860:84;;23311:640;;;;;;;:::o;23957:373::-;24100:4;24138:2;24127:9;24123:18;24115:26;;24187:9;24181:4;24177:20;24173:1;24162:9;24158:17;24151:47;24215:108;24318:4;24309:6;24215:108;:::i;:::-;24207:116;;23957:373;;;;:::o;24336:210::-;24423:4;24461:2;24450:9;24446:18;24438:26;;24474:65;24536:1;24525:9;24521:17;24512:6;24474:65;:::i;:::-;24336:210;;;;:::o;24552:313::-;24665:4;24703:2;24692:9;24688:18;24680:26;;24752:9;24746:4;24742:20;24738:1;24727:9;24723:17;24716:47;24780:78;24853:4;24844:6;24780:78;:::i;:::-;24772:86;;24552:313;;;;:::o;24871:419::-;25037:4;25075:2;25064:9;25060:18;25052:26;;25124:9;25118:4;25114:20;25110:1;25099:9;25095:17;25088:47;25152:131;25278:4;25152:131;:::i;:::-;25144:139;;24871:419;;;:::o;25296:::-;25462:4;25500:2;25489:9;25485:18;25477:26;;25549:9;25543:4;25539:20;25535:1;25524:9;25520:17;25513:47;25577:131;25703:4;25577:131;:::i;:::-;25569:139;;25296:419;;;:::o;25721:::-;25887:4;25925:2;25914:9;25910:18;25902:26;;25974:9;25968:4;25964:20;25960:1;25949:9;25945:17;25938:47;26002:131;26128:4;26002:131;:::i;:::-;25994:139;;25721:419;;;:::o;26146:::-;26312:4;26350:2;26339:9;26335:18;26327:26;;26399:9;26393:4;26389:20;26385:1;26374:9;26370:17;26363:47;26427:131;26553:4;26427:131;:::i;:::-;26419:139;;26146:419;;;:::o;26571:::-;26737:4;26775:2;26764:9;26760:18;26752:26;;26824:9;26818:4;26814:20;26810:1;26799:9;26795:17;26788:47;26852:131;26978:4;26852:131;:::i;:::-;26844:139;;26571:419;;;:::o;26996:::-;27162:4;27200:2;27189:9;27185:18;27177:26;;27249:9;27243:4;27239:20;27235:1;27224:9;27220:17;27213:47;27277:131;27403:4;27277:131;:::i;:::-;27269:139;;26996:419;;;:::o;27421:::-;27587:4;27625:2;27614:9;27610:18;27602:26;;27674:9;27668:4;27664:20;27660:1;27649:9;27645:17;27638:47;27702:131;27828:4;27702:131;:::i;:::-;27694:139;;27421:419;;;:::o;27846:::-;28012:4;28050:2;28039:9;28035:18;28027:26;;28099:9;28093:4;28089:20;28085:1;28074:9;28070:17;28063:47;28127:131;28253:4;28127:131;:::i;:::-;28119:139;;27846:419;;;:::o;28271:::-;28437:4;28475:2;28464:9;28460:18;28452:26;;28524:9;28518:4;28514:20;28510:1;28499:9;28495:17;28488:47;28552:131;28678:4;28552:131;:::i;:::-;28544:139;;28271:419;;;:::o;28696:::-;28862:4;28900:2;28889:9;28885:18;28877:26;;28949:9;28943:4;28939:20;28935:1;28924:9;28920:17;28913:47;28977:131;29103:4;28977:131;:::i;:::-;28969:139;;28696:419;;;:::o;29121:::-;29287:4;29325:2;29314:9;29310:18;29302:26;;29374:9;29368:4;29364:20;29360:1;29349:9;29345:17;29338:47;29402:131;29528:4;29402:131;:::i;:::-;29394:139;;29121:419;;;:::o;29546:::-;29712:4;29750:2;29739:9;29735:18;29727:26;;29799:9;29793:4;29789:20;29785:1;29774:9;29770:17;29763:47;29827:131;29953:4;29827:131;:::i;:::-;29819:139;;29546:419;;;:::o;29971:::-;30137:4;30175:2;30164:9;30160:18;30152:26;;30224:9;30218:4;30214:20;30210:1;30199:9;30195:17;30188:47;30252:131;30378:4;30252:131;:::i;:::-;30244:139;;29971:419;;;:::o;30396:::-;30562:4;30600:2;30589:9;30585:18;30577:26;;30649:9;30643:4;30639:20;30635:1;30624:9;30620:17;30613:47;30677:131;30803:4;30677:131;:::i;:::-;30669:139;;30396:419;;;:::o;30821:::-;30987:4;31025:2;31014:9;31010:18;31002:26;;31074:9;31068:4;31064:20;31060:1;31049:9;31045:17;31038:47;31102:131;31228:4;31102:131;:::i;:::-;31094:139;;30821:419;;;:::o;31246:::-;31412:4;31450:2;31439:9;31435:18;31427:26;;31499:9;31493:4;31489:20;31485:1;31474:9;31470:17;31463:47;31527:131;31653:4;31527:131;:::i;:::-;31519:139;;31246:419;;;:::o;31671:::-;31837:4;31875:2;31864:9;31860:18;31852:26;;31924:9;31918:4;31914:20;31910:1;31899:9;31895:17;31888:47;31952:131;32078:4;31952:131;:::i;:::-;31944:139;;31671:419;;;:::o;32096:::-;32262:4;32300:2;32289:9;32285:18;32277:26;;32349:9;32343:4;32339:20;32335:1;32324:9;32320:17;32313:47;32377:131;32503:4;32377:131;:::i;:::-;32369:139;;32096:419;;;:::o;32521:::-;32687:4;32725:2;32714:9;32710:18;32702:26;;32774:9;32768:4;32764:20;32760:1;32749:9;32745:17;32738:47;32802:131;32928:4;32802:131;:::i;:::-;32794:139;;32521:419;;;:::o;32946:::-;33112:4;33150:2;33139:9;33135:18;33127:26;;33199:9;33193:4;33189:20;33185:1;33174:9;33170:17;33163:47;33227:131;33353:4;33227:131;:::i;:::-;33219:139;;32946:419;;;:::o;33371:::-;33537:4;33575:2;33564:9;33560:18;33552:26;;33624:9;33618:4;33614:20;33610:1;33599:9;33595:17;33588:47;33652:131;33778:4;33652:131;:::i;:::-;33644:139;;33371:419;;;:::o;33796:::-;33962:4;34000:2;33989:9;33985:18;33977:26;;34049:9;34043:4;34039:20;34035:1;34024:9;34020:17;34013:47;34077:131;34203:4;34077:131;:::i;:::-;34069:139;;33796:419;;;:::o;34221:::-;34387:4;34425:2;34414:9;34410:18;34402:26;;34474:9;34468:4;34464:20;34460:1;34449:9;34445:17;34438:47;34502:131;34628:4;34502:131;:::i;:::-;34494:139;;34221:419;;;:::o;34646:::-;34812:4;34850:2;34839:9;34835:18;34827:26;;34899:9;34893:4;34889:20;34885:1;34874:9;34870:17;34863:47;34927:131;35053:4;34927:131;:::i;:::-;34919:139;;34646:419;;;:::o;35071:::-;35237:4;35275:2;35264:9;35260:18;35252:26;;35324:9;35318:4;35314:20;35310:1;35299:9;35295:17;35288:47;35352:131;35478:4;35352:131;:::i;:::-;35344:139;;35071:419;;;:::o;35496:::-;35662:4;35700:2;35689:9;35685:18;35677:26;;35749:9;35743:4;35739:20;35735:1;35724:9;35720:17;35713:47;35777:131;35903:4;35777:131;:::i;:::-;35769:139;;35496:419;;;:::o;35921:::-;36087:4;36125:2;36114:9;36110:18;36102:26;;36174:9;36168:4;36164:20;36160:1;36149:9;36145:17;36138:47;36202:131;36328:4;36202:131;:::i;:::-;36194:139;;35921:419;;;:::o;36346:222::-;36439:4;36477:2;36466:9;36462:18;36454:26;;36490:71;36558:1;36547:9;36543:17;36534:6;36490:71;:::i;:::-;36346:222;;;;:::o;36574:129::-;36608:6;36635:20;;:::i;:::-;36625:30;;36664:33;36692:4;36684:6;36664:33;:::i;:::-;36574:129;;;:::o;36709:75::-;36742:6;36775:2;36769:9;36759:19;;36709:75;:::o;36790:307::-;36851:4;36941:18;36933:6;36930:30;36927:56;;;36963:18;;:::i;:::-;36927:56;37001:29;37023:6;37001:29;:::i;:::-;36993:37;;37085:4;37079;37075:15;37067:23;;36790:307;;;:::o;37103:308::-;37165:4;37255:18;37247:6;37244:30;37241:56;;;37277:18;;:::i;:::-;37241:56;37315:29;37337:6;37315:29;:::i;:::-;37307:37;;37399:4;37393;37389:15;37381:23;;37103:308;;;:::o;37417:132::-;37484:4;37507:3;37499:11;;37537:4;37532:3;37528:14;37520:22;;37417:132;;;:::o;37555:114::-;37622:6;37656:5;37650:12;37640:22;;37555:114;;;:::o;37675:98::-;37726:6;37760:5;37754:12;37744:22;;37675:98;;;:::o;37779:99::-;37831:6;37865:5;37859:12;37849:22;;37779:99;;;:::o;37884:113::-;37954:4;37986;37981:3;37977:14;37969:22;;37884:113;;;:::o;38003:184::-;38102:11;38136:6;38131:3;38124:19;38176:4;38171:3;38167:14;38152:29;;38003:184;;;;:::o;38193:168::-;38276:11;38310:6;38305:3;38298:19;38350:4;38345:3;38341:14;38326:29;;38193:168;;;;:::o;38367:147::-;38468:11;38505:3;38490:18;;38367:147;;;;:::o;38520:169::-;38604:11;38638:6;38633:3;38626:19;38678:4;38673:3;38669:14;38654:29;;38520:169;;;;:::o;38695:148::-;38797:11;38834:3;38819:18;;38695:148;;;;:::o;38849:305::-;38889:3;38908:20;38926:1;38908:20;:::i;:::-;38903:25;;38942:20;38960:1;38942:20;:::i;:::-;38937:25;;39096:1;39028:66;39024:74;39021:1;39018:81;39015:107;;;39102:18;;:::i;:::-;39015:107;39146:1;39143;39139:9;39132:16;;38849:305;;;;:::o;39160:185::-;39200:1;39217:20;39235:1;39217:20;:::i;:::-;39212:25;;39251:20;39269:1;39251:20;:::i;:::-;39246:25;;39290:1;39280:35;;39295:18;;:::i;:::-;39280:35;39337:1;39334;39330:9;39325:14;;39160:185;;;;:::o;39351:348::-;39391:7;39414:20;39432:1;39414:20;:::i;:::-;39409:25;;39448:20;39466:1;39448:20;:::i;:::-;39443:25;;39636:1;39568:66;39564:74;39561:1;39558:81;39553:1;39546:9;39539:17;39535:105;39532:131;;;39643:18;;:::i;:::-;39532:131;39691:1;39688;39684:9;39673:20;;39351:348;;;;:::o;39705:191::-;39745:4;39765:20;39783:1;39765:20;:::i;:::-;39760:25;;39799:20;39817:1;39799:20;:::i;:::-;39794:25;;39838:1;39835;39832:8;39829:34;;;39843:18;;:::i;:::-;39829:34;39888:1;39885;39881:9;39873:17;;39705:191;;;;:::o;39902:96::-;39939:7;39968:24;39986:5;39968:24;:::i;:::-;39957:35;;39902:96;;;:::o;40004:90::-;40038:7;40081:5;40074:13;40067:21;40056:32;;40004:90;;;:::o;40100:149::-;40136:7;40176:66;40169:5;40165:78;40154:89;;40100:149;;;:::o;40255:126::-;40292:7;40332:42;40325:5;40321:54;40310:65;;40255:126;;;:::o;40387:77::-;40424:7;40453:5;40442:16;;40387:77;;;:::o;40470:86::-;40505:7;40545:4;40538:5;40534:16;40523:27;;40470:86;;;:::o;40562:154::-;40646:6;40641:3;40636;40623:30;40708:1;40699:6;40694:3;40690:16;40683:27;40562:154;;;:::o;40722:307::-;40790:1;40800:113;40814:6;40811:1;40808:13;40800:113;;;40899:1;40894:3;40890:11;40884:18;40880:1;40875:3;40871:11;40864:39;40836:2;40833:1;40829:10;40824:15;;40800:113;;;40931:6;40928:1;40925:13;40922:101;;;41011:1;41002:6;40997:3;40993:16;40986:27;40922:101;40771:258;40722:307;;;:::o;41035:320::-;41079:6;41116:1;41110:4;41106:12;41096:22;;41163:1;41157:4;41153:12;41184:18;41174:81;;41240:4;41232:6;41228:17;41218:27;;41174:81;41302:2;41294:6;41291:14;41271:18;41268:38;41265:84;;;41321:18;;:::i;:::-;41265:84;41086:269;41035:320;;;:::o;41361:281::-;41444:27;41466:4;41444:27;:::i;:::-;41436:6;41432:40;41574:6;41562:10;41559:22;41538:18;41526:10;41523:34;41520:62;41517:88;;;41585:18;;:::i;:::-;41517:88;41625:10;41621:2;41614:22;41404:238;41361:281;;:::o;41648:233::-;41687:3;41710:24;41728:5;41710:24;:::i;:::-;41701:33;;41756:66;41749:5;41746:77;41743:103;;;41826:18;;:::i;:::-;41743:103;41873:1;41866:5;41862:13;41855:20;;41648:233;;;:::o;41887:176::-;41919:1;41936:20;41954:1;41936:20;:::i;:::-;41931:25;;41970:20;41988:1;41970:20;:::i;:::-;41965:25;;42009:1;41999:35;;42014:18;;:::i;:::-;41999:35;42055:1;42052;42048:9;42043:14;;41887:176;;;;:::o;42069:180::-;42117:77;42114:1;42107:88;42214:4;42211:1;42204:15;42238:4;42235:1;42228:15;42255:180;42303:77;42300:1;42293:88;42400:4;42397:1;42390:15;42424:4;42421:1;42414:15;42441:180;42489:77;42486:1;42479:88;42586:4;42583:1;42576:15;42610:4;42607:1;42600:15;42627:180;42675:77;42672:1;42665:88;42772:4;42769:1;42762:15;42796:4;42793:1;42786:15;42813:180;42861:77;42858:1;42851:88;42958:4;42955:1;42948:15;42982:4;42979:1;42972:15;42999:180;43047:77;43044:1;43037:88;43144:4;43141:1;43134:15;43168:4;43165:1;43158:15;43185:117;43294:1;43291;43284:12;43308:117;43417:1;43414;43407:12;43431:117;43540:1;43537;43530:12;43554:117;43663:1;43660;43653:12;43677:117;43786:1;43783;43776:12;43800:117;43909:1;43906;43899:12;43923:102;43964:6;44015:2;44011:7;44006:2;43999:5;43995:14;43991:28;43981:38;;43923:102;;;:::o;44031:230::-;44171:34;44167:1;44159:6;44155:14;44148:58;44240:13;44235:2;44227:6;44223:15;44216:38;44031:230;:::o;44267:237::-;44407:34;44403:1;44395:6;44391:14;44384:58;44476:20;44471:2;44463:6;44459:15;44452:45;44267:237;:::o;44510:225::-;44650:34;44646:1;44638:6;44634:14;44627:58;44719:8;44714:2;44706:6;44702:15;44695:33;44510:225;:::o;44741:224::-;44881:34;44877:1;44869:6;44865:14;44858:58;44950:7;44945:2;44937:6;44933:15;44926:32;44741:224;:::o;44971:178::-;45111:30;45107:1;45099:6;45095:14;45088:54;44971:178;:::o;45155:::-;45295:30;45291:1;45283:6;45279:14;45272:54;45155:178;:::o;45339:223::-;45479:34;45475:1;45467:6;45463:14;45456:58;45548:6;45543:2;45535:6;45531:15;45524:31;45339:223;:::o;45568:175::-;45708:27;45704:1;45696:6;45692:14;45685:51;45568:175;:::o;45749:231::-;45889:34;45885:1;45877:6;45873:14;45866:58;45958:14;45953:2;45945:6;45941:15;45934:39;45749:231;:::o;45986:243::-;46126:34;46122:1;46114:6;46110:14;46103:58;46195:26;46190:2;46182:6;46178:15;46171:51;45986:243;:::o;46235:229::-;46375:34;46371:1;46363:6;46359:14;46352:58;46444:12;46439:2;46431:6;46427:15;46420:37;46235:229;:::o;46470:228::-;46610:34;46606:1;46598:6;46594:14;46587:58;46679:11;46674:2;46666:6;46662:15;46655:36;46470:228;:::o;46704:172::-;46844:24;46840:1;46832:6;46828:14;46821:48;46704:172;:::o;46882:223::-;47022:34;47018:1;47010:6;47006:14;46999:58;47091:6;47086:2;47078:6;47074:15;47067:31;46882:223;:::o;47111:182::-;47251:34;47247:1;47239:6;47235:14;47228:58;47111:182;:::o;47299:231::-;47439:34;47435:1;47427:6;47423:14;47416:58;47508:14;47503:2;47495:6;47491:15;47484:39;47299:231;:::o;47536:182::-;47676:34;47672:1;47664:6;47660:14;47653:58;47536:182;:::o;47724:172::-;47864:24;47860:1;47852:6;47848:14;47841:48;47724:172;:::o;47902:234::-;48042:34;48038:1;48030:6;48026:14;48019:58;48111:17;48106:2;48098:6;48094:15;48087:42;47902:234;:::o;48142:220::-;48282:34;48278:1;48270:6;48266:14;48259:58;48351:3;48346:2;48338:6;48334:15;48327:28;48142:220;:::o;48368:169::-;48508:21;48504:1;48496:6;48492:14;48485:45;48368:169;:::o;48543:114::-;;:::o;48663:168::-;48803:20;48799:1;48791:6;48787:14;48780:44;48663:168;:::o;48837:236::-;48977:34;48973:1;48965:6;48961:14;48954:58;49046:19;49041:2;49033:6;49029:15;49022:44;48837:236;:::o;49079:231::-;49219:34;49215:1;49207:6;49203:14;49196:58;49288:14;49283:2;49275:6;49271:15;49264:39;49079:231;:::o;49316:224::-;49456:34;49452:1;49444:6;49440:14;49433:58;49525:7;49520:2;49512:6;49508:15;49501:32;49316:224;:::o;49546:173::-;49686:25;49682:1;49674:6;49670:14;49663:49;49546:173;:::o;49725:177::-;49865:29;49861:1;49853:6;49849:14;49842:53;49725:177;:::o;49908:122::-;49981:24;49999:5;49981:24;:::i;:::-;49974:5;49971:35;49961:63;;50020:1;50017;50010:12;49961:63;49908:122;:::o;50036:116::-;50106:21;50121:5;50106:21;:::i;:::-;50099:5;50096:32;50086:60;;50142:1;50139;50132:12;50086:60;50036:116;:::o;50158:120::-;50230:23;50247:5;50230:23;:::i;:::-;50223:5;50220:34;50210:62;;50268:1;50265;50258:12;50210:62;50158:120;:::o;50284:122::-;50357:24;50375:5;50357:24;:::i;:::-;50350:5;50347:35;50337:63;;50396:1;50393;50386:12;50337:63;50284:122;:::o;50412:118::-;50483:22;50499:5;50483:22;:::i;:::-;50476:5;50473:33;50463:61;;50520:1;50517;50510:12;50463:61;50412:118;:::o

Swarm Source

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