ETH Price: $3,419.83 (-1.04%)
Gas: 8 Gwei

Token

COINRUNNERSNFT (COINRUNNERS)
 

Overview

Max Total Supply

485 COINRUNNERS

Holders

179

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 COINRUNNERS
0xd00c1ca0b8c03eda314e7d6bbbb4ce8326481076
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The official NFT project for the COINRUNNERS movie consists of 156 images based on the storyboard for the film.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
COINRUNNERSNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

/*

COINRUNNERS NFT

*/

contract COINRUNNERSNFT is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;

    uint256 public constant COINRUNNERS_MAX = 15000;
    uint256 public constant COINRUNNERS_PER_MINT = 1000;
    uint256 public COINRUNNERS_PRICE = 0.0777 ether;

    mapping(address => bool) public presalerList;
    mapping(string => bool) private _usedNonces;
    
    string private _contractURI;
    string private _tokenBaseURI = "https://coinrunnersnft.herokuapp.com/api/metadata/";
    address private _splitter = 0x45be6626d2Dc02193B8401192b08F178e6766e68;
    address private _signer = 0x8Cc1764cAbDE44437445aa87055f98F11aFD8942;

    string public proof;
    uint256 public presaleAmountMinted;
    uint256 public publicAmountMinted;
    bool public presaleLive;
    bool public saleLive;
    bool public locked;
    bool public priceLocked;
    
    constructor() ERC721("COINRUNNERSNFT", "COINRUNNERS") { }
    
    modifier notLocked {
        require(!locked, "Contract metadata methods are locked");
        _;
    }

    function addToPresaleList(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            require(!presalerList[entry], "DUPLICATE_ENTRY");

            presalerList[entry] = true;
        }   
    }

    function removeFromPresaleList(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            
            presalerList[entry] = false;
        }
    }
    
    function hashTransaction(address sender, uint256 qty, string memory nonce) private pure returns(bytes32) {
        bytes32 hash = keccak256(abi.encodePacked(
            "\x19Ethereum Signed Message:\n32",
            keccak256(abi.encodePacked(sender, qty, nonce)))
        );
        
        return hash;
    }
    
    function matchAddresSigner(bytes32 hash, bytes memory signature) private view returns(bool) {
        return _signer == hash.recover(signature);
    }
    
    function buy(bytes32 hash, bytes memory signature, string memory nonce, uint256 tokenQuantity) external payable {
        require(saleLive, "SALE_CLOSED");
        require(matchAddresSigner(hash, signature), "DIRECT_MINT_DISALLOWED");
        require(!_usedNonces[nonce], "NONCE_USED");
        require(hashTransaction(msg.sender, tokenQuantity, nonce) == hash, "HASH_FAIL");
        require(totalSupply() < COINRUNNERS_MAX, "OUT_OF_STOCK");
        require(presaleAmountMinted + publicAmountMinted + tokenQuantity <= COINRUNNERS_MAX, "EXCEED_PUBLIC");
        require(tokenQuantity <= COINRUNNERS_PER_MINT, "EXCEED_COINRUNNERS_PER_MINT");
        require(COINRUNNERS_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        
        for(uint256 i = 0; i < tokenQuantity; i++) {
            publicAmountMinted++;
            _safeMint(msg.sender, totalSupply() + 1);
        }
        
        _usedNonces[nonce] = true;
    }

    function presaleBuy(bytes32 hash, bytes memory signature, string memory nonce, uint256 tokenQuantity) external payable {
        require(!saleLive && presaleLive, "PRESALE_CLOSED");
        require(matchAddresSigner(hash, signature), "DIRECT_MINT_DISALLOWED");
        require(!_usedNonces[nonce], "NONCE_USED");
        require(hashTransaction(msg.sender, tokenQuantity, nonce) == hash, "HASH_FAIL");
        require(presalerList[msg.sender], "NOT_QUALIFIED");
        require(totalSupply() < COINRUNNERS_MAX, "OUT_OF_STOCK");
        require(presaleAmountMinted + tokenQuantity <= COINRUNNERS_MAX, "EXCEED_PRIVATE");
        require(tokenQuantity <= COINRUNNERS_PER_MINT, "EXCEED_COINRUNNERS_PER_MINT");
        require(COINRUNNERS_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        
        for (uint256 i = 0; i < tokenQuantity; i++) {
            presaleAmountMinted++;
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }
    
    function withdraw() external onlyOwner {
        payable(_splitter).transfer(address(this).balance);
    }

    // Owner functions for enabling presale, sale, revealing and setting the provenance hash
    function lockMetadata() external onlyOwner {
        locked = true;
    }

    function setPrice(uint256 price) external onlyOwner {
        require(!priceLocked, "PRICE_LOCKED");
        COINRUNNERS_PRICE = price;
    }

    function togglePresale() external onlyOwner {
        if (!priceLocked) priceLocked = true;
        presaleLive = !presaleLive;
    }
    
    function toggleSale() external onlyOwner {
        if (!priceLocked) priceLocked = true;
        saleLive = !saleLive;
    }
    
    function setSigner(address addr) external onlyOwner {
        _signer = addr;
    }
    
    function setPaymentSplitter(address splitter) external onlyOwner {
        _splitter = splitter;
    }
    
    function setProvenanceHash(string calldata hash) external onlyOwner notLocked {
        proof = hash;
    }
    
    function setContractURI(string calldata URI) external onlyOwner notLocked {
        _contractURI = URI;
    }
    
    function setBaseURI(string calldata URI) external onlyOwner notLocked {
        _tokenBaseURI = URI;
    }
    
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }
    
    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), "Cannot query non-existent token");
        
        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COINRUNNERS_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COINRUNNERS_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COINRUNNERS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"presaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proof","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"splitter","type":"address"}],"name":"setPaymentSplitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526701140bbd030c4000600b556040518060600160405280603281526020016200638e60329139600f9080519060200190620000419291906200028e565b507345be6626d2dc02193b8401192b08f178e6766e68601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738cc1764cabde44437445aa87055f98f11afd8942601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000f957600080fd5b506040518060400160405280600e81526020017f434f494e52554e4e4552534e46540000000000000000000000000000000000008152506040518060400160405280600b81526020017f434f494e52554e4e45525300000000000000000000000000000000000000000081525081600090805190602001906200017e9291906200028e565b508060019080519060200190620001979291906200028e565b505050620001ba620001ae620001c060201b60201c565b620001c860201b60201c565b620003a3565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029c906200033e565b90600052602060002090601f016020900481019282620002c057600085556200030c565b82601f10620002db57805160ff19168380011785556200030c565b828001600101855582156200030c579182015b828111156200030b578251825591602001919060010190620002ee565b5b5090506200031b91906200031f565b5090565b5b808211156200033a57600081600090555060010162000320565b5090565b600060028204905060018216806200035757607f821691505b602082108114156200036e576200036d62000374565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615fdb80620003b36000396000f3fe6080604052600436106102725760003560e01c80637619bea31161014f578063a22cb465116100c1578063e8a3d4851161007a578063e8a3d485146108f8578063e985e9c514610923578063ea2470ab14610960578063f2fde38b1461098b578063f38b2cd5146109b4578063faf924cf146109df57610272565b8063a22cb465146107ea578063b179e06014610813578063b88d4fde1461083c578063c87b56dd14610865578063cf309012146108a2578063e081b781146108cd57610272565b8063938e3d7b11610113578063938e3d7b146106fb578063940f1ada1461072457806395d89b411461074f578063989bdbb61461077a5780639cf2e8d6146107915780639ec70f19146107ce57610272565b80637619bea31461063a5780637d8966e41461066557806383a9e0491461067c5780638da5cb5b146106a757806391b7f5ed146106d257610272565b806334b84f83116101e85780636352211e116101ac5780636352211e1461052e5780636b29b79f1461056b5780636c19e7831461059457806370a08231146105bd578063715018a6146105fa5780637204a3c91461061157610272565b806334b84f831461046c5780633ccfd60b1461048857806342842e0e1461049f5780634f6ccce7146104c857806355f804b31461050557610272565b806318160ddd1161023a57806318160ddd1461036e57806323b872dd146103995780632c358c4d146103c25780632f745c59146103ed578063342a891f1461042a578063343937431461045557610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780631096952314610345575b600080fd5b34801561028357600080fd5b5061029e6004803603810190610299919061436b565b610a0a565b6040516102ab9190614c24565b60405180910390f35b3480156102c057600080fd5b506102c9610a84565b6040516102d69190614c84565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190614412565b610b16565b6040516103139190614bbd565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061423f565b610b9b565b005b34801561035157600080fd5b5061036c600480360381019061036791906143c5565b610cb3565b005b34801561037a57600080fd5b50610383610d95565b6040516103909190615146565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190614129565b610da2565b005b3480156103ce57600080fd5b506103d7610e02565b6040516103e49190615146565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f919061423f565b610e08565b6040516104219190615146565b60405180910390f35b34801561043657600080fd5b5061043f610ead565b60405161044c9190615146565b60405180910390f35b34801561046157600080fd5b5061046a610eb3565b005b610486600480360381019061048191906142cc565b610f8b565b005b34801561049457600080fd5b5061049d61130c565b005b3480156104ab57600080fd5b506104c660048036038101906104c19190614129565b6113f3565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190614412565b611413565b6040516104fc9190615146565b60405180910390f35b34801561051157600080fd5b5061052c600480360381019061052791906143c5565b611484565b005b34801561053a57600080fd5b5061055560048036038101906105509190614412565b611566565b6040516105629190614bbd565b60405180910390f35b34801561057757600080fd5b50610592600480360381019061058d91906140bc565b611618565b005b3480156105a057600080fd5b506105bb60048036038101906105b691906140bc565b6116d8565b005b3480156105c957600080fd5b506105e460048036038101906105df91906140bc565b611798565b6040516105f19190615146565b60405180910390f35b34801561060657600080fd5b5061060f611850565b005b34801561061d57600080fd5b506106386004803603810190610633919061427f565b6118d8565b005b34801561064657600080fd5b5061064f611afc565b60405161065c9190615146565b60405180910390f35b34801561067157600080fd5b5061067a611b02565b005b34801561068857600080fd5b50610691611bda565b60405161069e9190614c24565b60405180910390f35b3480156106b357600080fd5b506106bc611bed565b6040516106c99190614bbd565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190614412565b611c17565b005b34801561070757600080fd5b50610722600480360381019061071d91906143c5565b611ced565b005b34801561073057600080fd5b50610739611dcf565b6040516107469190615146565b60405180910390f35b34801561075b57600080fd5b50610764611dd5565b6040516107719190614c84565b60405180910390f35b34801561078657600080fd5b5061078f611e67565b005b34801561079d57600080fd5b506107b860048036038101906107b391906140bc565b611f00565b6040516107c59190614c24565b60405180910390f35b6107e860048036038101906107e391906142cc565b611f20565b005b3480156107f657600080fd5b50610811600480360381019061080c91906141ff565b612240565b005b34801561081f57600080fd5b5061083a6004803603810190610835919061427f565b6123c1565b005b34801561084857600080fd5b50610863600480360381019061085e919061417c565b612558565b005b34801561087157600080fd5b5061088c60048036038101906108879190614412565b6125ba565b6040516108999190614c84565b60405180910390f35b3480156108ae57600080fd5b506108b7612636565b6040516108c49190614c24565b60405180910390f35b3480156108d957600080fd5b506108e2612649565b6040516108ef9190614c24565b60405180910390f35b34801561090457600080fd5b5061090d61265c565b60405161091a9190614c84565b60405180910390f35b34801561092f57600080fd5b5061094a600480360381019061094591906140e9565b6126ee565b6040516109579190614c24565b60405180910390f35b34801561096c57600080fd5b50610975612782565b6040516109829190614c24565b60405180910390f35b34801561099757600080fd5b506109b260048036038101906109ad91906140bc565b612795565b005b3480156109c057600080fd5b506109c961288d565b6040516109d69190615146565b60405180910390f35b3480156109eb57600080fd5b506109f4612893565b604051610a019190614c84565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7d5750610a7c82612921565b5b9050919050565b606060008054610a9390615422565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90615422565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b5050505050905090565b6000610b2182612a03565b610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790614f86565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba682611566565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e90615086565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c36612a6f565b73ffffffffffffffffffffffffffffffffffffffff161480610c655750610c6481610c5f612a6f565b6126ee565b5b610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90614ee6565b60405180910390fd5b610cae8383612a77565b505050565b610cbb612a6f565b73ffffffffffffffffffffffffffffffffffffffff16610cd9611bed565b73ffffffffffffffffffffffffffffffffffffffff1614610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2690614fa6565b60405180910390fd5b601560029054906101000a900460ff1615610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690614fe6565b60405180910390fd5b818160129190610d90929190613e0f565b505050565b6000600880549050905090565b610db3610dad612a6f565b82612b30565b610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de9906150c6565b60405180910390fd5b610dfd838383612c0e565b505050565b6103e881565b6000610e1383611798565b8210610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90614d46565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60135481565b610ebb612a6f565b73ffffffffffffffffffffffffffffffffffffffff16610ed9611bed565b73ffffffffffffffffffffffffffffffffffffffff1614610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690614fa6565b60405180910390fd5b601560039054906101000a900460ff16610f5f576001601560036101000a81548160ff0219169083151502179055505b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b601560019054906101000a900460ff16158015610fb45750601560009054906101000a900460ff165b610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614cc6565b60405180910390fd5b610ffd8484612e6a565b61103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103390614d06565b60405180910390fd5b600d8260405161104c9190614b5c565b908152602001604051809103902060009054906101000a900460ff16156110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f90615026565b60405180910390fd5b836110b4338385612ed7565b146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90614ec6565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790615006565b60405180910390fd5b613a9861118b610d95565b106111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c290614e06565b60405180910390fd5b613a98816013546111dc9190615240565b111561121d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121490615106565b60405180910390fd5b6103e8811115611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990614ea6565b60405180910390fd5b3481600b5461127191906152c7565b11156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990615126565b60405180910390fd5b60005b8181101561130557601360008154809291906112d090615485565b91905055506112f23360016112e3610d95565b6112ed9190615240565b612f38565b80806112fd90615485565b9150506112b5565b5050505050565b611314612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611332611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90614fa6565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113f0573d6000803e3d6000fd5b50565b61140e83838360405180602001604052806000815250612558565b505050565b600061141d610d95565b821061145e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611455906150e6565b60405180910390fd5b6008828154811061147257611471615622565b5b90600052602060002001549050919050565b61148c612a6f565b73ffffffffffffffffffffffffffffffffffffffff166114aa611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614fa6565b60405180910390fd5b601560029054906101000a900460ff1615611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790614fe6565b60405180910390fd5b8181600f9190611561929190613e0f565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160690614f26565b60405180910390fd5b80915050919050565b611620612a6f565b73ffffffffffffffffffffffffffffffffffffffff1661163e611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90614fa6565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6116e0612a6f565b73ffffffffffffffffffffffffffffffffffffffff166116fe611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90614fa6565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180090614f06565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611858612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611876611bed565b73ffffffffffffffffffffffffffffffffffffffff16146118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390614fa6565b60405180910390fd5b6118d66000612f56565b565b6118e0612a6f565b73ffffffffffffffffffffffffffffffffffffffff166118fe611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90614fa6565b60405180910390fd5b60005b82829050811015611af757600083838381811061197757611976615622565b5b905060200201602081019061198c91906140bc565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f590614ce6565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290614e86565b60405180910390fd5b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611aef90615485565b915050611957565b505050565b613a9881565b611b0a612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611b28611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614fa6565b60405180910390fd5b601560039054906101000a900460ff16611bae576001601560036101000a81548160ff0219169083151502179055505b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b601560009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c1f612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611c3d611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90614fa6565b60405180910390fd5b601560039054906101000a900460ff1615611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda90615066565b60405180910390fd5b80600b8190555050565b611cf5612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611d13611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614fa6565b60405180910390fd5b601560029054906101000a900460ff1615611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090614fe6565b60405180910390fd5b8181600e9190611dca929190613e0f565b505050565b60145481565b606060018054611de490615422565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1090615422565b8015611e5d5780601f10611e3257610100808354040283529160200191611e5d565b820191906000526020600020905b815481529060010190602001808311611e4057829003601f168201915b5050505050905090565b611e6f612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611e8d611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda90614fa6565b60405180910390fd5b6001601560026101000a81548160ff021916908315150217905550565b600c6020528060005260406000206000915054906101000a900460ff1681565b601560019054906101000a900460ff16611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6690614e46565b60405180910390fd5b611f798484612e6a565b611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf90614d06565b60405180910390fd5b600d82604051611fc89190614b5c565b908152602001604051809103902060009054906101000a900460ff1615612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b90615026565b60405180910390fd5b83612030338385612ed7565b14612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614ec6565b60405180910390fd5b613a9861207b610d95565b106120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290614e06565b60405180910390fd5b613a98816014546013546120cf9190615240565b6120d99190615240565b111561211a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612111906150a6565b60405180910390fd5b6103e881111561215f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215690614ea6565b60405180910390fd5b3481600b5461216e91906152c7565b11156121af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a690615126565b60405180910390fd5b60005b8181101561220257601460008154809291906121cd90615485565b91905055506121ef3360016121e0610d95565b6121ea9190615240565b612f38565b80806121fa90615485565b9150506121b2565b506001600d836040516122159190614b5c565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050505050565b612248612a6f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90614de6565b60405180910390fd5b80600560006122c3612a6f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612370612a6f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123b59190614c24565b60405180910390a35050565b6123c9612a6f565b73ffffffffffffffffffffffffffffffffffffffff166123e7611bed565b73ffffffffffffffffffffffffffffffffffffffff161461243d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243490614fa6565b60405180910390fd5b60005b828290508110156125535760008383838181106124605761245f615622565b5b905060200201602081019061247591906140bc565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124de90614ce6565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061254b90615485565b915050612440565b505050565b612569612563612a6f565b83612b30565b6125a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259f906150c6565b60405180910390fd5b6125b48484848461301c565b50505050565b60606125c582612a03565b612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb90615046565b60405180910390fd5b600f61260f83613078565b604051602001612620929190614b73565b6040516020818303038152906040529050919050565b601560029054906101000a900460ff1681565b601560019054906101000a900460ff1681565b6060600e805461266b90615422565b80601f016020809104026020016040519081016040528092919081815260200182805461269790615422565b80156126e45780601f106126b9576101008083540402835291602001916126e4565b820191906000526020600020905b8154815290600101906020018083116126c757829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560039054906101000a900460ff1681565b61279d612a6f565b73ffffffffffffffffffffffffffffffffffffffff166127bb611bed565b73ffffffffffffffffffffffffffffffffffffffff1614612811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280890614fa6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287890614d86565b60405180910390fd5b61288a81612f56565b50565b600b5481565b601280546128a090615422565b80601f01602080910402602001604051908101604052809291908181526020018280546128cc90615422565b80156129195780601f106128ee57610100808354040283529160200191612919565b820191906000526020600020905b8154815290600101906020018083116128fc57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129fc57506129fb826131d9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612aea83611566565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b3b82612a03565b612b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7190614e66565b60405180910390fd5b6000612b8583611566565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612bf457508373ffffffffffffffffffffffffffffffffffffffff16612bdc84610b16565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c055750612c0481856126ee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c2e82611566565b73ffffffffffffffffffffffffffffffffffffffff1614612c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7b90614fc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ceb90614dc6565b60405180910390fd5b612cff838383613243565b612d0a600082612a77565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5a9190615321565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612db19190615240565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612e7f828461335790919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080848484604051602001612eef93929190614b23565b60405160208183030381529060405280519060200120604051602001612f159190614b97565b604051602081830303815290604052805190602001209050809150509392505050565b612f5282826040518060200160405280600081525061337e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613027848484612c0e565b613033848484846133d9565b613072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306990614d66565b60405180910390fd5b50505050565b606060008214156130c0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131d4565b600082905060005b600082146130f25780806130db90615485565b915050600a826130eb9190615296565b91506130c8565b60008167ffffffffffffffff81111561310e5761310d615651565b5b6040519080825280601f01601f1916602001820160405280156131405781602001600182028036833780820191505090505b5090505b600085146131cd576001826131599190615321565b9150600a856131689190615506565b60306131749190615240565b60f81b81838151811061318a57613189615622565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131c69190615296565b9450613144565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61324e838383613570565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132915761328c81613575565b6132d0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132cf576132ce83826135be565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133135761330e8161372b565b613352565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133515761335082826137fc565b5b5b505050565b6000806000613366858561387b565b91509150613373816138fe565b819250505092915050565b6133888383613ad3565b61339560008484846133d9565b6133d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cb90614d66565b60405180910390fd5b505050565b60006133fa8473ffffffffffffffffffffffffffffffffffffffff16613ca1565b15613563578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613423612a6f565b8786866040518563ffffffff1660e01b81526004016134459493929190614bd8565b602060405180830381600087803b15801561345f57600080fd5b505af192505050801561349057506040513d601f19601f8201168201806040525081019061348d9190614398565b60015b613513573d80600081146134c0576040519150601f19603f3d011682016040523d82523d6000602084013e6134c5565b606091505b5060008151141561350b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350290614d66565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613568565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135cb84611798565b6135d59190615321565b90506000600760008481526020019081526020016000205490508181146136ba576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061373f9190615321565b905060006009600084815260200190815260200160002054905060006008838154811061376f5761376e615622565b5b90600052602060002001549050806008838154811061379157613790615622565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137e0576137df6155f3565b5b6001900381819060005260206000200160009055905550505050565b600061380783611798565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000806041835114156138bd5760008060006020860151925060408601519150606086015160001a90506138b187828585613cb4565b945094505050506138f7565b6040835114156138ee5760008060208501519150604085015190506138e3868383613dc1565b9350935050506138f7565b60006002915091505b9250929050565b6000600481111561391257613911615595565b5b81600481111561392557613924615595565b5b141561393057613ad0565b6001600481111561394457613943615595565b5b81600481111561395757613956615595565b5b1415613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398f90614ca6565b60405180910390fd5b600260048111156139ac576139ab615595565b5b8160048111156139bf576139be615595565b5b1415613a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f790614d26565b60405180910390fd5b60036004811115613a1457613a13615595565b5b816004811115613a2757613a26615595565b5b1415613a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5f90614e26565b60405180910390fd5b600480811115613a7b57613a7a615595565b5b816004811115613a8e57613a8d615595565b5b1415613acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac690614f46565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b3a90614f66565b60405180910390fd5b613b4c81612a03565b15613b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8390614da6565b60405180910390fd5b613b9860008383613243565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613be89190615240565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613cef576000600391509150613db8565b601b8560ff1614158015613d075750601c8560ff1614155b15613d19576000600491509150613db8565b600060018787878760405160008152602001604052604051613d3e9493929190614c3f565b6020604051602081039080840390855afa158015613d60573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613daf57600060019250925050613db8565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613e0187828885613cb4565b935093505050935093915050565b828054613e1b90615422565b90600052602060002090601f016020900481019282613e3d5760008555613e84565b82601f10613e5657803560ff1916838001178555613e84565b82800160010185558215613e84579182015b82811115613e83578235825591602001919060010190613e68565b5b509050613e919190613e95565b5090565b5b80821115613eae576000816000905550600101613e96565b5090565b6000613ec5613ec084615186565b615161565b905082815260208101848484011115613ee157613ee061568f565b5b613eec8482856153e0565b509392505050565b6000613f07613f02846151b7565b615161565b905082815260208101848484011115613f2357613f2261568f565b5b613f2e8482856153e0565b509392505050565b600081359050613f4581615f32565b92915050565b60008083601f840112613f6157613f60615685565b5b8235905067ffffffffffffffff811115613f7e57613f7d615680565b5b602083019150836020820283011115613f9a57613f9961568a565b5b9250929050565b600081359050613fb081615f49565b92915050565b600081359050613fc581615f60565b92915050565b600081359050613fda81615f77565b92915050565b600081519050613fef81615f77565b92915050565b600082601f83011261400a57614009615685565b5b813561401a848260208601613eb2565b91505092915050565b60008083601f84011261403957614038615685565b5b8235905067ffffffffffffffff81111561405657614055615680565b5b6020830191508360018202830111156140725761407161568a565b5b9250929050565b600082601f83011261408e5761408d615685565b5b813561409e848260208601613ef4565b91505092915050565b6000813590506140b681615f8e565b92915050565b6000602082840312156140d2576140d1615699565b5b60006140e084828501613f36565b91505092915050565b60008060408385031215614100576140ff615699565b5b600061410e85828601613f36565b925050602061411f85828601613f36565b9150509250929050565b60008060006060848603121561414257614141615699565b5b600061415086828701613f36565b935050602061416186828701613f36565b9250506040614172868287016140a7565b9150509250925092565b6000806000806080858703121561419657614195615699565b5b60006141a487828801613f36565b94505060206141b587828801613f36565b93505060406141c6878288016140a7565b925050606085013567ffffffffffffffff8111156141e7576141e6615694565b5b6141f387828801613ff5565b91505092959194509250565b6000806040838503121561421657614215615699565b5b600061422485828601613f36565b925050602061423585828601613fa1565b9150509250929050565b6000806040838503121561425657614255615699565b5b600061426485828601613f36565b9250506020614275858286016140a7565b9150509250929050565b6000806020838503121561429657614295615699565b5b600083013567ffffffffffffffff8111156142b4576142b3615694565b5b6142c085828601613f4b565b92509250509250929050565b600080600080608085870312156142e6576142e5615699565b5b60006142f487828801613fb6565b945050602085013567ffffffffffffffff81111561431557614314615694565b5b61432187828801613ff5565b935050604085013567ffffffffffffffff81111561434257614341615694565b5b61434e87828801614079565b925050606061435f878288016140a7565b91505092959194509250565b60006020828403121561438157614380615699565b5b600061438f84828501613fcb565b91505092915050565b6000602082840312156143ae576143ad615699565b5b60006143bc84828501613fe0565b91505092915050565b600080602083850312156143dc576143db615699565b5b600083013567ffffffffffffffff8111156143fa576143f9615694565b5b61440685828601614023565b92509250509250929050565b60006020828403121561442857614427615699565b5b6000614436848285016140a7565b91505092915050565b61444881615355565b82525050565b61445f61445a82615355565b6154ce565b82525050565b61446e81615367565b82525050565b61447d81615373565b82525050565b61449461448f82615373565b6154e0565b82525050565b60006144a5826151fd565b6144af8185615213565b93506144bf8185602086016153ef565b6144c88161569e565b840191505092915050565b60006144de82615208565b6144e88185615224565b93506144f88185602086016153ef565b6145018161569e565b840191505092915050565b600061451782615208565b6145218185615235565b93506145318185602086016153ef565b80840191505092915050565b6000815461454a81615422565b6145548186615235565b9450600182166000811461456f5760018114614580576145b3565b60ff198316865281860193506145b3565b614589856151e8565b60005b838110156145ab5781548189015260018201915060208101905061458c565b838801955050505b50505092915050565b60006145c9601883615224565b91506145d4826156bc565b602082019050919050565b60006145ec600e83615224565b91506145f7826156e5565b602082019050919050565b600061460f600c83615224565b915061461a8261570e565b602082019050919050565b6000614632601683615224565b915061463d82615737565b602082019050919050565b6000614655601f83615224565b915061466082615760565b602082019050919050565b6000614678601c83615235565b915061468382615789565b601c82019050919050565b600061469b602b83615224565b91506146a6826157b2565b604082019050919050565b60006146be603283615224565b91506146c982615801565b604082019050919050565b60006146e1602683615224565b91506146ec82615850565b604082019050919050565b6000614704601c83615224565b915061470f8261589f565b602082019050919050565b6000614727602483615224565b9150614732826158c8565b604082019050919050565b600061474a601983615224565b915061475582615917565b602082019050919050565b600061476d600c83615224565b915061477882615940565b602082019050919050565b6000614790602283615224565b915061479b82615969565b604082019050919050565b60006147b3600b83615224565b91506147be826159b8565b602082019050919050565b60006147d6602c83615224565b91506147e1826159e1565b604082019050919050565b60006147f9600f83615224565b915061480482615a30565b602082019050919050565b600061481c601b83615224565b915061482782615a59565b602082019050919050565b600061483f600983615224565b915061484a82615a82565b602082019050919050565b6000614862603883615224565b915061486d82615aab565b604082019050919050565b6000614885602a83615224565b915061489082615afa565b604082019050919050565b60006148a8602983615224565b91506148b382615b49565b604082019050919050565b60006148cb602283615224565b91506148d682615b98565b604082019050919050565b60006148ee602083615224565b91506148f982615be7565b602082019050919050565b6000614911602c83615224565b915061491c82615c10565b604082019050919050565b6000614934602083615224565b915061493f82615c5f565b602082019050919050565b6000614957602983615224565b915061496282615c88565b604082019050919050565b600061497a602483615224565b915061498582615cd7565b604082019050919050565b600061499d600d83615224565b91506149a882615d26565b602082019050919050565b60006149c0600a83615224565b91506149cb82615d4f565b602082019050919050565b60006149e3601f83615224565b91506149ee82615d78565b602082019050919050565b6000614a06600c83615224565b9150614a1182615da1565b602082019050919050565b6000614a29602183615224565b9150614a3482615dca565b604082019050919050565b6000614a4c600d83615224565b9150614a5782615e19565b602082019050919050565b6000614a6f603183615224565b9150614a7a82615e42565b604082019050919050565b6000614a92602c83615224565b9150614a9d82615e91565b604082019050919050565b6000614ab5600e83615224565b9150614ac082615ee0565b602082019050919050565b6000614ad8601083615224565b9150614ae382615f09565b602082019050919050565b614af7816153c9565b82525050565b614b0e614b09826153c9565b6154fc565b82525050565b614b1d816153d3565b82525050565b6000614b2f828661444e565b601482019150614b3f8285614afd565b602082019150614b4f828461450c565b9150819050949350505050565b6000614b68828461450c565b915081905092915050565b6000614b7f828561453d565b9150614b8b828461450c565b91508190509392505050565b6000614ba28261466b565b9150614bae8284614483565b60208201915081905092915050565b6000602082019050614bd2600083018461443f565b92915050565b6000608082019050614bed600083018761443f565b614bfa602083018661443f565b614c076040830185614aee565b8181036060830152614c19818461449a565b905095945050505050565b6000602082019050614c396000830184614465565b92915050565b6000608082019050614c546000830187614474565b614c616020830186614b14565b614c6e6040830185614474565b614c7b6060830184614474565b95945050505050565b60006020820190508181036000830152614c9e81846144d3565b905092915050565b60006020820190508181036000830152614cbf816145bc565b9050919050565b60006020820190508181036000830152614cdf816145df565b9050919050565b60006020820190508181036000830152614cff81614602565b9050919050565b60006020820190508181036000830152614d1f81614625565b9050919050565b60006020820190508181036000830152614d3f81614648565b9050919050565b60006020820190508181036000830152614d5f8161468e565b9050919050565b60006020820190508181036000830152614d7f816146b1565b9050919050565b60006020820190508181036000830152614d9f816146d4565b9050919050565b60006020820190508181036000830152614dbf816146f7565b9050919050565b60006020820190508181036000830152614ddf8161471a565b9050919050565b60006020820190508181036000830152614dff8161473d565b9050919050565b60006020820190508181036000830152614e1f81614760565b9050919050565b60006020820190508181036000830152614e3f81614783565b9050919050565b60006020820190508181036000830152614e5f816147a6565b9050919050565b60006020820190508181036000830152614e7f816147c9565b9050919050565b60006020820190508181036000830152614e9f816147ec565b9050919050565b60006020820190508181036000830152614ebf8161480f565b9050919050565b60006020820190508181036000830152614edf81614832565b9050919050565b60006020820190508181036000830152614eff81614855565b9050919050565b60006020820190508181036000830152614f1f81614878565b9050919050565b60006020820190508181036000830152614f3f8161489b565b9050919050565b60006020820190508181036000830152614f5f816148be565b9050919050565b60006020820190508181036000830152614f7f816148e1565b9050919050565b60006020820190508181036000830152614f9f81614904565b9050919050565b60006020820190508181036000830152614fbf81614927565b9050919050565b60006020820190508181036000830152614fdf8161494a565b9050919050565b60006020820190508181036000830152614fff8161496d565b9050919050565b6000602082019050818103600083015261501f81614990565b9050919050565b6000602082019050818103600083015261503f816149b3565b9050919050565b6000602082019050818103600083015261505f816149d6565b9050919050565b6000602082019050818103600083015261507f816149f9565b9050919050565b6000602082019050818103600083015261509f81614a1c565b9050919050565b600060208201905081810360008301526150bf81614a3f565b9050919050565b600060208201905081810360008301526150df81614a62565b9050919050565b600060208201905081810360008301526150ff81614a85565b9050919050565b6000602082019050818103600083015261511f81614aa8565b9050919050565b6000602082019050818103600083015261513f81614acb565b9050919050565b600060208201905061515b6000830184614aee565b92915050565b600061516b61517c565b90506151778282615454565b919050565b6000604051905090565b600067ffffffffffffffff8211156151a1576151a0615651565b5b6151aa8261569e565b9050602081019050919050565b600067ffffffffffffffff8211156151d2576151d1615651565b5b6151db8261569e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061524b826153c9565b9150615256836153c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561528b5761528a615537565b5b828201905092915050565b60006152a1826153c9565b91506152ac836153c9565b9250826152bc576152bb615566565b5b828204905092915050565b60006152d2826153c9565b91506152dd836153c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561531657615315615537565b5b828202905092915050565b600061532c826153c9565b9150615337836153c9565b92508282101561534a57615349615537565b5b828203905092915050565b6000615360826153a9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561540d5780820151818401526020810190506153f2565b8381111561541c576000848401525b50505050565b6000600282049050600182168061543a57607f821691505b6020821081141561544e5761544d6155c4565b5b50919050565b61545d8261569e565b810181811067ffffffffffffffff8211171561547c5761547b615651565b5b80604052505050565b6000615490826153c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154c3576154c2615537565b5b600182019050919050565b60006154d9826154ea565b9050919050565b6000819050919050565b60006154f5826156af565b9050919050565b6000819050919050565b6000615511826153c9565b915061551c836153c9565b92508261552c5761552b615566565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4e554c4c5f414444524553530000000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4455504c49434154455f454e5452590000000000000000000000000000000000600082015250565b7f4558434545445f434f494e52554e4e4552535f5045525f4d494e540000000000600082015250565b7f484153485f4641494c0000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f545f5155414c494649454400000000000000000000000000000000000000600082015250565b7f4e4f4e43455f5553454400000000000000000000000000000000000000000000600082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f50524943455f4c4f434b45440000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f5055424c494300000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b615f3b81615355565b8114615f4657600080fd5b50565b615f5281615367565b8114615f5d57600080fd5b50565b615f6981615373565b8114615f7457600080fd5b50565b615f808161537d565b8114615f8b57600080fd5b50565b615f97816153c9565b8114615fa257600080fd5b5056fea264697066735822122056b48deea43163a80107f8ec6304ef1ec5bcc8e8ab454c7e85900a4459e7ed2864736f6c6343000807003368747470733a2f2f636f696e72756e6e6572736e66742e6865726f6b756170702e636f6d2f6170692f6d657461646174612f

Deployed Bytecode

0x6080604052600436106102725760003560e01c80637619bea31161014f578063a22cb465116100c1578063e8a3d4851161007a578063e8a3d485146108f8578063e985e9c514610923578063ea2470ab14610960578063f2fde38b1461098b578063f38b2cd5146109b4578063faf924cf146109df57610272565b8063a22cb465146107ea578063b179e06014610813578063b88d4fde1461083c578063c87b56dd14610865578063cf309012146108a2578063e081b781146108cd57610272565b8063938e3d7b11610113578063938e3d7b146106fb578063940f1ada1461072457806395d89b411461074f578063989bdbb61461077a5780639cf2e8d6146107915780639ec70f19146107ce57610272565b80637619bea31461063a5780637d8966e41461066557806383a9e0491461067c5780638da5cb5b146106a757806391b7f5ed146106d257610272565b806334b84f83116101e85780636352211e116101ac5780636352211e1461052e5780636b29b79f1461056b5780636c19e7831461059457806370a08231146105bd578063715018a6146105fa5780637204a3c91461061157610272565b806334b84f831461046c5780633ccfd60b1461048857806342842e0e1461049f5780634f6ccce7146104c857806355f804b31461050557610272565b806318160ddd1161023a57806318160ddd1461036e57806323b872dd146103995780632c358c4d146103c25780632f745c59146103ed578063342a891f1461042a578063343937431461045557610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780631096952314610345575b600080fd5b34801561028357600080fd5b5061029e6004803603810190610299919061436b565b610a0a565b6040516102ab9190614c24565b60405180910390f35b3480156102c057600080fd5b506102c9610a84565b6040516102d69190614c84565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190614412565b610b16565b6040516103139190614bbd565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061423f565b610b9b565b005b34801561035157600080fd5b5061036c600480360381019061036791906143c5565b610cb3565b005b34801561037a57600080fd5b50610383610d95565b6040516103909190615146565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190614129565b610da2565b005b3480156103ce57600080fd5b506103d7610e02565b6040516103e49190615146565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f919061423f565b610e08565b6040516104219190615146565b60405180910390f35b34801561043657600080fd5b5061043f610ead565b60405161044c9190615146565b60405180910390f35b34801561046157600080fd5b5061046a610eb3565b005b610486600480360381019061048191906142cc565b610f8b565b005b34801561049457600080fd5b5061049d61130c565b005b3480156104ab57600080fd5b506104c660048036038101906104c19190614129565b6113f3565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190614412565b611413565b6040516104fc9190615146565b60405180910390f35b34801561051157600080fd5b5061052c600480360381019061052791906143c5565b611484565b005b34801561053a57600080fd5b5061055560048036038101906105509190614412565b611566565b6040516105629190614bbd565b60405180910390f35b34801561057757600080fd5b50610592600480360381019061058d91906140bc565b611618565b005b3480156105a057600080fd5b506105bb60048036038101906105b691906140bc565b6116d8565b005b3480156105c957600080fd5b506105e460048036038101906105df91906140bc565b611798565b6040516105f19190615146565b60405180910390f35b34801561060657600080fd5b5061060f611850565b005b34801561061d57600080fd5b506106386004803603810190610633919061427f565b6118d8565b005b34801561064657600080fd5b5061064f611afc565b60405161065c9190615146565b60405180910390f35b34801561067157600080fd5b5061067a611b02565b005b34801561068857600080fd5b50610691611bda565b60405161069e9190614c24565b60405180910390f35b3480156106b357600080fd5b506106bc611bed565b6040516106c99190614bbd565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190614412565b611c17565b005b34801561070757600080fd5b50610722600480360381019061071d91906143c5565b611ced565b005b34801561073057600080fd5b50610739611dcf565b6040516107469190615146565b60405180910390f35b34801561075b57600080fd5b50610764611dd5565b6040516107719190614c84565b60405180910390f35b34801561078657600080fd5b5061078f611e67565b005b34801561079d57600080fd5b506107b860048036038101906107b391906140bc565b611f00565b6040516107c59190614c24565b60405180910390f35b6107e860048036038101906107e391906142cc565b611f20565b005b3480156107f657600080fd5b50610811600480360381019061080c91906141ff565b612240565b005b34801561081f57600080fd5b5061083a6004803603810190610835919061427f565b6123c1565b005b34801561084857600080fd5b50610863600480360381019061085e919061417c565b612558565b005b34801561087157600080fd5b5061088c60048036038101906108879190614412565b6125ba565b6040516108999190614c84565b60405180910390f35b3480156108ae57600080fd5b506108b7612636565b6040516108c49190614c24565b60405180910390f35b3480156108d957600080fd5b506108e2612649565b6040516108ef9190614c24565b60405180910390f35b34801561090457600080fd5b5061090d61265c565b60405161091a9190614c84565b60405180910390f35b34801561092f57600080fd5b5061094a600480360381019061094591906140e9565b6126ee565b6040516109579190614c24565b60405180910390f35b34801561096c57600080fd5b50610975612782565b6040516109829190614c24565b60405180910390f35b34801561099757600080fd5b506109b260048036038101906109ad91906140bc565b612795565b005b3480156109c057600080fd5b506109c961288d565b6040516109d69190615146565b60405180910390f35b3480156109eb57600080fd5b506109f4612893565b604051610a019190614c84565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7d5750610a7c82612921565b5b9050919050565b606060008054610a9390615422565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90615422565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b5050505050905090565b6000610b2182612a03565b610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790614f86565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba682611566565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e90615086565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c36612a6f565b73ffffffffffffffffffffffffffffffffffffffff161480610c655750610c6481610c5f612a6f565b6126ee565b5b610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90614ee6565b60405180910390fd5b610cae8383612a77565b505050565b610cbb612a6f565b73ffffffffffffffffffffffffffffffffffffffff16610cd9611bed565b73ffffffffffffffffffffffffffffffffffffffff1614610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2690614fa6565b60405180910390fd5b601560029054906101000a900460ff1615610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690614fe6565b60405180910390fd5b818160129190610d90929190613e0f565b505050565b6000600880549050905090565b610db3610dad612a6f565b82612b30565b610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de9906150c6565b60405180910390fd5b610dfd838383612c0e565b505050565b6103e881565b6000610e1383611798565b8210610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90614d46565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60135481565b610ebb612a6f565b73ffffffffffffffffffffffffffffffffffffffff16610ed9611bed565b73ffffffffffffffffffffffffffffffffffffffff1614610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690614fa6565b60405180910390fd5b601560039054906101000a900460ff16610f5f576001601560036101000a81548160ff0219169083151502179055505b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b601560019054906101000a900460ff16158015610fb45750601560009054906101000a900460ff165b610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614cc6565b60405180910390fd5b610ffd8484612e6a565b61103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103390614d06565b60405180910390fd5b600d8260405161104c9190614b5c565b908152602001604051809103902060009054906101000a900460ff16156110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f90615026565b60405180910390fd5b836110b4338385612ed7565b146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90614ec6565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790615006565b60405180910390fd5b613a9861118b610d95565b106111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c290614e06565b60405180910390fd5b613a98816013546111dc9190615240565b111561121d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121490615106565b60405180910390fd5b6103e8811115611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990614ea6565b60405180910390fd5b3481600b5461127191906152c7565b11156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990615126565b60405180910390fd5b60005b8181101561130557601360008154809291906112d090615485565b91905055506112f23360016112e3610d95565b6112ed9190615240565b612f38565b80806112fd90615485565b9150506112b5565b5050505050565b611314612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611332611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90614fa6565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113f0573d6000803e3d6000fd5b50565b61140e83838360405180602001604052806000815250612558565b505050565b600061141d610d95565b821061145e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611455906150e6565b60405180910390fd5b6008828154811061147257611471615622565b5b90600052602060002001549050919050565b61148c612a6f565b73ffffffffffffffffffffffffffffffffffffffff166114aa611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614fa6565b60405180910390fd5b601560029054906101000a900460ff1615611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790614fe6565b60405180910390fd5b8181600f9190611561929190613e0f565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160690614f26565b60405180910390fd5b80915050919050565b611620612a6f565b73ffffffffffffffffffffffffffffffffffffffff1661163e611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90614fa6565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6116e0612a6f565b73ffffffffffffffffffffffffffffffffffffffff166116fe611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90614fa6565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180090614f06565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611858612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611876611bed565b73ffffffffffffffffffffffffffffffffffffffff16146118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390614fa6565b60405180910390fd5b6118d66000612f56565b565b6118e0612a6f565b73ffffffffffffffffffffffffffffffffffffffff166118fe611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90614fa6565b60405180910390fd5b60005b82829050811015611af757600083838381811061197757611976615622565b5b905060200201602081019061198c91906140bc565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f590614ce6565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290614e86565b60405180910390fd5b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611aef90615485565b915050611957565b505050565b613a9881565b611b0a612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611b28611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614fa6565b60405180910390fd5b601560039054906101000a900460ff16611bae576001601560036101000a81548160ff0219169083151502179055505b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b601560009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c1f612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611c3d611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90614fa6565b60405180910390fd5b601560039054906101000a900460ff1615611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda90615066565b60405180910390fd5b80600b8190555050565b611cf5612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611d13611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614fa6565b60405180910390fd5b601560029054906101000a900460ff1615611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090614fe6565b60405180910390fd5b8181600e9190611dca929190613e0f565b505050565b60145481565b606060018054611de490615422565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1090615422565b8015611e5d5780601f10611e3257610100808354040283529160200191611e5d565b820191906000526020600020905b815481529060010190602001808311611e4057829003601f168201915b5050505050905090565b611e6f612a6f565b73ffffffffffffffffffffffffffffffffffffffff16611e8d611bed565b73ffffffffffffffffffffffffffffffffffffffff1614611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda90614fa6565b60405180910390fd5b6001601560026101000a81548160ff021916908315150217905550565b600c6020528060005260406000206000915054906101000a900460ff1681565b601560019054906101000a900460ff16611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6690614e46565b60405180910390fd5b611f798484612e6a565b611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf90614d06565b60405180910390fd5b600d82604051611fc89190614b5c565b908152602001604051809103902060009054906101000a900460ff1615612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b90615026565b60405180910390fd5b83612030338385612ed7565b14612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614ec6565b60405180910390fd5b613a9861207b610d95565b106120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290614e06565b60405180910390fd5b613a98816014546013546120cf9190615240565b6120d99190615240565b111561211a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612111906150a6565b60405180910390fd5b6103e881111561215f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215690614ea6565b60405180910390fd5b3481600b5461216e91906152c7565b11156121af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a690615126565b60405180910390fd5b60005b8181101561220257601460008154809291906121cd90615485565b91905055506121ef3360016121e0610d95565b6121ea9190615240565b612f38565b80806121fa90615485565b9150506121b2565b506001600d836040516122159190614b5c565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050505050565b612248612a6f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90614de6565b60405180910390fd5b80600560006122c3612a6f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612370612a6f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123b59190614c24565b60405180910390a35050565b6123c9612a6f565b73ffffffffffffffffffffffffffffffffffffffff166123e7611bed565b73ffffffffffffffffffffffffffffffffffffffff161461243d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243490614fa6565b60405180910390fd5b60005b828290508110156125535760008383838181106124605761245f615622565b5b905060200201602081019061247591906140bc565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124de90614ce6565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061254b90615485565b915050612440565b505050565b612569612563612a6f565b83612b30565b6125a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259f906150c6565b60405180910390fd5b6125b48484848461301c565b50505050565b60606125c582612a03565b612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb90615046565b60405180910390fd5b600f61260f83613078565b604051602001612620929190614b73565b6040516020818303038152906040529050919050565b601560029054906101000a900460ff1681565b601560019054906101000a900460ff1681565b6060600e805461266b90615422565b80601f016020809104026020016040519081016040528092919081815260200182805461269790615422565b80156126e45780601f106126b9576101008083540402835291602001916126e4565b820191906000526020600020905b8154815290600101906020018083116126c757829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601560039054906101000a900460ff1681565b61279d612a6f565b73ffffffffffffffffffffffffffffffffffffffff166127bb611bed565b73ffffffffffffffffffffffffffffffffffffffff1614612811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280890614fa6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287890614d86565b60405180910390fd5b61288a81612f56565b50565b600b5481565b601280546128a090615422565b80601f01602080910402602001604051908101604052809291908181526020018280546128cc90615422565b80156129195780601f106128ee57610100808354040283529160200191612919565b820191906000526020600020905b8154815290600101906020018083116128fc57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129fc57506129fb826131d9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612aea83611566565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b3b82612a03565b612b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7190614e66565b60405180910390fd5b6000612b8583611566565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612bf457508373ffffffffffffffffffffffffffffffffffffffff16612bdc84610b16565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c055750612c0481856126ee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c2e82611566565b73ffffffffffffffffffffffffffffffffffffffff1614612c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7b90614fc6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ceb90614dc6565b60405180910390fd5b612cff838383613243565b612d0a600082612a77565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5a9190615321565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612db19190615240565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612e7f828461335790919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080848484604051602001612eef93929190614b23565b60405160208183030381529060405280519060200120604051602001612f159190614b97565b604051602081830303815290604052805190602001209050809150509392505050565b612f5282826040518060200160405280600081525061337e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613027848484612c0e565b613033848484846133d9565b613072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306990614d66565b60405180910390fd5b50505050565b606060008214156130c0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131d4565b600082905060005b600082146130f25780806130db90615485565b915050600a826130eb9190615296565b91506130c8565b60008167ffffffffffffffff81111561310e5761310d615651565b5b6040519080825280601f01601f1916602001820160405280156131405781602001600182028036833780820191505090505b5090505b600085146131cd576001826131599190615321565b9150600a856131689190615506565b60306131749190615240565b60f81b81838151811061318a57613189615622565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131c69190615296565b9450613144565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61324e838383613570565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132915761328c81613575565b6132d0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132cf576132ce83826135be565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133135761330e8161372b565b613352565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133515761335082826137fc565b5b5b505050565b6000806000613366858561387b565b91509150613373816138fe565b819250505092915050565b6133888383613ad3565b61339560008484846133d9565b6133d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cb90614d66565b60405180910390fd5b505050565b60006133fa8473ffffffffffffffffffffffffffffffffffffffff16613ca1565b15613563578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613423612a6f565b8786866040518563ffffffff1660e01b81526004016134459493929190614bd8565b602060405180830381600087803b15801561345f57600080fd5b505af192505050801561349057506040513d601f19601f8201168201806040525081019061348d9190614398565b60015b613513573d80600081146134c0576040519150601f19603f3d011682016040523d82523d6000602084013e6134c5565b606091505b5060008151141561350b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350290614d66565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613568565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135cb84611798565b6135d59190615321565b90506000600760008481526020019081526020016000205490508181146136ba576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061373f9190615321565b905060006009600084815260200190815260200160002054905060006008838154811061376f5761376e615622565b5b90600052602060002001549050806008838154811061379157613790615622565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137e0576137df6155f3565b5b6001900381819060005260206000200160009055905550505050565b600061380783611798565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000806041835114156138bd5760008060006020860151925060408601519150606086015160001a90506138b187828585613cb4565b945094505050506138f7565b6040835114156138ee5760008060208501519150604085015190506138e3868383613dc1565b9350935050506138f7565b60006002915091505b9250929050565b6000600481111561391257613911615595565b5b81600481111561392557613924615595565b5b141561393057613ad0565b6001600481111561394457613943615595565b5b81600481111561395757613956615595565b5b1415613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398f90614ca6565b60405180910390fd5b600260048111156139ac576139ab615595565b5b8160048111156139bf576139be615595565b5b1415613a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f790614d26565b60405180910390fd5b60036004811115613a1457613a13615595565b5b816004811115613a2757613a26615595565b5b1415613a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5f90614e26565b60405180910390fd5b600480811115613a7b57613a7a615595565b5b816004811115613a8e57613a8d615595565b5b1415613acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac690614f46565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b3a90614f66565b60405180910390fd5b613b4c81612a03565b15613b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8390614da6565b60405180910390fd5b613b9860008383613243565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613be89190615240565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613cef576000600391509150613db8565b601b8560ff1614158015613d075750601c8560ff1614155b15613d19576000600491509150613db8565b600060018787878760405160008152602001604052604051613d3e9493929190614c3f565b6020604051602081039080840390855afa158015613d60573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613daf57600060019250925050613db8565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613e0187828885613cb4565b935093505050935093915050565b828054613e1b90615422565b90600052602060002090601f016020900481019282613e3d5760008555613e84565b82601f10613e5657803560ff1916838001178555613e84565b82800160010185558215613e84579182015b82811115613e83578235825591602001919060010190613e68565b5b509050613e919190613e95565b5090565b5b80821115613eae576000816000905550600101613e96565b5090565b6000613ec5613ec084615186565b615161565b905082815260208101848484011115613ee157613ee061568f565b5b613eec8482856153e0565b509392505050565b6000613f07613f02846151b7565b615161565b905082815260208101848484011115613f2357613f2261568f565b5b613f2e8482856153e0565b509392505050565b600081359050613f4581615f32565b92915050565b60008083601f840112613f6157613f60615685565b5b8235905067ffffffffffffffff811115613f7e57613f7d615680565b5b602083019150836020820283011115613f9a57613f9961568a565b5b9250929050565b600081359050613fb081615f49565b92915050565b600081359050613fc581615f60565b92915050565b600081359050613fda81615f77565b92915050565b600081519050613fef81615f77565b92915050565b600082601f83011261400a57614009615685565b5b813561401a848260208601613eb2565b91505092915050565b60008083601f84011261403957614038615685565b5b8235905067ffffffffffffffff81111561405657614055615680565b5b6020830191508360018202830111156140725761407161568a565b5b9250929050565b600082601f83011261408e5761408d615685565b5b813561409e848260208601613ef4565b91505092915050565b6000813590506140b681615f8e565b92915050565b6000602082840312156140d2576140d1615699565b5b60006140e084828501613f36565b91505092915050565b60008060408385031215614100576140ff615699565b5b600061410e85828601613f36565b925050602061411f85828601613f36565b9150509250929050565b60008060006060848603121561414257614141615699565b5b600061415086828701613f36565b935050602061416186828701613f36565b9250506040614172868287016140a7565b9150509250925092565b6000806000806080858703121561419657614195615699565b5b60006141a487828801613f36565b94505060206141b587828801613f36565b93505060406141c6878288016140a7565b925050606085013567ffffffffffffffff8111156141e7576141e6615694565b5b6141f387828801613ff5565b91505092959194509250565b6000806040838503121561421657614215615699565b5b600061422485828601613f36565b925050602061423585828601613fa1565b9150509250929050565b6000806040838503121561425657614255615699565b5b600061426485828601613f36565b9250506020614275858286016140a7565b9150509250929050565b6000806020838503121561429657614295615699565b5b600083013567ffffffffffffffff8111156142b4576142b3615694565b5b6142c085828601613f4b565b92509250509250929050565b600080600080608085870312156142e6576142e5615699565b5b60006142f487828801613fb6565b945050602085013567ffffffffffffffff81111561431557614314615694565b5b61432187828801613ff5565b935050604085013567ffffffffffffffff81111561434257614341615694565b5b61434e87828801614079565b925050606061435f878288016140a7565b91505092959194509250565b60006020828403121561438157614380615699565b5b600061438f84828501613fcb565b91505092915050565b6000602082840312156143ae576143ad615699565b5b60006143bc84828501613fe0565b91505092915050565b600080602083850312156143dc576143db615699565b5b600083013567ffffffffffffffff8111156143fa576143f9615694565b5b61440685828601614023565b92509250509250929050565b60006020828403121561442857614427615699565b5b6000614436848285016140a7565b91505092915050565b61444881615355565b82525050565b61445f61445a82615355565b6154ce565b82525050565b61446e81615367565b82525050565b61447d81615373565b82525050565b61449461448f82615373565b6154e0565b82525050565b60006144a5826151fd565b6144af8185615213565b93506144bf8185602086016153ef565b6144c88161569e565b840191505092915050565b60006144de82615208565b6144e88185615224565b93506144f88185602086016153ef565b6145018161569e565b840191505092915050565b600061451782615208565b6145218185615235565b93506145318185602086016153ef565b80840191505092915050565b6000815461454a81615422565b6145548186615235565b9450600182166000811461456f5760018114614580576145b3565b60ff198316865281860193506145b3565b614589856151e8565b60005b838110156145ab5781548189015260018201915060208101905061458c565b838801955050505b50505092915050565b60006145c9601883615224565b91506145d4826156bc565b602082019050919050565b60006145ec600e83615224565b91506145f7826156e5565b602082019050919050565b600061460f600c83615224565b915061461a8261570e565b602082019050919050565b6000614632601683615224565b915061463d82615737565b602082019050919050565b6000614655601f83615224565b915061466082615760565b602082019050919050565b6000614678601c83615235565b915061468382615789565b601c82019050919050565b600061469b602b83615224565b91506146a6826157b2565b604082019050919050565b60006146be603283615224565b91506146c982615801565b604082019050919050565b60006146e1602683615224565b91506146ec82615850565b604082019050919050565b6000614704601c83615224565b915061470f8261589f565b602082019050919050565b6000614727602483615224565b9150614732826158c8565b604082019050919050565b600061474a601983615224565b915061475582615917565b602082019050919050565b600061476d600c83615224565b915061477882615940565b602082019050919050565b6000614790602283615224565b915061479b82615969565b604082019050919050565b60006147b3600b83615224565b91506147be826159b8565b602082019050919050565b60006147d6602c83615224565b91506147e1826159e1565b604082019050919050565b60006147f9600f83615224565b915061480482615a30565b602082019050919050565b600061481c601b83615224565b915061482782615a59565b602082019050919050565b600061483f600983615224565b915061484a82615a82565b602082019050919050565b6000614862603883615224565b915061486d82615aab565b604082019050919050565b6000614885602a83615224565b915061489082615afa565b604082019050919050565b60006148a8602983615224565b91506148b382615b49565b604082019050919050565b60006148cb602283615224565b91506148d682615b98565b604082019050919050565b60006148ee602083615224565b91506148f982615be7565b602082019050919050565b6000614911602c83615224565b915061491c82615c10565b604082019050919050565b6000614934602083615224565b915061493f82615c5f565b602082019050919050565b6000614957602983615224565b915061496282615c88565b604082019050919050565b600061497a602483615224565b915061498582615cd7565b604082019050919050565b600061499d600d83615224565b91506149a882615d26565b602082019050919050565b60006149c0600a83615224565b91506149cb82615d4f565b602082019050919050565b60006149e3601f83615224565b91506149ee82615d78565b602082019050919050565b6000614a06600c83615224565b9150614a1182615da1565b602082019050919050565b6000614a29602183615224565b9150614a3482615dca565b604082019050919050565b6000614a4c600d83615224565b9150614a5782615e19565b602082019050919050565b6000614a6f603183615224565b9150614a7a82615e42565b604082019050919050565b6000614a92602c83615224565b9150614a9d82615e91565b604082019050919050565b6000614ab5600e83615224565b9150614ac082615ee0565b602082019050919050565b6000614ad8601083615224565b9150614ae382615f09565b602082019050919050565b614af7816153c9565b82525050565b614b0e614b09826153c9565b6154fc565b82525050565b614b1d816153d3565b82525050565b6000614b2f828661444e565b601482019150614b3f8285614afd565b602082019150614b4f828461450c565b9150819050949350505050565b6000614b68828461450c565b915081905092915050565b6000614b7f828561453d565b9150614b8b828461450c565b91508190509392505050565b6000614ba28261466b565b9150614bae8284614483565b60208201915081905092915050565b6000602082019050614bd2600083018461443f565b92915050565b6000608082019050614bed600083018761443f565b614bfa602083018661443f565b614c076040830185614aee565b8181036060830152614c19818461449a565b905095945050505050565b6000602082019050614c396000830184614465565b92915050565b6000608082019050614c546000830187614474565b614c616020830186614b14565b614c6e6040830185614474565b614c7b6060830184614474565b95945050505050565b60006020820190508181036000830152614c9e81846144d3565b905092915050565b60006020820190508181036000830152614cbf816145bc565b9050919050565b60006020820190508181036000830152614cdf816145df565b9050919050565b60006020820190508181036000830152614cff81614602565b9050919050565b60006020820190508181036000830152614d1f81614625565b9050919050565b60006020820190508181036000830152614d3f81614648565b9050919050565b60006020820190508181036000830152614d5f8161468e565b9050919050565b60006020820190508181036000830152614d7f816146b1565b9050919050565b60006020820190508181036000830152614d9f816146d4565b9050919050565b60006020820190508181036000830152614dbf816146f7565b9050919050565b60006020820190508181036000830152614ddf8161471a565b9050919050565b60006020820190508181036000830152614dff8161473d565b9050919050565b60006020820190508181036000830152614e1f81614760565b9050919050565b60006020820190508181036000830152614e3f81614783565b9050919050565b60006020820190508181036000830152614e5f816147a6565b9050919050565b60006020820190508181036000830152614e7f816147c9565b9050919050565b60006020820190508181036000830152614e9f816147ec565b9050919050565b60006020820190508181036000830152614ebf8161480f565b9050919050565b60006020820190508181036000830152614edf81614832565b9050919050565b60006020820190508181036000830152614eff81614855565b9050919050565b60006020820190508181036000830152614f1f81614878565b9050919050565b60006020820190508181036000830152614f3f8161489b565b9050919050565b60006020820190508181036000830152614f5f816148be565b9050919050565b60006020820190508181036000830152614f7f816148e1565b9050919050565b60006020820190508181036000830152614f9f81614904565b9050919050565b60006020820190508181036000830152614fbf81614927565b9050919050565b60006020820190508181036000830152614fdf8161494a565b9050919050565b60006020820190508181036000830152614fff8161496d565b9050919050565b6000602082019050818103600083015261501f81614990565b9050919050565b6000602082019050818103600083015261503f816149b3565b9050919050565b6000602082019050818103600083015261505f816149d6565b9050919050565b6000602082019050818103600083015261507f816149f9565b9050919050565b6000602082019050818103600083015261509f81614a1c565b9050919050565b600060208201905081810360008301526150bf81614a3f565b9050919050565b600060208201905081810360008301526150df81614a62565b9050919050565b600060208201905081810360008301526150ff81614a85565b9050919050565b6000602082019050818103600083015261511f81614aa8565b9050919050565b6000602082019050818103600083015261513f81614acb565b9050919050565b600060208201905061515b6000830184614aee565b92915050565b600061516b61517c565b90506151778282615454565b919050565b6000604051905090565b600067ffffffffffffffff8211156151a1576151a0615651565b5b6151aa8261569e565b9050602081019050919050565b600067ffffffffffffffff8211156151d2576151d1615651565b5b6151db8261569e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061524b826153c9565b9150615256836153c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561528b5761528a615537565b5b828201905092915050565b60006152a1826153c9565b91506152ac836153c9565b9250826152bc576152bb615566565b5b828204905092915050565b60006152d2826153c9565b91506152dd836153c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561531657615315615537565b5b828202905092915050565b600061532c826153c9565b9150615337836153c9565b92508282101561534a57615349615537565b5b828203905092915050565b6000615360826153a9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561540d5780820151818401526020810190506153f2565b8381111561541c576000848401525b50505050565b6000600282049050600182168061543a57607f821691505b6020821081141561544e5761544d6155c4565b5b50919050565b61545d8261569e565b810181811067ffffffffffffffff8211171561547c5761547b615651565b5b80604052505050565b6000615490826153c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154c3576154c2615537565b5b600182019050919050565b60006154d9826154ea565b9050919050565b6000819050919050565b60006154f5826156af565b9050919050565b6000819050919050565b6000615511826153c9565b915061551c836153c9565b92508261552c5761552b615566565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4e554c4c5f414444524553530000000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4455504c49434154455f454e5452590000000000000000000000000000000000600082015250565b7f4558434545445f434f494e52554e4e4552535f5045525f4d494e540000000000600082015250565b7f484153485f4641494c0000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f545f5155414c494649454400000000000000000000000000000000000000600082015250565b7f4e4f4e43455f5553454400000000000000000000000000000000000000000000600082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f50524943455f4c4f434b45440000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f5055424c494300000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b615f3b81615355565b8114615f4657600080fd5b50565b615f5281615367565b8114615f5d57600080fd5b50565b615f6981615373565b8114615f7457600080fd5b50565b615f808161537d565b8114615f8b57600080fd5b50565b615f97816153c9565b8114615fa257600080fd5b5056fea264697066735822122056b48deea43163a80107f8ec6304ef1ec5bcc8e8ab454c7e85900a4459e7ed2864736f6c63430008070033

Deployed Bytecode Sourcemap

50931:5883:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33652:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21660:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23219:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22742:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56084:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34292:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24109:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51109:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33960:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51634:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55584:136;;;;;;;;;;;;;:::i;:::-;;54154:973;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55139:108;;;;;;;;;;;;;:::i;:::-;;24519:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34482:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56328:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21354:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55968:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55871:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21084:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41361:94;;;;;;;;;;;;;:::i;:::-;;52016:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51055:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55732:127;;;;;;;;;;;;;:::i;:::-;;51715:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40710:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55432:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56205:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51675:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21829:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55349:75;;;;;;;;;;;;;:::i;:::-;;51223:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53196:950;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23512:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52380:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24775:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56557:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51772:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51745:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56448:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23878:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51797:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41610:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51167:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51608:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33652:224;33754:4;33793:35;33778:50;;;:11;:50;;;;:90;;;;33832:36;33856:11;33832:23;:36::i;:::-;33778:90;33771:97;;33652:224;;;:::o;21660:100::-;21714:13;21747:5;21740:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21660:100;:::o;23219:221::-;23295:7;23323:16;23331:7;23323;:16::i;:::-;23315:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23408:15;:24;23424:7;23408:24;;;;;;;;;;;;;;;;;;;;;23401:31;;23219:221;;;:::o;22742:411::-;22823:13;22839:23;22854:7;22839:14;:23::i;:::-;22823:39;;22887:5;22881:11;;:2;:11;;;;22873:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22981:5;22965:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22990:37;23007:5;23014:12;:10;:12::i;:::-;22990:16;:37::i;:::-;22965:62;22943:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23124:21;23133:2;23137:7;23124:8;:21::i;:::-;22812:341;22742:411;;:::o;56084:109::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51941:6:::1;;;;;;;;;;;51940:7;51932:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56181:4:::2;;56173:5;:12;;;;;;;:::i;:::-;;56084:109:::0;;:::o;34292:113::-;34353:7;34380:10;:17;;;;34373:24;;34292:113;:::o;24109:339::-;24304:41;24323:12;:10;:12::i;:::-;24337:7;24304:18;:41::i;:::-;24296:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24412:28;24422:4;24428:2;24432:7;24412:9;:28::i;:::-;24109:339;;;:::o;51109:51::-;51156:4;51109:51;:::o;33960:256::-;34057:7;34093:23;34110:5;34093:16;:23::i;:::-;34085:5;:31;34077:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34182:12;:19;34195:5;34182:19;;;;;;;;;;;;;;;:26;34202:5;34182:26;;;;;;;;;;;;34175:33;;33960:256;;;;:::o;51634:34::-;;;;:::o;55584:136::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55644:11:::1;;;;;;;;;;;55639:36;;55671:4;55657:11;;:18;;;;;;;;;;;;;;;;;;55639:36;55701:11;;;;;;;;;;;55700:12;55686:11;;:26;;;;;;;;;;;;;;;;;;55584:136::o:0;54154:973::-;54293:8;;;;;;;;;;;54292:9;:24;;;;;54305:11;;;;;;;;;;;54292:24;54284:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;54354:34;54372:4;54378:9;54354:17;:34::i;:::-;54346:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54435:11;54447:5;54435:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;54434:19;54426:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;54540:4;54487:49;54503:10;54515:13;54530:5;54487:15;:49::i;:::-;:57;54479:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;54577:12;:24;54590:10;54577:24;;;;;;;;;;;;;;;;;;;;;;;;;54569:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;51097:5;54638:13;:11;:13::i;:::-;:31;54630:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;51097:5;54727:13;54705:19;;:35;;;;:::i;:::-;:54;;54697:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51156:4;54797:13;:37;;54789:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;54922:9;54905:13;54885:17;;:33;;;;:::i;:::-;:46;;54877:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;54978:9;54973:147;54997:13;54993:1;:17;54973:147;;;55032:19;;:21;;;;;;;;;:::i;:::-;;;;;;55068:40;55078:10;55106:1;55090:13;:11;:13::i;:::-;:17;;;;:::i;:::-;55068:9;:40::i;:::-;55012:3;;;;;:::i;:::-;;;;54973:147;;;;54154:973;;;;:::o;55139:108::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55197:9:::1;;;;;;;;;;;55189:27;;:50;55217:21;55189:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55139:108::o:0;24519:185::-;24657:39;24674:4;24680:2;24684:7;24657:39;;;;;;;;;;;;:16;:39::i;:::-;24519:185;;;:::o;34482:233::-;34557:7;34593:30;:28;:30::i;:::-;34585:5;:38;34577:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34690:10;34701:5;34690:17;;;;;;;;:::i;:::-;;;;;;;;;;34683:24;;34482:233;;;:::o;56328:108::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51941:6:::1;;;;;;;;;;;51940:7;51932:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56425:3:::2;;56409:13;:19;;;;;;;:::i;:::-;;56328:108:::0;;:::o;21354:239::-;21426:7;21446:13;21462:7;:16;21470:7;21462:16;;;;;;;;;;;;;;;;;;;;;21446:32;;21514:1;21497:19;;:5;:19;;;;21489:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21580:5;21573:12;;;21354:239;;;:::o;55968:104::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56056:8:::1;56044:9;;:20;;;;;;;;;;;;;;;;;;55968:104:::0;:::o;55871:85::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55944:4:::1;55934:7;;:14;;;;;;;;;;;;;;;;;;55871:85:::0;:::o;21084:208::-;21156:7;21201:1;21184:19;;:5;:19;;;;21176:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21268:9;:16;21278:5;21268:16;;;;;;;;;;;;;;;;21261:23;;21084:208;;;:::o;41361:94::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41426:21:::1;41444:1;41426:9;:21::i;:::-;41361:94::o:0;52016:356::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52104:9:::1;52100:262;52123:7;;:14;;52119:1;:18;52100:262;;;52159:13;52175:7;;52183:1;52175:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52159:26;;52225:1;52208:19;;:5;:19;;;;52200:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;52268:12;:19;52281:5;52268:19;;;;;;;;;;;;;;;;;;;;;;;;;52267:20;52259:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;52346:4;52324:12;:19;52337:5;52324:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;52144:218;52139:3;;;;;:::i;:::-;;;;52100:262;;;;52016:356:::0;;:::o;51055:47::-;51097:5;51055:47;:::o;55732:127::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55789:11:::1;;;;;;;;;;;55784:36;;55816:4;55802:11;;:18;;;;;;;;;;;;;;;;;;55784:36;55843:8;;;;;;;;;;;55842:9;55831:8;;:20;;;;;;;;;;;;;;;;;;55732:127::o:0;51715:23::-;;;;;;;;;;;;;:::o;40710:87::-;40756:7;40783:6;;;;;;;;;;;40776:13;;40710:87;:::o;55432:144::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55504:11:::1;;;;;;;;;;;55503:12;55495:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;55563:5;55543:17;:25;;;;55432:144:::0;:::o;56205:111::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51941:6:::1;;;;;;;;;;;51940:7;51932:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56305:3:::2;;56290:12;:18;;;;;;;:::i;:::-;;56205:111:::0;;:::o;51675:33::-;;;;:::o;21829:104::-;21885:13;21918:7;21911:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21829:104;:::o;55349:75::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55412:4:::1;55403:6;;:13;;;;;;;;;;;;;;;;;;55349:75::o:0;51223:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;53196:950::-;53327:8;;;;;;;;;;;53319:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;53370:34;53388:4;53394:9;53370:17;:34::i;:::-;53362:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53451:11;53463:5;53451:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53450:19;53442:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;53556:4;53503:49;53519:10;53531:13;53546:5;53503:15;:49::i;:::-;:57;53495:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;51097:5;53593:13;:11;:13::i;:::-;:31;53585:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;51097:5;53703:13;53682:18;;53660:19;;:40;;;;:::i;:::-;:56;;;;:::i;:::-;:75;;53652:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;51156:4;53772:13;:37;;53764:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53897:9;53880:13;53860:17;;:33;;;;:::i;:::-;:46;;53852:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;53952:9;53948:145;53971:13;53967:1;:17;53948:145;;;54006:18;;:20;;;;;;;;;:::i;:::-;;;;;;54041:40;54051:10;54079:1;54063:13;:11;:13::i;:::-;:17;;;;:::i;:::-;54041:9;:40::i;:::-;53986:3;;;;;:::i;:::-;;;;53948:145;;;;54134:4;54113:11;54125:5;54113:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;53196:950;;;;:::o;23512:295::-;23627:12;:10;:12::i;:::-;23615:24;;:8;:24;;;;23607:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23727:8;23682:18;:32;23701:12;:10;:12::i;:::-;23682:32;;;;;;;;;;;;;;;:42;23715:8;23682:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23780:8;23751:48;;23766:12;:10;:12::i;:::-;23751:48;;;23790:8;23751:48;;;;;;:::i;:::-;;;;;;;;23512:295;;:::o;52380:308::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52473:9:::1;52469:212;52492:7;;:14;;52488:1;:18;52469:212;;;52528:13;52544:7;;52552:1;52544:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52528:26;;52594:1;52577:19;;:5;:19;;;;52569:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;52664:5;52642:12;:19;52655:5;52642:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;52513:168;52508:3;;;;;:::i;:::-;;;;52469:212;;;;52380:308:::0;;:::o;24775:328::-;24950:41;24969:12;:10;:12::i;:::-;24983:7;24950:18;:41::i;:::-;24942:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25056:39;25070:4;25076:2;25080:7;25089:5;25056:13;:39::i;:::-;24775:328;;;;:::o;56557:254::-;56630:13;56664:16;56672:7;56664;:16::i;:::-;56656:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;56768:13;56783:18;:7;:16;:18::i;:::-;56751:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56737:66;;56557:254;;;:::o;51772:18::-;;;;;;;;;;;;;:::o;51745:20::-;;;;;;;;;;;;;:::o;56448:97::-;56492:13;56525:12;56518:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56448:97;:::o;23878:164::-;23975:4;23999:18;:25;24018:5;23999:25;;;;;;;;;;;;;;;:35;24025:8;23999:35;;;;;;;;;;;;;;;;;;;;;;;;;23992:42;;23878:164;;;;:::o;51797:23::-;;;;;;;;;;;;;:::o;41610:192::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41719:1:::1;41699:22;;:8;:22;;;;41691:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41775:19;41785:8;41775:9;:19::i;:::-;41610:192:::0;:::o;51167:47::-;;;;:::o;51608:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20715:305::-;20817:4;20869:25;20854:40;;;:11;:40;;;;:105;;;;20926:33;20911:48;;;:11;:48;;;;20854:105;:158;;;;20976:36;21000:11;20976:23;:36::i;:::-;20854:158;20834:178;;20715:305;;;:::o;26613:127::-;26678:4;26730:1;26702:30;;:7;:16;26710:7;26702:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26695:37;;26613:127;;;:::o;15551:98::-;15604:7;15631:10;15624:17;;15551:98;:::o;30595:174::-;30697:2;30670:15;:24;30686:7;30670:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30753:7;30749:2;30715:46;;30724:23;30739:7;30724:14;:23::i;:::-;30715:46;;;;;;;;;;;;30595:174;;:::o;26907:348::-;27000:4;27025:16;27033:7;27025;:16::i;:::-;27017:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27101:13;27117:23;27132:7;27117:14;:23::i;:::-;27101:39;;27170:5;27159:16;;:7;:16;;;:51;;;;27203:7;27179:31;;:20;27191:7;27179:11;:20::i;:::-;:31;;;27159:51;:87;;;;27214:32;27231:5;27238:7;27214:16;:32::i;:::-;27159:87;27151:96;;;26907:348;;;;:::o;29899:578::-;30058:4;30031:31;;:23;30046:7;30031:14;:23::i;:::-;:31;;;30023:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30141:1;30127:16;;:2;:16;;;;30119:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30197:39;30218:4;30224:2;30228:7;30197:20;:39::i;:::-;30301:29;30318:1;30322:7;30301:8;:29::i;:::-;30362:1;30343:9;:15;30353:4;30343:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30391:1;30374:9;:13;30384:2;30374:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30422:2;30403:7;:16;30411:7;30403:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30461:7;30457:2;30442:27;;30451:4;30442:27;;;;;;;;;;;;29899:578;;;:::o;53032:152::-;53118:4;53153:23;53166:9;53153:4;:12;;:23;;;;:::i;:::-;53142:34;;:7;;;;;;;;;;;:34;;;53135:41;;53032:152;;;;:::o;52700:320::-;52796:7;52816:12;52948:6;52956:3;52961:5;52931:36;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52921:47;;;;;;52841:128;;;;;;;;:::i;:::-;;;;;;;;;;;;;52831:149;;;;;;52816:164;;53008:4;53001:11;;;52700:320;;;;;:::o;27597:110::-;27673:26;27683:2;27687:7;27673:26;;;;;;;;;;;;:9;:26::i;:::-;27597:110;;:::o;41810:173::-;41866:16;41885:6;;;;;;;;;;;41866:25;;41911:8;41902:6;;:17;;;;;;;;;;;;;;;;;;41966:8;41935:40;;41956:8;41935:40;;;;;;;;;;;;41855:128;41810:173;:::o;25985:315::-;26142:28;26152:4;26158:2;26162:7;26142:9;:28::i;:::-;26189:48;26212:4;26218:2;26222:7;26231:5;26189:22;:48::i;:::-;26181:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25985:315;;;;:::o;15991:723::-;16047:13;16277:1;16268:5;:10;16264:53;;;16295:10;;;;;;;;;;;;;;;;;;;;;16264:53;16327:12;16342:5;16327:20;;16358:14;16383:78;16398:1;16390:4;:9;16383:78;;16416:8;;;;;:::i;:::-;;;;16447:2;16439:10;;;;;:::i;:::-;;;16383:78;;;16471:19;16503:6;16493:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16471:39;;16521:154;16537:1;16528:5;:10;16521:154;;16565:1;16555:11;;;;;:::i;:::-;;;16632:2;16624:5;:10;;;;:::i;:::-;16611:2;:24;;;;:::i;:::-;16598:39;;16581:6;16588;16581:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16661:2;16652:11;;;;;:::i;:::-;;;16521:154;;;16699:6;16685:21;;;;;15991:723;;;;:::o;18448:157::-;18533:4;18572:25;18557:40;;;:11;:40;;;;18550:47;;18448:157;;;:::o;35328:589::-;35472:45;35499:4;35505:2;35509:7;35472:26;:45::i;:::-;35550:1;35534:18;;:4;:18;;;35530:187;;;35569:40;35601:7;35569:31;:40::i;:::-;35530:187;;;35639:2;35631:10;;:4;:10;;;35627:90;;35658:47;35691:4;35697:7;35658:32;:47::i;:::-;35627:90;35530:187;35745:1;35731:16;;:2;:16;;;35727:183;;;35764:45;35801:7;35764:36;:45::i;:::-;35727:183;;;35837:4;35831:10;;:2;:10;;;35827:83;;35858:40;35886:2;35890:7;35858:27;:40::i;:::-;35827:83;35727:183;35328:589;;;:::o;46229:231::-;46307:7;46328:17;46347:18;46369:27;46380:4;46386:9;46369:10;:27::i;:::-;46327:69;;;;46407:18;46419:5;46407:11;:18::i;:::-;46443:9;46436:16;;;;46229:231;;;;:::o;27934:321::-;28064:18;28070:2;28074:7;28064:5;:18::i;:::-;28115:54;28146:1;28150:2;28154:7;28163:5;28115:22;:54::i;:::-;28093:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27934:321;;;:::o;31334:799::-;31489:4;31510:15;:2;:13;;;:15::i;:::-;31506:620;;;31562:2;31546:36;;;31583:12;:10;:12::i;:::-;31597:4;31603:7;31612:5;31546:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31542:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31805:1;31788:6;:13;:18;31784:272;;;31831:60;;;;;;;;;;:::i;:::-;;;;;;;;31784:272;32006:6;32000:13;31991:6;31987:2;31983:15;31976:38;31542:529;31679:41;;;31669:51;;;:6;:51;;;;31662:58;;;;;31506:620;32110:4;32103:11;;31334:799;;;;;;;:::o;32705:126::-;;;;:::o;36640:164::-;36744:10;:17;;;;36717:15;:24;36733:7;36717:24;;;;;;;;;;;:44;;;;36772:10;36788:7;36772:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36640:164;:::o;37431:988::-;37697:22;37747:1;37722:22;37739:4;37722:16;:22::i;:::-;:26;;;;:::i;:::-;37697:51;;37759:18;37780:17;:26;37798:7;37780:26;;;;;;;;;;;;37759:47;;37927:14;37913:10;:28;37909:328;;37958:19;37980:12;:18;37993:4;37980:18;;;;;;;;;;;;;;;:34;37999:14;37980:34;;;;;;;;;;;;37958:56;;38064:11;38031:12;:18;38044:4;38031:18;;;;;;;;;;;;;;;:30;38050:10;38031:30;;;;;;;;;;;:44;;;;38181:10;38148:17;:30;38166:11;38148:30;;;;;;;;;;;:43;;;;37943:294;37909:328;38333:17;:26;38351:7;38333:26;;;;;;;;;;;38326:33;;;38377:12;:18;38390:4;38377:18;;;;;;;;;;;;;;;:34;38396:14;38377:34;;;;;;;;;;;38370:41;;;37512:907;;37431:988;;:::o;38714:1079::-;38967:22;39012:1;38992:10;:17;;;;:21;;;;:::i;:::-;38967:46;;39024:18;39045:15;:24;39061:7;39045:24;;;;;;;;;;;;39024:45;;39396:19;39418:10;39429:14;39418:26;;;;;;;;:::i;:::-;;;;;;;;;;39396:48;;39482:11;39457:10;39468;39457:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39593:10;39562:15;:28;39578:11;39562:28;;;;;;;;;;;:41;;;;39734:15;:24;39750:7;39734:24;;;;;;;;;;;39727:31;;;39769:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38785:1008;;;38714:1079;:::o;36218:221::-;36303:14;36320:20;36337:2;36320:16;:20::i;:::-;36303:37;;36378:7;36351:12;:16;36364:2;36351:16;;;;;;;;;;;;;;;:24;36368:6;36351:24;;;;;;;;;;;:34;;;;36425:6;36396:17;:26;36414:7;36396:26;;;;;;;;;;;:35;;;;36292:147;36218:221;;:::o;44119:1308::-;44200:7;44209:12;44454:2;44434:9;:16;:22;44430:990;;;44473:9;44497;44521:7;44730:4;44719:9;44715:20;44709:27;44704:32;;44780:4;44769:9;44765:20;44759:27;44754:32;;44838:4;44827:9;44823:20;44817:27;44814:1;44809:36;44804:41;;44881:25;44892:4;44898:1;44901;44904;44881:10;:25::i;:::-;44874:32;;;;;;;;;44430:990;44948:2;44928:9;:16;:22;44924:496;;;44967:9;44991:10;45203:4;45192:9;45188:20;45182:27;45177:32;;45254:4;45243:9;45239:20;45233:27;45227:33;;45296:23;45307:4;45313:1;45316:2;45296:10;:23::i;:::-;45289:30;;;;;;;;44924:496;45368:1;45372:35;45352:56;;;;44119:1308;;;;;;:::o;42390:643::-;42468:20;42459:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;42455:571;;;42505:7;;42455:571;42566:29;42557:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;42553:473;;;42612:34;;;;;;;;;;:::i;:::-;;;;;;;;42553:473;42677:35;42668:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;42664:362;;;42729:41;;;;;;;;;;:::i;:::-;;;;;;;;42664:362;42801:30;42792:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;42788:238;;;42848:44;;;;;;;;;;:::i;:::-;;;;;;;;42788:238;42923:30;42914:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;42910:116;;;42970:44;;;;;;;;;;:::i;:::-;;;;;;;;42910:116;42390:643;;:::o;28591:382::-;28685:1;28671:16;;:2;:16;;;;28663:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28744:16;28752:7;28744;:16::i;:::-;28743:17;28735:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28806:45;28835:1;28839:2;28843:7;28806:20;:45::i;:::-;28881:1;28864:9;:13;28874:2;28864:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28912:2;28893:7;:16;28901:7;28893:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28957:7;28953:2;28932:33;;28949:1;28932:33;;;;;;;;;;;;28591:382;;:::o;7680:387::-;7740:4;7948:12;8015:7;8003:20;7995:28;;8058:1;8051:4;:8;8044:15;;;7680:387;;;:::o;47728:1632::-;47859:7;47868:12;48793:66;48788:1;48780:10;;:79;48776:163;;;48892:1;48896:30;48876:51;;;;;;48776:163;48958:2;48953:1;:7;;;;:18;;;;;48969:2;48964:1;:7;;;;48953:18;48949:102;;;49004:1;49008:30;48988:51;;;;;;48949:102;49148:14;49165:24;49175:4;49181:1;49184;49187;49165:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49148:41;;49222:1;49204:20;;:6;:20;;;49200:103;;;49257:1;49261:29;49241:50;;;;;;;49200:103;49323:6;49331:20;49315:37;;;;;47728:1632;;;;;;;;:::o;46723:391::-;46837:7;46846:12;46871:9;46891:7;46946:66;46942:2;46938:75;46933:80;;47050:2;47045;47040:3;47036:12;47032:21;47027:26;;47081:25;47092:4;47098:1;47101;47104;47081:10;:25::i;:::-;47074:32;;;;;;46723:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423: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:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:553::-;2580:8;2590:6;2640:3;2633:4;2625:6;2621:17;2617:27;2607:122;;2648:79;;:::i;:::-;2607:122;2761:6;2748:20;2738:30;;2791:18;2783:6;2780:30;2777:117;;;2813:79;;:::i;:::-;2777:117;2927:4;2919:6;2915:17;2903:29;;2981:3;2973:4;2965:6;2961:17;2951:8;2947:32;2944:41;2941:128;;;2988:79;;:::i;:::-;2941:128;2522:553;;;;;:::o;3095:340::-;3151:5;3200:3;3193:4;3185:6;3181:17;3177:27;3167:122;;3208:79;;:::i;:::-;3167:122;3325:6;3312:20;3350:79;3425:3;3417:6;3410:4;3402:6;3398:17;3350:79;:::i;:::-;3341:88;;3157:278;3095:340;;;;:::o;3441:139::-;3487:5;3525:6;3512:20;3503:29;;3541:33;3568:5;3541:33;:::i;:::-;3441:139;;;;:::o;3586:329::-;3645:6;3694:2;3682:9;3673:7;3669:23;3665:32;3662:119;;;3700:79;;:::i;:::-;3662:119;3820:1;3845:53;3890:7;3881:6;3870:9;3866:22;3845:53;:::i;:::-;3835:63;;3791:117;3586:329;;;;:::o;3921:474::-;3989:6;3997;4046:2;4034:9;4025:7;4021:23;4017:32;4014:119;;;4052:79;;:::i;:::-;4014:119;4172:1;4197:53;4242:7;4233:6;4222:9;4218:22;4197:53;:::i;:::-;4187:63;;4143:117;4299:2;4325:53;4370:7;4361:6;4350:9;4346:22;4325:53;:::i;:::-;4315:63;;4270:118;3921:474;;;;;:::o;4401:619::-;4478:6;4486;4494;4543:2;4531:9;4522:7;4518:23;4514:32;4511:119;;;4549:79;;:::i;:::-;4511:119;4669:1;4694:53;4739:7;4730:6;4719:9;4715:22;4694:53;:::i;:::-;4684:63;;4640:117;4796:2;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4767:118;4924:2;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4895:118;4401:619;;;;;:::o;5026:943::-;5121:6;5129;5137;5145;5194:3;5182:9;5173:7;5169:23;5165:33;5162:120;;;5201:79;;:::i;:::-;5162:120;5321:1;5346:53;5391:7;5382:6;5371:9;5367:22;5346:53;:::i;:::-;5336:63;;5292:117;5448:2;5474:53;5519:7;5510:6;5499:9;5495:22;5474:53;:::i;:::-;5464:63;;5419:118;5576:2;5602:53;5647:7;5638:6;5627:9;5623:22;5602:53;:::i;:::-;5592:63;;5547:118;5732:2;5721:9;5717:18;5704:32;5763:18;5755:6;5752:30;5749:117;;;5785:79;;:::i;:::-;5749:117;5890:62;5944:7;5935:6;5924:9;5920:22;5890:62;:::i;:::-;5880:72;;5675:287;5026:943;;;;;;;:::o;5975:468::-;6040:6;6048;6097:2;6085:9;6076:7;6072:23;6068:32;6065:119;;;6103:79;;:::i;:::-;6065:119;6223:1;6248:53;6293:7;6284:6;6273:9;6269:22;6248:53;:::i;:::-;6238:63;;6194:117;6350:2;6376:50;6418:7;6409:6;6398:9;6394:22;6376:50;:::i;:::-;6366:60;;6321:115;5975:468;;;;;:::o;6449:474::-;6517:6;6525;6574:2;6562:9;6553:7;6549:23;6545:32;6542:119;;;6580:79;;:::i;:::-;6542:119;6700:1;6725:53;6770:7;6761:6;6750:9;6746:22;6725:53;:::i;:::-;6715:63;;6671:117;6827:2;6853:53;6898:7;6889:6;6878:9;6874:22;6853:53;:::i;:::-;6843:63;;6798:118;6449:474;;;;;:::o;6929:559::-;7015:6;7023;7072:2;7060:9;7051:7;7047:23;7043:32;7040:119;;;7078:79;;:::i;:::-;7040:119;7226:1;7215:9;7211:17;7198:31;7256:18;7248:6;7245:30;7242:117;;;7278:79;;:::i;:::-;7242:117;7391:80;7463:7;7454:6;7443:9;7439:22;7391:80;:::i;:::-;7373:98;;;;7169:312;6929:559;;;;;:::o;7494:1123::-;7599:6;7607;7615;7623;7672:3;7660:9;7651:7;7647:23;7643:33;7640:120;;;7679:79;;:::i;:::-;7640:120;7799:1;7824:53;7869:7;7860:6;7849:9;7845:22;7824:53;:::i;:::-;7814:63;;7770:117;7954:2;7943:9;7939:18;7926:32;7985:18;7977:6;7974:30;7971:117;;;8007:79;;:::i;:::-;7971:117;8112:62;8166:7;8157:6;8146:9;8142:22;8112:62;:::i;:::-;8102:72;;7897:287;8251:2;8240:9;8236:18;8223:32;8282:18;8274:6;8271:30;8268:117;;;8304:79;;:::i;:::-;8268:117;8409:63;8464:7;8455:6;8444:9;8440:22;8409:63;:::i;:::-;8399:73;;8194:288;8521:2;8547:53;8592:7;8583:6;8572:9;8568:22;8547:53;:::i;:::-;8537:63;;8492:118;7494:1123;;;;;;;:::o;8623:327::-;8681:6;8730:2;8718:9;8709:7;8705:23;8701:32;8698:119;;;8736:79;;:::i;:::-;8698:119;8856:1;8881:52;8925:7;8916:6;8905:9;8901:22;8881:52;:::i;:::-;8871:62;;8827:116;8623:327;;;;:::o;8956:349::-;9025:6;9074:2;9062:9;9053:7;9049:23;9045:32;9042:119;;;9080:79;;:::i;:::-;9042:119;9200:1;9225:63;9280:7;9271:6;9260:9;9256:22;9225:63;:::i;:::-;9215:73;;9171:127;8956:349;;;;:::o;9311:529::-;9382:6;9390;9439:2;9427:9;9418:7;9414:23;9410:32;9407:119;;;9445:79;;:::i;:::-;9407:119;9593:1;9582:9;9578:17;9565:31;9623:18;9615:6;9612:30;9609:117;;;9645:79;;:::i;:::-;9609:117;9758:65;9815:7;9806:6;9795:9;9791:22;9758:65;:::i;:::-;9740:83;;;;9536:297;9311:529;;;;;:::o;9846:329::-;9905:6;9954:2;9942:9;9933:7;9929:23;9925:32;9922:119;;;9960:79;;:::i;:::-;9922:119;10080:1;10105:53;10150:7;10141:6;10130:9;10126:22;10105:53;:::i;:::-;10095:63;;10051:117;9846:329;;;;:::o;10181:118::-;10268:24;10286:5;10268:24;:::i;:::-;10263:3;10256:37;10181:118;;:::o;10305:157::-;10410:45;10430:24;10448:5;10430:24;:::i;:::-;10410:45;:::i;:::-;10405:3;10398:58;10305:157;;:::o;10468:109::-;10549:21;10564:5;10549:21;:::i;:::-;10544:3;10537:34;10468:109;;:::o;10583:118::-;10670:24;10688:5;10670:24;:::i;:::-;10665:3;10658:37;10583:118;;:::o;10707:157::-;10812:45;10832:24;10850:5;10832:24;:::i;:::-;10812:45;:::i;:::-;10807:3;10800:58;10707:157;;:::o;10870:360::-;10956:3;10984:38;11016:5;10984:38;:::i;:::-;11038:70;11101:6;11096:3;11038:70;:::i;:::-;11031:77;;11117:52;11162:6;11157:3;11150:4;11143:5;11139:16;11117:52;:::i;:::-;11194:29;11216:6;11194:29;:::i;:::-;11189:3;11185:39;11178:46;;10960:270;10870:360;;;;:::o;11236:364::-;11324:3;11352:39;11385:5;11352:39;:::i;:::-;11407:71;11471:6;11466:3;11407:71;:::i;:::-;11400:78;;11487:52;11532:6;11527:3;11520:4;11513:5;11509:16;11487:52;:::i;:::-;11564:29;11586:6;11564:29;:::i;:::-;11559:3;11555:39;11548:46;;11328:272;11236:364;;;;:::o;11606:377::-;11712:3;11740:39;11773:5;11740:39;:::i;:::-;11795:89;11877:6;11872:3;11795:89;:::i;:::-;11788:96;;11893:52;11938:6;11933:3;11926:4;11919:5;11915:16;11893:52;:::i;:::-;11970:6;11965:3;11961:16;11954:23;;11716:267;11606:377;;;;:::o;12013:845::-;12116:3;12153:5;12147:12;12182:36;12208:9;12182:36;:::i;:::-;12234:89;12316:6;12311:3;12234:89;:::i;:::-;12227:96;;12354:1;12343:9;12339:17;12370:1;12365:137;;;;12516:1;12511:341;;;;12332:520;;12365:137;12449:4;12445:9;12434;12430:25;12425:3;12418:38;12485:6;12480:3;12476:16;12469:23;;12365:137;;12511:341;12578:38;12610:5;12578:38;:::i;:::-;12638:1;12652:154;12666:6;12663:1;12660:13;12652:154;;;12740:7;12734:14;12730:1;12725:3;12721:11;12714:35;12790:1;12781:7;12777:15;12766:26;;12688:4;12685:1;12681:12;12676:17;;12652:154;;;12835:6;12830:3;12826:16;12819:23;;12518:334;;12332:520;;12120:738;;12013:845;;;;:::o;12864:366::-;13006:3;13027:67;13091:2;13086:3;13027:67;:::i;:::-;13020:74;;13103:93;13192:3;13103:93;:::i;:::-;13221:2;13216:3;13212:12;13205:19;;12864:366;;;:::o;13236:::-;13378:3;13399:67;13463:2;13458:3;13399:67;:::i;:::-;13392:74;;13475:93;13564:3;13475:93;:::i;:::-;13593:2;13588:3;13584:12;13577:19;;13236:366;;;:::o;13608:::-;13750:3;13771:67;13835:2;13830:3;13771:67;:::i;:::-;13764:74;;13847:93;13936:3;13847:93;:::i;:::-;13965:2;13960:3;13956:12;13949:19;;13608:366;;;:::o;13980:::-;14122:3;14143:67;14207:2;14202:3;14143:67;:::i;:::-;14136:74;;14219:93;14308:3;14219:93;:::i;:::-;14337:2;14332:3;14328:12;14321:19;;13980:366;;;:::o;14352:::-;14494:3;14515:67;14579:2;14574:3;14515:67;:::i;:::-;14508:74;;14591:93;14680:3;14591:93;:::i;:::-;14709:2;14704:3;14700:12;14693:19;;14352:366;;;:::o;14724:402::-;14884:3;14905:85;14987:2;14982:3;14905:85;:::i;:::-;14898:92;;14999:93;15088:3;14999:93;:::i;:::-;15117:2;15112:3;15108:12;15101:19;;14724:402;;;:::o;15132:366::-;15274:3;15295:67;15359:2;15354:3;15295:67;:::i;:::-;15288:74;;15371:93;15460:3;15371:93;:::i;:::-;15489:2;15484:3;15480:12;15473:19;;15132:366;;;:::o;15504:::-;15646:3;15667:67;15731:2;15726:3;15667:67;:::i;:::-;15660:74;;15743:93;15832:3;15743:93;:::i;:::-;15861:2;15856:3;15852:12;15845:19;;15504:366;;;:::o;15876:::-;16018:3;16039:67;16103:2;16098:3;16039:67;:::i;:::-;16032:74;;16115:93;16204:3;16115:93;:::i;:::-;16233:2;16228:3;16224:12;16217:19;;15876:366;;;:::o;16248:::-;16390:3;16411:67;16475:2;16470:3;16411:67;:::i;:::-;16404:74;;16487:93;16576:3;16487:93;:::i;:::-;16605:2;16600:3;16596:12;16589:19;;16248:366;;;:::o;16620:::-;16762:3;16783:67;16847:2;16842:3;16783:67;:::i;:::-;16776:74;;16859:93;16948:3;16859:93;:::i;:::-;16977:2;16972:3;16968:12;16961:19;;16620:366;;;:::o;16992:::-;17134:3;17155:67;17219:2;17214:3;17155:67;:::i;:::-;17148:74;;17231:93;17320:3;17231:93;:::i;:::-;17349:2;17344:3;17340:12;17333:19;;16992:366;;;:::o;17364:::-;17506:3;17527:67;17591:2;17586:3;17527:67;:::i;:::-;17520:74;;17603:93;17692:3;17603:93;:::i;:::-;17721:2;17716:3;17712:12;17705:19;;17364:366;;;:::o;17736:::-;17878:3;17899:67;17963:2;17958:3;17899:67;:::i;:::-;17892:74;;17975:93;18064:3;17975:93;:::i;:::-;18093:2;18088:3;18084:12;18077:19;;17736:366;;;:::o;18108:::-;18250:3;18271:67;18335:2;18330:3;18271:67;:::i;:::-;18264:74;;18347:93;18436:3;18347:93;:::i;:::-;18465:2;18460:3;18456:12;18449:19;;18108:366;;;:::o;18480:::-;18622:3;18643:67;18707:2;18702:3;18643:67;:::i;:::-;18636:74;;18719:93;18808:3;18719:93;:::i;:::-;18837:2;18832:3;18828:12;18821:19;;18480:366;;;:::o;18852:::-;18994:3;19015:67;19079:2;19074:3;19015:67;:::i;:::-;19008:74;;19091:93;19180:3;19091:93;:::i;:::-;19209:2;19204:3;19200:12;19193:19;;18852:366;;;:::o;19224:::-;19366:3;19387:67;19451:2;19446:3;19387:67;:::i;:::-;19380:74;;19463:93;19552:3;19463:93;:::i;:::-;19581:2;19576:3;19572:12;19565:19;;19224:366;;;:::o;19596:365::-;19738:3;19759:66;19823:1;19818:3;19759:66;:::i;:::-;19752:73;;19834:93;19923:3;19834:93;:::i;:::-;19952:2;19947:3;19943:12;19936:19;;19596:365;;;:::o;19967:366::-;20109:3;20130:67;20194:2;20189:3;20130:67;:::i;:::-;20123:74;;20206:93;20295:3;20206:93;:::i;:::-;20324:2;20319:3;20315:12;20308:19;;19967:366;;;:::o;20339:::-;20481:3;20502:67;20566:2;20561:3;20502:67;:::i;:::-;20495:74;;20578:93;20667:3;20578:93;:::i;:::-;20696:2;20691:3;20687:12;20680:19;;20339:366;;;:::o;20711:::-;20853:3;20874:67;20938:2;20933:3;20874:67;:::i;:::-;20867:74;;20950:93;21039:3;20950:93;:::i;:::-;21068:2;21063:3;21059:12;21052:19;;20711:366;;;:::o;21083:::-;21225:3;21246:67;21310:2;21305:3;21246:67;:::i;:::-;21239:74;;21322:93;21411:3;21322:93;:::i;:::-;21440:2;21435:3;21431:12;21424:19;;21083:366;;;:::o;21455:::-;21597:3;21618:67;21682:2;21677:3;21618:67;:::i;:::-;21611:74;;21694:93;21783:3;21694:93;:::i;:::-;21812:2;21807:3;21803:12;21796:19;;21455:366;;;:::o;21827:::-;21969:3;21990:67;22054:2;22049:3;21990:67;:::i;:::-;21983:74;;22066:93;22155:3;22066:93;:::i;:::-;22184:2;22179:3;22175:12;22168:19;;21827:366;;;:::o;22199:::-;22341:3;22362:67;22426:2;22421:3;22362:67;:::i;:::-;22355:74;;22438:93;22527:3;22438:93;:::i;:::-;22556:2;22551:3;22547:12;22540:19;;22199:366;;;:::o;22571:::-;22713:3;22734:67;22798:2;22793:3;22734:67;:::i;:::-;22727:74;;22810:93;22899:3;22810:93;:::i;:::-;22928:2;22923:3;22919:12;22912:19;;22571:366;;;:::o;22943:::-;23085:3;23106:67;23170:2;23165:3;23106:67;:::i;:::-;23099:74;;23182:93;23271:3;23182:93;:::i;:::-;23300:2;23295:3;23291:12;23284:19;;22943:366;;;:::o;23315:::-;23457:3;23478:67;23542:2;23537:3;23478:67;:::i;:::-;23471:74;;23554:93;23643:3;23554:93;:::i;:::-;23672:2;23667:3;23663:12;23656:19;;23315:366;;;:::o;23687:::-;23829:3;23850:67;23914:2;23909:3;23850:67;:::i;:::-;23843:74;;23926:93;24015:3;23926:93;:::i;:::-;24044:2;24039:3;24035:12;24028:19;;23687:366;;;:::o;24059:::-;24201:3;24222:67;24286:2;24281:3;24222:67;:::i;:::-;24215:74;;24298:93;24387:3;24298:93;:::i;:::-;24416:2;24411:3;24407:12;24400:19;;24059:366;;;:::o;24431:::-;24573:3;24594:67;24658:2;24653:3;24594:67;:::i;:::-;24587:74;;24670:93;24759:3;24670:93;:::i;:::-;24788:2;24783:3;24779:12;24772:19;;24431:366;;;:::o;24803:::-;24945:3;24966:67;25030:2;25025:3;24966:67;:::i;:::-;24959:74;;25042:93;25131:3;25042:93;:::i;:::-;25160:2;25155:3;25151:12;25144:19;;24803:366;;;:::o;25175:::-;25317:3;25338:67;25402:2;25397:3;25338:67;:::i;:::-;25331:74;;25414:93;25503:3;25414:93;:::i;:::-;25532:2;25527:3;25523:12;25516:19;;25175:366;;;:::o;25547:::-;25689:3;25710:67;25774:2;25769:3;25710:67;:::i;:::-;25703:74;;25786:93;25875:3;25786:93;:::i;:::-;25904:2;25899:3;25895:12;25888:19;;25547:366;;;:::o;25919:::-;26061:3;26082:67;26146:2;26141:3;26082:67;:::i;:::-;26075:74;;26158:93;26247:3;26158:93;:::i;:::-;26276:2;26271:3;26267:12;26260:19;;25919:366;;;:::o;26291:::-;26433:3;26454:67;26518:2;26513:3;26454:67;:::i;:::-;26447:74;;26530:93;26619:3;26530:93;:::i;:::-;26648:2;26643:3;26639:12;26632:19;;26291:366;;;:::o;26663:::-;26805:3;26826:67;26890:2;26885:3;26826:67;:::i;:::-;26819:74;;26902:93;26991:3;26902:93;:::i;:::-;27020:2;27015:3;27011:12;27004:19;;26663:366;;;:::o;27035:118::-;27122:24;27140:5;27122:24;:::i;:::-;27117:3;27110:37;27035:118;;:::o;27159:157::-;27264:45;27284:24;27302:5;27284:24;:::i;:::-;27264:45;:::i;:::-;27259:3;27252:58;27159:157;;:::o;27322:112::-;27405:22;27421:5;27405:22;:::i;:::-;27400:3;27393:35;27322:112;;:::o;27440:557::-;27628:3;27643:75;27714:3;27705:6;27643:75;:::i;:::-;27743:2;27738:3;27734:12;27727:19;;27756:75;27827:3;27818:6;27756:75;:::i;:::-;27856:2;27851:3;27847:12;27840:19;;27876:95;27967:3;27958:6;27876:95;:::i;:::-;27869:102;;27988:3;27981:10;;27440:557;;;;;;:::o;28003:275::-;28135:3;28157:95;28248:3;28239:6;28157:95;:::i;:::-;28150:102;;28269:3;28262:10;;28003:275;;;;:::o;28284:429::-;28461:3;28483:92;28571:3;28562:6;28483:92;:::i;:::-;28476:99;;28592:95;28683:3;28674:6;28592:95;:::i;:::-;28585:102;;28704:3;28697:10;;28284:429;;;;;:::o;28719:522::-;28932:3;28954:148;29098:3;28954:148;:::i;:::-;28947:155;;29112:75;29183:3;29174:6;29112:75;:::i;:::-;29212:2;29207:3;29203:12;29196:19;;29232:3;29225:10;;28719:522;;;;:::o;29247:222::-;29340:4;29378:2;29367:9;29363:18;29355:26;;29391:71;29459:1;29448:9;29444:17;29435:6;29391:71;:::i;:::-;29247:222;;;;:::o;29475:640::-;29670:4;29708:3;29697:9;29693:19;29685:27;;29722:71;29790:1;29779:9;29775:17;29766:6;29722:71;:::i;:::-;29803:72;29871:2;29860:9;29856:18;29847:6;29803:72;:::i;:::-;29885;29953:2;29942:9;29938:18;29929:6;29885:72;:::i;:::-;30004:9;29998:4;29994:20;29989:2;29978:9;29974:18;29967:48;30032:76;30103:4;30094:6;30032:76;:::i;:::-;30024:84;;29475:640;;;;;;;:::o;30121:210::-;30208:4;30246:2;30235:9;30231:18;30223:26;;30259:65;30321:1;30310:9;30306:17;30297:6;30259:65;:::i;:::-;30121:210;;;;:::o;30337:545::-;30510:4;30548:3;30537:9;30533:19;30525:27;;30562:71;30630:1;30619:9;30615:17;30606:6;30562:71;:::i;:::-;30643:68;30707:2;30696:9;30692:18;30683:6;30643:68;:::i;:::-;30721:72;30789:2;30778:9;30774:18;30765:6;30721:72;:::i;:::-;30803;30871:2;30860:9;30856:18;30847:6;30803:72;:::i;:::-;30337:545;;;;;;;:::o;30888:313::-;31001:4;31039:2;31028:9;31024:18;31016:26;;31088:9;31082:4;31078:20;31074:1;31063:9;31059:17;31052:47;31116:78;31189:4;31180:6;31116:78;:::i;:::-;31108:86;;30888:313;;;;:::o;31207:419::-;31373:4;31411:2;31400:9;31396:18;31388:26;;31460:9;31454:4;31450:20;31446:1;31435:9;31431:17;31424:47;31488:131;31614:4;31488:131;:::i;:::-;31480:139;;31207:419;;;:::o;31632:::-;31798:4;31836:2;31825:9;31821:18;31813:26;;31885:9;31879:4;31875:20;31871:1;31860:9;31856:17;31849:47;31913:131;32039:4;31913:131;:::i;:::-;31905:139;;31632:419;;;:::o;32057:::-;32223:4;32261:2;32250:9;32246:18;32238:26;;32310:9;32304:4;32300:20;32296:1;32285:9;32281:17;32274:47;32338:131;32464:4;32338:131;:::i;:::-;32330:139;;32057:419;;;:::o;32482:::-;32648:4;32686:2;32675:9;32671:18;32663:26;;32735:9;32729:4;32725:20;32721:1;32710:9;32706:17;32699:47;32763:131;32889:4;32763:131;:::i;:::-;32755:139;;32482:419;;;:::o;32907:::-;33073:4;33111:2;33100:9;33096:18;33088:26;;33160:9;33154:4;33150:20;33146:1;33135:9;33131:17;33124:47;33188:131;33314:4;33188:131;:::i;:::-;33180:139;;32907:419;;;:::o;33332:::-;33498:4;33536:2;33525:9;33521:18;33513:26;;33585:9;33579:4;33575:20;33571:1;33560:9;33556:17;33549:47;33613:131;33739:4;33613:131;:::i;:::-;33605:139;;33332:419;;;:::o;33757:::-;33923:4;33961:2;33950:9;33946:18;33938:26;;34010:9;34004:4;34000:20;33996:1;33985:9;33981:17;33974:47;34038:131;34164:4;34038:131;:::i;:::-;34030:139;;33757:419;;;:::o;34182:::-;34348:4;34386:2;34375:9;34371:18;34363:26;;34435:9;34429:4;34425:20;34421:1;34410:9;34406:17;34399:47;34463:131;34589:4;34463:131;:::i;:::-;34455:139;;34182:419;;;:::o;34607:::-;34773:4;34811:2;34800:9;34796:18;34788:26;;34860:9;34854:4;34850:20;34846:1;34835:9;34831:17;34824:47;34888:131;35014:4;34888:131;:::i;:::-;34880:139;;34607:419;;;:::o;35032:::-;35198:4;35236:2;35225:9;35221:18;35213:26;;35285:9;35279:4;35275:20;35271:1;35260:9;35256:17;35249:47;35313:131;35439:4;35313:131;:::i;:::-;35305:139;;35032:419;;;:::o;35457:::-;35623:4;35661:2;35650:9;35646:18;35638:26;;35710:9;35704:4;35700:20;35696:1;35685:9;35681:17;35674:47;35738:131;35864:4;35738:131;:::i;:::-;35730:139;;35457:419;;;:::o;35882:::-;36048:4;36086:2;36075:9;36071:18;36063:26;;36135:9;36129:4;36125:20;36121:1;36110:9;36106:17;36099:47;36163:131;36289:4;36163:131;:::i;:::-;36155:139;;35882:419;;;:::o;36307:::-;36473:4;36511:2;36500:9;36496:18;36488:26;;36560:9;36554:4;36550:20;36546:1;36535:9;36531:17;36524:47;36588:131;36714:4;36588:131;:::i;:::-;36580:139;;36307:419;;;:::o;36732:::-;36898:4;36936:2;36925:9;36921:18;36913:26;;36985:9;36979:4;36975:20;36971:1;36960:9;36956:17;36949:47;37013:131;37139:4;37013:131;:::i;:::-;37005:139;;36732:419;;;:::o;37157:::-;37323:4;37361:2;37350:9;37346:18;37338:26;;37410:9;37404:4;37400:20;37396:1;37385:9;37381:17;37374:47;37438:131;37564:4;37438:131;:::i;:::-;37430:139;;37157:419;;;:::o;37582:::-;37748:4;37786:2;37775:9;37771:18;37763:26;;37835:9;37829:4;37825:20;37821:1;37810:9;37806:17;37799:47;37863:131;37989:4;37863:131;:::i;:::-;37855:139;;37582:419;;;:::o;38007:::-;38173:4;38211:2;38200:9;38196:18;38188:26;;38260:9;38254:4;38250:20;38246:1;38235:9;38231:17;38224:47;38288:131;38414:4;38288:131;:::i;:::-;38280:139;;38007:419;;;:::o;38432:::-;38598:4;38636:2;38625:9;38621:18;38613:26;;38685:9;38679:4;38675:20;38671:1;38660:9;38656:17;38649:47;38713:131;38839:4;38713:131;:::i;:::-;38705:139;;38432:419;;;:::o;38857:::-;39023:4;39061:2;39050:9;39046:18;39038:26;;39110:9;39104:4;39100:20;39096:1;39085:9;39081:17;39074:47;39138:131;39264:4;39138:131;:::i;:::-;39130:139;;38857:419;;;:::o;39282:::-;39448:4;39486:2;39475:9;39471:18;39463:26;;39535:9;39529:4;39525:20;39521:1;39510:9;39506:17;39499:47;39563:131;39689:4;39563:131;:::i;:::-;39555:139;;39282:419;;;:::o;39707:::-;39873:4;39911:2;39900:9;39896:18;39888:26;;39960:9;39954:4;39950:20;39946:1;39935:9;39931:17;39924:47;39988:131;40114:4;39988:131;:::i;:::-;39980:139;;39707:419;;;:::o;40132:::-;40298:4;40336:2;40325:9;40321:18;40313:26;;40385:9;40379:4;40375:20;40371:1;40360:9;40356:17;40349:47;40413:131;40539:4;40413:131;:::i;:::-;40405:139;;40132:419;;;:::o;40557:::-;40723:4;40761:2;40750:9;40746:18;40738:26;;40810:9;40804:4;40800:20;40796:1;40785:9;40781:17;40774:47;40838:131;40964:4;40838:131;:::i;:::-;40830:139;;40557:419;;;:::o;40982:::-;41148:4;41186:2;41175:9;41171:18;41163:26;;41235:9;41229:4;41225:20;41221:1;41210:9;41206:17;41199:47;41263:131;41389:4;41263:131;:::i;:::-;41255:139;;40982:419;;;:::o;41407:::-;41573:4;41611:2;41600:9;41596:18;41588:26;;41660:9;41654:4;41650:20;41646:1;41635:9;41631:17;41624:47;41688:131;41814:4;41688:131;:::i;:::-;41680:139;;41407:419;;;:::o;41832:::-;41998:4;42036:2;42025:9;42021:18;42013:26;;42085:9;42079:4;42075:20;42071:1;42060:9;42056:17;42049:47;42113:131;42239:4;42113:131;:::i;:::-;42105:139;;41832:419;;;:::o;42257:::-;42423:4;42461:2;42450:9;42446:18;42438:26;;42510:9;42504:4;42500:20;42496:1;42485:9;42481:17;42474:47;42538:131;42664:4;42538:131;:::i;:::-;42530:139;;42257:419;;;:::o;42682:::-;42848:4;42886:2;42875:9;42871:18;42863:26;;42935:9;42929:4;42925:20;42921:1;42910:9;42906:17;42899:47;42963:131;43089:4;42963:131;:::i;:::-;42955:139;;42682:419;;;:::o;43107:::-;43273:4;43311:2;43300:9;43296:18;43288:26;;43360:9;43354:4;43350:20;43346:1;43335:9;43331:17;43324:47;43388:131;43514:4;43388:131;:::i;:::-;43380:139;;43107:419;;;:::o;43532:::-;43698:4;43736:2;43725:9;43721:18;43713:26;;43785:9;43779:4;43775:20;43771:1;43760:9;43756:17;43749:47;43813:131;43939:4;43813:131;:::i;:::-;43805:139;;43532:419;;;:::o;43957:::-;44123:4;44161:2;44150:9;44146:18;44138:26;;44210:9;44204:4;44200:20;44196:1;44185:9;44181:17;44174:47;44238:131;44364:4;44238:131;:::i;:::-;44230:139;;43957:419;;;:::o;44382:::-;44548:4;44586:2;44575:9;44571:18;44563:26;;44635:9;44629:4;44625:20;44621:1;44610:9;44606:17;44599:47;44663:131;44789:4;44663:131;:::i;:::-;44655:139;;44382:419;;;:::o;44807:::-;44973:4;45011:2;45000:9;44996:18;44988:26;;45060:9;45054:4;45050:20;45046:1;45035:9;45031:17;45024:47;45088:131;45214:4;45088:131;:::i;:::-;45080:139;;44807:419;;;:::o;45232:::-;45398:4;45436:2;45425:9;45421:18;45413:26;;45485:9;45479:4;45475:20;45471:1;45460:9;45456:17;45449:47;45513:131;45639:4;45513:131;:::i;:::-;45505:139;;45232:419;;;:::o;45657:::-;45823:4;45861:2;45850:9;45846:18;45838:26;;45910:9;45904:4;45900:20;45896:1;45885:9;45881:17;45874:47;45938:131;46064:4;45938:131;:::i;:::-;45930:139;;45657:419;;;:::o;46082:::-;46248:4;46286:2;46275:9;46271:18;46263:26;;46335:9;46329:4;46325:20;46321:1;46310:9;46306:17;46299:47;46363:131;46489:4;46363:131;:::i;:::-;46355:139;;46082:419;;;:::o;46507:::-;46673:4;46711:2;46700:9;46696:18;46688:26;;46760:9;46754:4;46750:20;46746:1;46735:9;46731:17;46724:47;46788:131;46914:4;46788:131;:::i;:::-;46780:139;;46507:419;;;:::o;46932:222::-;47025:4;47063:2;47052:9;47048:18;47040:26;;47076:71;47144:1;47133:9;47129:17;47120:6;47076:71;:::i;:::-;46932:222;;;;:::o;47160:129::-;47194:6;47221:20;;:::i;:::-;47211:30;;47250:33;47278:4;47270:6;47250:33;:::i;:::-;47160:129;;;:::o;47295:75::-;47328:6;47361:2;47355:9;47345:19;;47295:75;:::o;47376:307::-;47437:4;47527:18;47519:6;47516:30;47513:56;;;47549:18;;:::i;:::-;47513:56;47587:29;47609:6;47587:29;:::i;:::-;47579:37;;47671:4;47665;47661:15;47653:23;;47376:307;;;:::o;47689:308::-;47751:4;47841:18;47833:6;47830:30;47827:56;;;47863:18;;:::i;:::-;47827:56;47901:29;47923:6;47901:29;:::i;:::-;47893:37;;47985:4;47979;47975:15;47967:23;;47689:308;;;:::o;48003:141::-;48052:4;48075:3;48067:11;;48098:3;48095:1;48088:14;48132:4;48129:1;48119:18;48111:26;;48003:141;;;:::o;48150:98::-;48201:6;48235:5;48229:12;48219:22;;48150:98;;;:::o;48254:99::-;48306:6;48340:5;48334:12;48324:22;;48254:99;;;:::o;48359:168::-;48442:11;48476:6;48471:3;48464:19;48516:4;48511:3;48507:14;48492:29;;48359:168;;;;:::o;48533:169::-;48617:11;48651:6;48646:3;48639:19;48691:4;48686:3;48682:14;48667:29;;48533:169;;;;:::o;48708:148::-;48810:11;48847:3;48832:18;;48708:148;;;;:::o;48862:305::-;48902:3;48921:20;48939:1;48921:20;:::i;:::-;48916:25;;48955:20;48973:1;48955:20;:::i;:::-;48950:25;;49109:1;49041:66;49037:74;49034:1;49031:81;49028:107;;;49115:18;;:::i;:::-;49028:107;49159:1;49156;49152:9;49145:16;;48862:305;;;;:::o;49173:185::-;49213:1;49230:20;49248:1;49230:20;:::i;:::-;49225:25;;49264:20;49282:1;49264:20;:::i;:::-;49259:25;;49303:1;49293:35;;49308:18;;:::i;:::-;49293:35;49350:1;49347;49343:9;49338:14;;49173:185;;;;:::o;49364:348::-;49404:7;49427:20;49445:1;49427:20;:::i;:::-;49422:25;;49461:20;49479:1;49461:20;:::i;:::-;49456:25;;49649:1;49581:66;49577:74;49574:1;49571:81;49566:1;49559:9;49552:17;49548:105;49545:131;;;49656:18;;:::i;:::-;49545:131;49704:1;49701;49697:9;49686:20;;49364:348;;;;:::o;49718:191::-;49758:4;49778:20;49796:1;49778:20;:::i;:::-;49773:25;;49812:20;49830:1;49812:20;:::i;:::-;49807:25;;49851:1;49848;49845:8;49842:34;;;49856:18;;:::i;:::-;49842:34;49901:1;49898;49894:9;49886:17;;49718:191;;;;:::o;49915:96::-;49952:7;49981:24;49999:5;49981:24;:::i;:::-;49970:35;;49915:96;;;:::o;50017:90::-;50051:7;50094:5;50087:13;50080:21;50069:32;;50017:90;;;:::o;50113:77::-;50150:7;50179:5;50168:16;;50113:77;;;:::o;50196:149::-;50232:7;50272:66;50265:5;50261:78;50250:89;;50196:149;;;:::o;50351:126::-;50388:7;50428:42;50421:5;50417:54;50406:65;;50351:126;;;:::o;50483:77::-;50520:7;50549:5;50538:16;;50483:77;;;:::o;50566:86::-;50601:7;50641:4;50634:5;50630:16;50619:27;;50566:86;;;:::o;50658:154::-;50742:6;50737:3;50732;50719:30;50804:1;50795:6;50790:3;50786:16;50779:27;50658:154;;;:::o;50818:307::-;50886:1;50896:113;50910:6;50907:1;50904:13;50896:113;;;50995:1;50990:3;50986:11;50980:18;50976:1;50971:3;50967:11;50960:39;50932:2;50929:1;50925:10;50920:15;;50896:113;;;51027:6;51024:1;51021:13;51018:101;;;51107:1;51098:6;51093:3;51089:16;51082:27;51018:101;50867:258;50818:307;;;:::o;51131:320::-;51175:6;51212:1;51206:4;51202:12;51192:22;;51259:1;51253:4;51249:12;51280:18;51270:81;;51336:4;51328:6;51324:17;51314:27;;51270:81;51398:2;51390:6;51387:14;51367:18;51364:38;51361:84;;;51417:18;;:::i;:::-;51361:84;51182:269;51131:320;;;:::o;51457:281::-;51540:27;51562:4;51540:27;:::i;:::-;51532:6;51528:40;51670:6;51658:10;51655:22;51634:18;51622:10;51619:34;51616:62;51613:88;;;51681:18;;:::i;:::-;51613:88;51721:10;51717:2;51710:22;51500:238;51457:281;;:::o;51744:233::-;51783:3;51806:24;51824:5;51806:24;:::i;:::-;51797:33;;51852:66;51845:5;51842:77;51839:103;;;51922:18;;:::i;:::-;51839:103;51969:1;51962:5;51958:13;51951:20;;51744:233;;;:::o;51983:100::-;52022:7;52051:26;52071:5;52051:26;:::i;:::-;52040:37;;51983:100;;;:::o;52089:79::-;52128:7;52157:5;52146:16;;52089:79;;;:::o;52174:94::-;52213:7;52242:20;52256:5;52242:20;:::i;:::-;52231:31;;52174:94;;;:::o;52274:79::-;52313:7;52342:5;52331:16;;52274:79;;;:::o;52359:176::-;52391:1;52408:20;52426:1;52408:20;:::i;:::-;52403:25;;52442:20;52460:1;52442:20;:::i;:::-;52437:25;;52481:1;52471:35;;52486:18;;:::i;:::-;52471:35;52527:1;52524;52520:9;52515:14;;52359:176;;;;:::o;52541:180::-;52589:77;52586:1;52579:88;52686:4;52683:1;52676:15;52710:4;52707:1;52700:15;52727:180;52775:77;52772:1;52765:88;52872:4;52869:1;52862:15;52896:4;52893:1;52886:15;52913:180;52961:77;52958:1;52951:88;53058:4;53055:1;53048:15;53082:4;53079:1;53072:15;53099:180;53147:77;53144:1;53137:88;53244:4;53241:1;53234:15;53268:4;53265:1;53258:15;53285:180;53333:77;53330:1;53323:88;53430:4;53427:1;53420:15;53454:4;53451:1;53444:15;53471:180;53519:77;53516:1;53509:88;53616:4;53613:1;53606:15;53640:4;53637:1;53630:15;53657:180;53705:77;53702:1;53695:88;53802:4;53799:1;53792:15;53826:4;53823:1;53816:15;53843:117;53952:1;53949;53942:12;53966:117;54075:1;54072;54065:12;54089:117;54198:1;54195;54188:12;54212:117;54321:1;54318;54311:12;54335:117;54444:1;54441;54434:12;54458:117;54567:1;54564;54557:12;54581:102;54622:6;54673:2;54669:7;54664:2;54657:5;54653:14;54649:28;54639:38;;54581:102;;;:::o;54689:94::-;54722:8;54770:5;54766:2;54762:14;54741:35;;54689:94;;;:::o;54789:174::-;54929:26;54925:1;54917:6;54913:14;54906:50;54789:174;:::o;54969:164::-;55109:16;55105:1;55097:6;55093:14;55086:40;54969:164;:::o;55139:162::-;55279:14;55275:1;55267:6;55263:14;55256:38;55139:162;:::o;55307:172::-;55447:24;55443:1;55435:6;55431:14;55424:48;55307:172;:::o;55485:181::-;55625:33;55621:1;55613:6;55609:14;55602:57;55485:181;:::o;55672:214::-;55812:66;55808:1;55800:6;55796:14;55789:90;55672:214;:::o;55892:230::-;56032:34;56028:1;56020:6;56016:14;56009:58;56101:13;56096:2;56088:6;56084:15;56077:38;55892:230;:::o;56128:237::-;56268:34;56264:1;56256:6;56252:14;56245:58;56337:20;56332:2;56324:6;56320:15;56313:45;56128:237;:::o;56371:225::-;56511:34;56507:1;56499:6;56495:14;56488:58;56580:8;56575:2;56567:6;56563:15;56556:33;56371:225;:::o;56602:178::-;56742:30;56738:1;56730:6;56726:14;56719:54;56602:178;:::o;56786:223::-;56926:34;56922:1;56914:6;56910:14;56903:58;56995:6;56990:2;56982:6;56978:15;56971:31;56786:223;:::o;57015:175::-;57155:27;57151:1;57143:6;57139:14;57132:51;57015:175;:::o;57196:162::-;57336:14;57332:1;57324:6;57320:14;57313:38;57196:162;:::o;57364:221::-;57504:34;57500:1;57492:6;57488:14;57481:58;57573:4;57568:2;57560:6;57556:15;57549:29;57364:221;:::o;57591:161::-;57731:13;57727:1;57719:6;57715:14;57708:37;57591:161;:::o;57758:231::-;57898:34;57894:1;57886:6;57882:14;57875:58;57967:14;57962:2;57954:6;57950:15;57943:39;57758:231;:::o;57995:165::-;58135:17;58131:1;58123:6;58119:14;58112:41;57995:165;:::o;58166:177::-;58306:29;58302:1;58294:6;58290:14;58283:53;58166:177;:::o;58349:159::-;58489:11;58485:1;58477:6;58473:14;58466:35;58349:159;:::o;58514:243::-;58654:34;58650:1;58642:6;58638:14;58631:58;58723:26;58718:2;58710:6;58706:15;58699:51;58514:243;:::o;58763:229::-;58903:34;58899:1;58891:6;58887:14;58880:58;58972:12;58967:2;58959:6;58955:15;58948:37;58763:229;:::o;58998:228::-;59138:34;59134:1;59126:6;59122:14;59115:58;59207:11;59202:2;59194:6;59190:15;59183:36;58998:228;:::o;59232:221::-;59372:34;59368:1;59360:6;59356:14;59349:58;59441:4;59436:2;59428:6;59424:15;59417:29;59232:221;:::o;59459:182::-;59599:34;59595:1;59587:6;59583:14;59576:58;59459:182;:::o;59647:231::-;59787:34;59783:1;59775:6;59771:14;59764:58;59856:14;59851:2;59843:6;59839:15;59832:39;59647:231;:::o;59884:182::-;60024:34;60020:1;60012:6;60008:14;60001:58;59884:182;:::o;60072:228::-;60212:34;60208:1;60200:6;60196:14;60189:58;60281:11;60276:2;60268:6;60264:15;60257:36;60072:228;:::o;60306:223::-;60446:34;60442:1;60434:6;60430:14;60423:58;60515:6;60510:2;60502:6;60498:15;60491:31;60306:223;:::o;60535:163::-;60675:15;60671:1;60663:6;60659:14;60652:39;60535:163;:::o;60704:160::-;60844:12;60840:1;60832:6;60828:14;60821:36;60704:160;:::o;60870:181::-;61010:33;61006:1;60998:6;60994:14;60987:57;60870:181;:::o;61057:162::-;61197:14;61193:1;61185:6;61181:14;61174:38;61057:162;:::o;61225:220::-;61365:34;61361:1;61353:6;61349:14;61342:58;61434:3;61429:2;61421:6;61417:15;61410:28;61225:220;:::o;61451:163::-;61591:15;61587:1;61579:6;61575:14;61568:39;61451:163;:::o;61620:236::-;61760:34;61756:1;61748:6;61744:14;61737:58;61829:19;61824:2;61816:6;61812:15;61805:44;61620:236;:::o;61862:231::-;62002:34;61998:1;61990:6;61986:14;61979:58;62071:14;62066:2;62058:6;62054:15;62047:39;61862:231;:::o;62099:164::-;62239:16;62235:1;62227:6;62223:14;62216:40;62099:164;:::o;62269:166::-;62409:18;62405:1;62397:6;62393:14;62386:42;62269:166;:::o;62441:122::-;62514:24;62532:5;62514:24;:::i;:::-;62507:5;62504:35;62494:63;;62553:1;62550;62543:12;62494:63;62441:122;:::o;62569:116::-;62639:21;62654:5;62639:21;:::i;:::-;62632:5;62629:32;62619:60;;62675:1;62672;62665:12;62619:60;62569:116;:::o;62691:122::-;62764:24;62782:5;62764:24;:::i;:::-;62757:5;62754:35;62744:63;;62803:1;62800;62793:12;62744:63;62691:122;:::o;62819:120::-;62891:23;62908:5;62891:23;:::i;:::-;62884:5;62881:34;62871:62;;62929:1;62926;62919:12;62871:62;62819:120;:::o;62945:122::-;63018:24;63036:5;63018:24;:::i;:::-;63011:5;63008:35;62998:63;;63057:1;63054;63047:12;62998:63;62945:122;:::o

Swarm Source

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