ETH Price: $3,468.02 (+4.11%)
Gas: 4 Gwei

Token

Cyclops Monkey Club (CMC)
 

Overview

Max Total Supply

6,666 CMC

Holders

4,245

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 CMC
0x5a364367c33542ee4640cb1db6a824be934a87f7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Exclusive Monkey Club. High utility & unique 6.666 exclusive NFT.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
nft

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-12-06
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

// File: contracts/creepies.sol



pragma solidity >=0.8.2;
// to enable certain compiler features

//import '@openzeppelin/contracts/token/ERC721/ERC721.sol';



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;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;
    
    //defines the uri for when the NFTs have not been yet revealed
    string public unrevealedURI;
    
    //marks the timestamp of when the respective sales open
    uint256 internal presaleLaunchTime;
    uint256 internal publicSaleLaunchTime;

    /**
     * @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_;
        unrevealedURI = "ipfs://QmeXXrc5Js27YBZojTqyRsEWpXAPwTk8LYNxmQociFUi5N/";
    }

    /**
     * @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");
        
        //check to see that 24 hours have passed since beginning of publicsale launch
        if (publicSaleLaunchTime == 0 || block.timestamp < publicSaleLaunchTime + 172800) {
            return unrevealedURI;
        }
        
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), '.json')) : "";
        }    
    }

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

contract nft is ERC721, Ownable {

    //amount of tokens that have been minted so far, in total and in presale
    uint256 private numberOfTotalTokens;
    uint256 private numberOfTokensPresale;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens;
    uint256 private maxTokensPresale;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint public constant mintCostPresale = 0.049 ether;
    uint public constant mintCostPublicSale = 0.098 ether;
    
    //maximum amount of mints per wallet
    uint public maxMint;
    
    //the amount of reserved mints that have currently been executed by creator and by marketing wallet
    uint private _reservedMintsCreator = 0;
    
    //the maximum amount of reserved mints allowed for creator and marketing wallet
    uint private maxReservedMintsCreator = 350;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;

    //developers wallet address
    address payable private dev = payable(0x318cBF186eB13C74533943b054959867eE44eFFE);

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;
    
    //current state os sale
    enum State {NoSale, Presale, PublicSale}
    State public saleState_;
    
    //declaring initial values for variables
    constructor() ERC721('Cyclops Monkey Club', 'CMC'){
        numberOfTotalTokens = 0;
        numberOfTokensPresale = 0;
        
        maxTotalTokens = 10000;
        maxTokensPresale = 3000;
        maxMint = 2;
        saleState_ = State.NoSale;
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }
    
    function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner {
        unrevealedURI = unrevealedURI_;
    }
    
    //gets the tokenID of NFT to be minted
    function tokenId() internal view returns(uint256) {
        return numberOfTotalTokens + 1;
    }
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }
    
    //mint a @param number of NFTs
    function mint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v, _r, _s) public payable {
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        require(numberOfTotalTokens + number <= maxTotalTokens - (maxReservedMintsCreator - _reservedMintsCreator), "Not enough NFTs left to mint..");
        
        if (saleState_ == State.Presale) {
            require(mintsPerAddress[msg.sender] + number <= maxMint, 'Maximum number of Mints per Address in Presale is 2!');
            require(msg.value >= mintCostPresale * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.049 ether for each NFT)");
            require(numberOfTokensPresale + number <= maxTokensPresale, "Not enough NFTs left to mint in Presale..");
        }
        else {
            require(msg.value >= mintCostPublicSale * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.098 ether for each NFT)");
        }
        
        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
            numberOfTotalTokens += 1;
            if (saleState_ == State.Presale) {
                numberOfTokensPresale += 1;
                if (numberOfTokensPresale == maxTokensPresale) {
                    _switchToPublicSale;
                }
            }
        }

    }
    
    //reserved NFTs for creator
    function reservedMintCreator(uint256 number) public onlyOwner {
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        require(_reservedMintsCreator + number <= maxReservedMintsCreator, "Not enough Reserved NFTs for Creator left to mint..");
        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
            numberOfTotalTokens += 1;
        }
    }
    
    //begins the minting of the NFTs
    function switchToPresale() public onlyOwner{
        require(saleState_ == State.NoSale, "Presale has already opened!");
        saleState_ = State.Presale;
        presaleLaunchTime = block.timestamp;
    }
    
    //begins the public sale
    function switchToPublicSale() public onlyOwner {
        require(saleState_ != State.PublicSale, "Public Sale is already live!");
        require(saleState_ != State.NoSale, "Cannot change to Public Sale if there has not been a Presale!");
        _switchToPublicSale();
    }
    
    function _switchToPublicSale() internal {
        saleState_ = State.PublicSale;
        publicSaleLaunchTime = block.timestamp;
        
        if (numberOfTokensPresale < maxTokensPresale) {
            numberOfTokensPresale = maxTokensPresale;
        }
    }
    
    //burn the tokens that have not been sold yet
    function burnTokens() public onlyOwner {
        maxTotalTokens = numberOfTotalTokens;
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //see the total amount of tokens that have been minted
    function totalSupply() public view returns(uint) {
        return numberOfTotalTokens;
    }
    
    //see the total amount of reserved mints that have been executed by creator
    function reservedMintsCreator() public onlyOwner view returns(uint) {
        return _reservedMintsCreator;
    }
    
    //get the funds from the minting of the NFTs
    function retrieveFunds() public onlyOwner {
        uint256 balance = accountBalance();
        require(balance > 0, "No funds to retrieve!");

        _withdraw(dev, (balance * 5)/1000);
        _withdraw(payable(msg.sender), accountBalance()); //to avoid dust eth
        
    }

    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
    
    //amount of tokens left in presale so we can restrict in website
    function tokensLeftPresale() public view returns(uint) {
        return maxTokensPresale - numberOfTokensPresale;
    }

    //see the current state of sale 
    function saleState() public view returns(State) {
        return saleState_;
    }

    //get the current price to mint
    function mintCost() public view returns(uint256) {
        if (saleState_ == State.NoSale || saleState_ == State.Presale) {
            return mintCostPresale;
        }
        else {
            return mintCostPublicSale;
        }
    }
   
}

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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCostPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCostPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"reservedMintCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsCreator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"retrieveFunds","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":"saleState","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleState_","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"tokensLeftPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600060115561015e6012557380e4929c869102140e69550bbecc20bed61b080c601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073318cbf186eb13c74533943b054959867ee44effe601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000c657600080fd5b506040518060400160405280601381526020017f4379636c6f7073204d6f6e6b657920436c7562000000000000000000000000008152506040518060400160405280600381526020017f434d43000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200014b929190620002e5565b50806001908051906020019062000164929190620002e5565b50604051806060016040528060368152602001620052f7603691396007908051906020019062000196929190620002e5565b505050620001b9620001ad6200021760201b60201c565b6200021f60201b60201c565b6000600b819055506000600c81905550612710600d81905550610bb8600e8190555060026010819055506000601660006101000a81548160ff021916908360028111156200020c576200020b620003cb565b5b021790555062000429565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002f39062000395565b90600052602060002090601f01602090048101928262000317576000855562000363565b82601f106200033257805160ff191683800117855562000363565b8280016001018555821562000363579182015b828111156200036257825182559160200191906001019062000345565b5b50905062000372919062000376565b5090565b5b808211156200039157600081600090555060010162000377565b5090565b60006002820490506001821680620003ae57607f821691505b60208210811415620003c557620003c4620003fa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614ebe80620004396000396000f3fe6080604052600436106102295760003560e01c806370a0823111610123578063bdb4b848116100ab578063eab417821161006f578063eab41782146107f3578063f16e4f841461080a578063f2fde38b14610835578063fbaca3c91461085e578063ff9849941461088957610230565b8063bdb4b848146106fa578063c4d8b9df14610725578063c87b56dd1461074e578063ca2fc70f1461078b578063e985e9c5146107b657610230565b806395d89b41116100f257806395d89b4114610627578063a22cb46514610652578063b0a1c1c41461067b578063b4561cb0146106a6578063b88d4fde146106d157610230565b806370a082311461057d578063715018a6146105ba5780637501f741146105d15780638da5cb5b146105fc57610230565b80633023eba6116101b1578063603f4d5211610175578063603f4d52146104a857806361b20d8c146104d35780636352211e146104ea57806364ef533b146105275780637035bf181461055257610230565b80633023eba6146103b357806332624114146103f057806339a0c6f91461042d57806342842e0e146104565780635136efb81461047f57610230565b8063081812fc116101f8578063081812fc146102dd578063095ea7b31461031a57806310aec4a61461034357806318160ddd1461035f57806323b872dd1461038a57610230565b80630191a6571461023557806301ffc9a71461025e57806306fdde031461029b57806308003f78146102c657610230565b3661023057005b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613284565b6108a0565b005b34801561026a57600080fd5b50610285600480360381019061028091906134ae565b610960565b6040516102929190613c6d565b60405180910390f35b3480156102a757600080fd5b506102b0610a42565b6040516102bd9190613ce8565b60405180910390f35b3480156102d257600080fd5b506102db610ad4565b005b3480156102e957600080fd5b5061030460048036038101906102ff9190613551565b610b5b565b6040516103119190613c06565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c9190613407565b610be0565b005b61035d6004803603810190610358919061357e565b610cf8565b005b34801561036b57600080fd5b506103746110fe565b60405161038191906140aa565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac91906132f1565b611108565b005b3480156103bf57600080fd5b506103da60048036038101906103d59190613284565b611168565b6040516103e791906140aa565b60405180910390f35b3480156103fc57600080fd5b5061041760048036038101906104129190613447565b611180565b6040516104249190613c6d565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190613508565b61127e565b005b34801561046257600080fd5b5061047d600480360381019061047891906132f1565b611314565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613551565b611334565b005b3480156104b457600080fd5b506104bd611523565b6040516104ca9190613ccd565b60405180910390f35b3480156104df57600080fd5b506104e861153a565b005b3480156104f657600080fd5b50610511600480360381019061050c9190613551565b61165e565b60405161051e9190613c06565b60405180910390f35b34801561053357600080fd5b5061053c611710565b60405161054991906140aa565b60405180910390f35b34801561055e57600080fd5b50610567611727565b6040516105749190613ce8565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190613284565b6117b5565b6040516105b191906140aa565b60405180910390f35b3480156105c657600080fd5b506105cf61186d565b005b3480156105dd57600080fd5b506105e66118f5565b6040516105f391906140aa565b60405180910390f35b34801561060857600080fd5b506106116118fb565b60405161061e9190613c06565b60405180910390f35b34801561063357600080fd5b5061063c611925565b6040516106499190613ce8565b60405180910390f35b34801561065e57600080fd5b50610679600480360381019061067491906133c7565b6119b7565b005b34801561068757600080fd5b50610690611b38565b60405161069d91906140aa565b60405180910390f35b3480156106b257600080fd5b506106bb611bbc565b6040516106c891906140aa565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190613344565b611c42565b005b34801561070657600080fd5b5061070f611ca4565b60405161071c91906140aa565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190613508565b611d3d565b005b34801561075a57600080fd5b5061077560048036038101906107709190613551565b611dd3565b6040516107829190613ce8565b60405180910390f35b34801561079757600080fd5b506107a0611f32565b6040516107ad91906140aa565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d891906132b1565b611f3e565b6040516107ea9190613c6d565b60405180910390f35b3480156107ff57600080fd5b50610808611fd2565b005b34801561081657600080fd5b5061081f6120f8565b60405161082c9190613ccd565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613284565b61210b565b005b34801561086a57600080fd5b50610873612203565b60405161088091906140aa565b60405180910390f35b34801561089557600080fd5b5061089e61220e565b005b6108a8612381565b73ffffffffffffffffffffffffffffffffffffffff166108c66118fb565b73ffffffffffffffffffffffffffffffffffffffff161461091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091390613faa565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a3b5750610a3a82612389565b5b9050919050565b606060008054610a51906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7d906143a1565b8015610aca5780601f10610a9f57610100808354040283529160200191610aca565b820191906000526020600020905b815481529060010190602001808311610aad57829003601f168201915b5050505050905090565b610adc612381565b73ffffffffffffffffffffffffffffffffffffffff16610afa6118fb565b73ffffffffffffffffffffffffffffffffffffffff1614610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4790613faa565b60405180910390fd5b600b54600d81905550565b6000610b66826123f3565b610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90613f6a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610beb8261165e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c539061402a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7b612381565b73ffffffffffffffffffffffffffffffffffffffff161480610caa5750610ca981610ca4612381565b611f3e565b5b610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090613eaa565b60405180910390fd5b610cf3838361245f565b505050565b828282610d0733848484611180565b610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d90613f8a565b60405180910390fd5b60006002811115610d5a57610d5961450a565b5b601660009054906101000a900460ff166002811115610d7c57610d7b61450a565b5b1415610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db49061408a565b60405180910390fd5b601154601254610dcd919061427b565b600d54610dda919061427b565b87600b54610de8919061419a565b1115610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090613e6a565b60405180910390fd5b60016002811115610e3d57610e3c61450a565b5b601660009054906101000a900460ff166002811115610e5f57610e5e61450a565b5b1415610fa05760105487601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eb3919061419a565b1115610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90613d2a565b60405180910390fd5b8666ae153d89fe8000610f079190614221565b341015610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4090613f0a565b60405180910390fd5b600e5487600c54610f5a919061419a565b1115610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290613d4a565b60405180910390fd5b610ff7565b8667015c2a7b13fd0000610fb49190614221565b341015610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90613f4a565b60405180910390fd5b5b60005b878110156110f457600061100c612518565b9050611018338261252e565b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611068919061419a565b925050819055506001600b6000828254611082919061419a565b925050819055506001600281111561109d5761109c61450a565b5b601660009054906101000a900460ff1660028111156110bf576110be61450a565b5b14156110e0576001600c60008282546110d8919061419a565b925050819055505b5080806110ec90614404565b915050610ffa565b5050505050505050565b6000600b54905090565b611119611113612381565b82612596565b611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f9061406a565b60405180910390fd5b611163838383612674565b505050565b60156020528060005260406000206000915090505481565b6000803086604051602001611196929190613b70565b6040516020818303038152906040528051906020012090506001816040516020016111c19190613bcb565b60405160208183030381529060405280519060200120868686604051600081526020016040526040516111f79493929190613c88565b6020604051602081039080840390855afa158015611219573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b611286612381565b73ffffffffffffffffffffffffffffffffffffffff166112a46118fb565b73ffffffffffffffffffffffffffffffffffffffff16146112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f190613faa565b60405180910390fd5b80600f908051906020019061131092919061306e565b5050565b61132f83838360405180602001604052806000815250611c42565b505050565b61133c612381565b73ffffffffffffffffffffffffffffffffffffffff1661135a6118fb565b73ffffffffffffffffffffffffffffffffffffffff16146113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790613faa565b60405180910390fd5b600060028111156113c4576113c361450a565b5b601660009054906101000a900460ff1660028111156113e6576113e561450a565b5b1415611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e9061408a565b60405180910390fd5b60125481601154611438919061419a565b1115611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147090613dea565b60405180910390fd5b60005b8181101561151f57600061148e612518565b905061149a338261252e565b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114ea919061419a565b925050819055506001600b6000828254611504919061419a565b9250508190555050808061151790614404565b91505061147c565b5050565b6000601660009054906101000a900460ff16905090565b611542612381565b73ffffffffffffffffffffffffffffffffffffffff166115606118fb565b73ffffffffffffffffffffffffffffffffffffffff16146115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad90613faa565b60405180910390fd5b60006115c0611b38565b905060008111611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90613d0a565b60405180910390fd5b61164a601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e860058461163b9190614221565b61164591906141f0565b6128d0565b61165b33611656611b38565b6128d0565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90613eea565b60405180910390fd5b80915050919050565b6000600c54600e54611722919061427b565b905090565b60078054611734906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611760906143a1565b80156117ad5780601f10611782576101008083540402835291602001916117ad565b820191906000526020600020905b81548152906001019060200180831161179057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d90613eca565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611875612381565b73ffffffffffffffffffffffffffffffffffffffff166118936118fb565b73ffffffffffffffffffffffffffffffffffffffff16146118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e090613faa565b60405180910390fd5b6118f36000612981565b565b60105481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611934906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611960906143a1565b80156119ad5780601f10611982576101008083540402835291602001916119ad565b820191906000526020600020905b81548152906001019060200180831161199057829003601f168201915b5050505050905090565b6119bf612381565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2490613e4a565b60405180910390fd5b8060056000611a3a612381565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ae7612381565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b2c9190613c6d565b60405180910390a35050565b6000611b42612381565b73ffffffffffffffffffffffffffffffffffffffff16611b606118fb565b73ffffffffffffffffffffffffffffffffffffffff1614611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad90613faa565b60405180910390fd5b47905090565b6000611bc6612381565b73ffffffffffffffffffffffffffffffffffffffff16611be46118fb565b73ffffffffffffffffffffffffffffffffffffffff1614611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190613faa565b60405180910390fd5b601154905090565b611c53611c4d612381565b83612596565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c899061406a565b60405180910390fd5b611c9e84848484612a47565b50505050565b6000806002811115611cb957611cb861450a565b5b601660009054906101000a900460ff166002811115611cdb57611cda61450a565b5b1480611d1a575060016002811115611cf657611cf561450a565b5b601660009054906101000a900460ff166002811115611d1857611d1761450a565b5b145b15611d2e5766ae153d89fe80009050611d3a565b67015c2a7b13fd000090505b90565b611d45612381565b73ffffffffffffffffffffffffffffffffffffffff16611d636118fb565b73ffffffffffffffffffffffffffffffffffffffff1614611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090613faa565b60405180910390fd5b8060079080519060200190611dcf92919061306e565b5050565b6060611dde826123f3565b611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1490613fea565b60405180910390fd5b60006009541480611e3d57506202a300600954611e3a919061419a565b42105b15611ed45760078054611e4f906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7b906143a1565b8015611ec85780601f10611e9d57610100808354040283529160200191611ec8565b820191906000526020600020905b815481529060010190602001808311611eab57829003601f168201915b50505050509050611f2d565b6000611ede612aa3565b90506000815111611efe5760405180602001604052806000815250611f29565b80611f0884612b35565b604051602001611f19929190613b9c565b6040516020818303038152906040525b9150505b919050565b67015c2a7b13fd000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fda612381565b73ffffffffffffffffffffffffffffffffffffffff16611ff86118fb565b73ffffffffffffffffffffffffffffffffffffffff161461204e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204590613faa565b60405180910390fd5b600060028111156120625761206161450a565b5b601660009054906101000a900460ff1660028111156120845761208361450a565b5b146120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb9061404a565b60405180910390fd5b6001601660006101000a81548160ff021916908360028111156120ea576120e961450a565b5b021790555042600881905550565b601660009054906101000a900460ff1681565b612113612381565b73ffffffffffffffffffffffffffffffffffffffff166121316118fb565b73ffffffffffffffffffffffffffffffffffffffff1614612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90613faa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee90613daa565b60405180910390fd5b61220081612981565b50565b66ae153d89fe800081565b612216612381565b73ffffffffffffffffffffffffffffffffffffffff166122346118fb565b73ffffffffffffffffffffffffffffffffffffffff161461228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228190613faa565b60405180910390fd5b60028081111561229d5761229c61450a565b5b601660009054906101000a900460ff1660028111156122bf576122be61450a565b5b1415612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790613d6a565b60405180910390fd5b600060028111156123145761231361450a565b5b601660009054906101000a900460ff1660028111156123365761233561450a565b5b1415612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e9061400a565b60405180910390fd5b61237f61254c565b565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124d28361165e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600b54612529919061419a565b905090565b612548828260405180602001604052806000815250612c96565b5050565b6002601660006101000a81548160ff021916908360028111156125725761257161450a565b5b021790555042600981905550600e54600c54101561259457600e54600c819055505b565b60006125a1826123f3565b6125e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d790613e8a565b60405180910390fd5b60006125eb8361165e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265a57508373ffffffffffffffffffffffffffffffffffffffff1661264284610b5b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061266b575061266a8185611f3e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126948261165e565b73ffffffffffffffffffffffffffffffffffffffff16146126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e190613fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275190613e2a565b60405180910390fd5b612765838383612cf1565b61277060008261245f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127c0919061427b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612817919061419a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128f690613bf1565b60006040518083038185875af1925050503d8060008114612933576040519150601f19603f3d011682016040523d82523d6000602084013e612938565b606091505b505090508061297c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297390613e0a565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a52848484612674565b612a5e84848484612cf6565b612a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9490613d8a565b60405180910390fd5b50505050565b6060600f8054612ab2906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054612ade906143a1565b8015612b2b5780601f10612b0057610100808354040283529160200191612b2b565b820191906000526020600020905b815481529060010190602001808311612b0e57829003601f168201915b5050505050905090565b60606000821415612b7d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c91565b600082905060005b60008214612baf578080612b9890614404565b915050600a82612ba891906141f0565b9150612b85565b60008167ffffffffffffffff811115612bcb57612bca614597565b5b6040519080825280601f01601f191660200182016040528015612bfd5781602001600182028036833780820191505090505b5090505b60008514612c8a57600182612c16919061427b565b9150600a85612c25919061447b565b6030612c31919061419a565b60f81b818381518110612c4757612c46614568565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c8391906141f0565b9450612c01565b8093505050505b919050565b612ca08383612e8d565b612cad6000848484612cf6565b612cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce390613d8a565b60405180910390fd5b505050565b505050565b6000612d178473ffffffffffffffffffffffffffffffffffffffff1661305b565b15612e80578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d40612381565b8786866040518563ffffffff1660e01b8152600401612d629493929190613c21565b602060405180830381600087803b158015612d7c57600080fd5b505af1925050508015612dad57506040513d601f19601f82011682018060405250810190612daa91906134db565b60015b612e30573d8060008114612ddd576040519150601f19603f3d011682016040523d82523d6000602084013e612de2565b606091505b50600081511415612e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1f90613d8a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e85565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef490613f2a565b60405180910390fd5b612f06816123f3565b15612f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3d90613dca565b60405180910390fd5b612f5260008383612cf1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa2919061419a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461307a906143a1565b90600052602060002090601f01602090048101928261309c57600085556130e3565b82601f106130b557805160ff19168380011785556130e3565b828001600101855582156130e3579182015b828111156130e25782518255916020019190600101906130c7565b5b5090506130f091906130f4565b5090565b5b8082111561310d5760008160009055506001016130f5565b5090565b600061312461311f846140ea565b6140c5565b9050828152602081018484840111156131405761313f6145cb565b5b61314b84828561435f565b509392505050565b60006131666131618461411b565b6140c5565b905082815260208101848484011115613182576131816145cb565b5b61318d84828561435f565b509392505050565b6000813590506131a481614dfe565b92915050565b6000813590506131b981614e15565b92915050565b6000813590506131ce81614e2c565b92915050565b6000813590506131e381614e43565b92915050565b6000815190506131f881614e43565b92915050565b600082601f830112613213576132126145c6565b5b8135613223848260208601613111565b91505092915050565b600082601f830112613241576132406145c6565b5b8135613251848260208601613153565b91505092915050565b60008135905061326981614e5a565b92915050565b60008135905061327e81614e71565b92915050565b60006020828403121561329a576132996145d5565b5b60006132a884828501613195565b91505092915050565b600080604083850312156132c8576132c76145d5565b5b60006132d685828601613195565b92505060206132e785828601613195565b9150509250929050565b60008060006060848603121561330a576133096145d5565b5b600061331886828701613195565b935050602061332986828701613195565b925050604061333a8682870161325a565b9150509250925092565b6000806000806080858703121561335e5761335d6145d5565b5b600061336c87828801613195565b945050602061337d87828801613195565b935050604061338e8782880161325a565b925050606085013567ffffffffffffffff8111156133af576133ae6145d0565b5b6133bb878288016131fe565b91505092959194509250565b600080604083850312156133de576133dd6145d5565b5b60006133ec85828601613195565b92505060206133fd858286016131aa565b9150509250929050565b6000806040838503121561341e5761341d6145d5565b5b600061342c85828601613195565b925050602061343d8582860161325a565b9150509250929050565b60008060008060808587031215613461576134606145d5565b5b600061346f87828801613195565b94505060206134808782880161326f565b9350506040613491878288016131bf565b92505060606134a2878288016131bf565b91505092959194509250565b6000602082840312156134c4576134c36145d5565b5b60006134d2848285016131d4565b91505092915050565b6000602082840312156134f1576134f06145d5565b5b60006134ff848285016131e9565b91505092915050565b60006020828403121561351e5761351d6145d5565b5b600082013567ffffffffffffffff81111561353c5761353b6145d0565b5b6135488482850161322c565b91505092915050565b600060208284031215613567576135666145d5565b5b60006135758482850161325a565b91505092915050565b60008060008060808587031215613598576135976145d5565b5b60006135a68782880161325a565b94505060206135b78782880161326f565b93505060406135c8878288016131bf565b92505060606135d9878288016131bf565b91505092959194509250565b6135ee816142af565b82525050565b613605613600826142af565b61444d565b82525050565b613614816142c1565b82525050565b613623816142cd565b82525050565b61363a613635826142cd565b61445f565b82525050565b600061364b8261414c565b6136558185614162565b935061366581856020860161436e565b61366e816145da565b840191505092915050565b6136828161434d565b82525050565b600061369382614157565b61369d818561417e565b93506136ad81856020860161436e565b6136b6816145da565b840191505092915050565b60006136cc82614157565b6136d6818561418f565b93506136e681856020860161436e565b80840191505092915050565b60006136ff60158361417e565b915061370a826145f8565b602082019050919050565b600061372260348361417e565b915061372d82614621565b604082019050919050565b6000613745601c8361418f565b915061375082614670565b601c82019050919050565b600061376860298361417e565b915061377382614699565b604082019050919050565b600061378b601c8361417e565b9150613796826146e8565b602082019050919050565b60006137ae60328361417e565b91506137b982614711565b604082019050919050565b60006137d160268361417e565b91506137dc82614760565b604082019050919050565b60006137f4601c8361417e565b91506137ff826147af565b602082019050919050565b600061381760338361417e565b9150613822826147d8565b604082019050919050565b600061383a60148361417e565b915061384582614827565b602082019050919050565b600061385d60248361417e565b915061386882614850565b604082019050919050565b600061388060198361417e565b915061388b8261489f565b602082019050919050565b60006138a3601e8361417e565b91506138ae826148c8565b602082019050919050565b60006138c6602c8361417e565b91506138d1826148f1565b604082019050919050565b60006138e960388361417e565b91506138f482614940565b604082019050919050565b600061390c602a8361417e565b91506139178261498f565b604082019050919050565b600061392f60298361417e565b915061393a826149de565b604082019050919050565b600061395260528361417e565b915061395d82614a2d565b606082019050919050565b600061397560208361417e565b915061398082614aa2565b602082019050919050565b600061399860528361417e565b91506139a382614acb565b606082019050919050565b60006139bb602c8361417e565b91506139c682614b40565b604082019050919050565b60006139de60058361418f565b91506139e982614b8f565b600582019050919050565b6000613a0160118361417e565b9150613a0c82614bb8565b602082019050919050565b6000613a2460208361417e565b9150613a2f82614be1565b602082019050919050565b6000613a4760298361417e565b9150613a5282614c0a565b604082019050919050565b6000613a6a602f8361417e565b9150613a7582614c59565b604082019050919050565b6000613a8d603d8361417e565b9150613a9882614ca8565b604082019050919050565b6000613ab060218361417e565b9150613abb82614cf7565b604082019050919050565b6000613ad3601b8361417e565b9150613ade82614d46565b602082019050919050565b6000613af6600083614173565b9150613b0182614d6f565b600082019050919050565b6000613b1960318361417e565b9150613b2482614d72565b604082019050919050565b6000613b3c60158361417e565b9150613b4782614dc1565b602082019050919050565b613b5b81614336565b82525050565b613b6a81614340565b82525050565b6000613b7c82856135f4565b601482019150613b8c82846135f4565b6014820191508190509392505050565b6000613ba882856136c1565b9150613bb482846136c1565b9150613bbf826139d1565b91508190509392505050565b6000613bd682613738565b9150613be28284613629565b60208201915081905092915050565b6000613bfc82613ae9565b9150819050919050565b6000602082019050613c1b60008301846135e5565b92915050565b6000608082019050613c3660008301876135e5565b613c4360208301866135e5565b613c506040830185613b52565b8181036060830152613c628184613640565b905095945050505050565b6000602082019050613c82600083018461360b565b92915050565b6000608082019050613c9d600083018761361a565b613caa6020830186613b61565b613cb7604083018561361a565b613cc4606083018461361a565b95945050505050565b6000602082019050613ce26000830184613679565b92915050565b60006020820190508181036000830152613d028184613688565b905092915050565b60006020820190508181036000830152613d23816136f2565b9050919050565b60006020820190508181036000830152613d4381613715565b9050919050565b60006020820190508181036000830152613d638161375b565b9050919050565b60006020820190508181036000830152613d838161377e565b9050919050565b60006020820190508181036000830152613da3816137a1565b9050919050565b60006020820190508181036000830152613dc3816137c4565b9050919050565b60006020820190508181036000830152613de3816137e7565b9050919050565b60006020820190508181036000830152613e038161380a565b9050919050565b60006020820190508181036000830152613e238161382d565b9050919050565b60006020820190508181036000830152613e4381613850565b9050919050565b60006020820190508181036000830152613e6381613873565b9050919050565b60006020820190508181036000830152613e8381613896565b9050919050565b60006020820190508181036000830152613ea3816138b9565b9050919050565b60006020820190508181036000830152613ec3816138dc565b9050919050565b60006020820190508181036000830152613ee3816138ff565b9050919050565b60006020820190508181036000830152613f0381613922565b9050919050565b60006020820190508181036000830152613f2381613945565b9050919050565b60006020820190508181036000830152613f4381613968565b9050919050565b60006020820190508181036000830152613f638161398b565b9050919050565b60006020820190508181036000830152613f83816139ae565b9050919050565b60006020820190508181036000830152613fa3816139f4565b9050919050565b60006020820190508181036000830152613fc381613a17565b9050919050565b60006020820190508181036000830152613fe381613a3a565b9050919050565b6000602082019050818103600083015261400381613a5d565b9050919050565b6000602082019050818103600083015261402381613a80565b9050919050565b6000602082019050818103600083015261404381613aa3565b9050919050565b6000602082019050818103600083015261406381613ac6565b9050919050565b6000602082019050818103600083015261408381613b0c565b9050919050565b600060208201905081810360008301526140a381613b2f565b9050919050565b60006020820190506140bf6000830184613b52565b92915050565b60006140cf6140e0565b90506140db82826143d3565b919050565b6000604051905090565b600067ffffffffffffffff82111561410557614104614597565b5b61410e826145da565b9050602081019050919050565b600067ffffffffffffffff82111561413657614135614597565b5b61413f826145da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006141a582614336565b91506141b083614336565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141e5576141e46144ac565b5b828201905092915050565b60006141fb82614336565b915061420683614336565b925082614216576142156144db565b5b828204905092915050565b600061422c82614336565b915061423783614336565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142705761426f6144ac565b5b828202905092915050565b600061428682614336565b915061429183614336565b9250828210156142a4576142a36144ac565b5b828203905092915050565b60006142ba82614316565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061431182614dea565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061435882614303565b9050919050565b82818337600083830152505050565b60005b8381101561438c578082015181840152602081019050614371565b8381111561439b576000848401525b50505050565b600060028204905060018216806143b957607f821691505b602082108114156143cd576143cc614539565b5b50919050565b6143dc826145da565b810181811067ffffffffffffffff821117156143fb576143fa614597565b5b80604052505050565b600061440f82614336565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614442576144416144ac565b5b600182019050919050565b600061445882614469565b9050919050565b6000819050919050565b6000614474826145eb565b9050919050565b600061448682614336565b915061449183614336565b9250826144a1576144a06144db565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b7f4d6178696d756d206e756d626572206f66204d696e747320706572204164647260008201527f65737320696e2050726573616c65206973203221000000000000000000000000602082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e7420696e2060008201527f50726573616c652e2e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f756768205265736572766564204e46547320666f722043726560008201527f61746f72206c65667420746f206d696e742e2e00000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303439206560208201527f7468657220666f722065616368204e4654290000000000000000000000000000604082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303938206560208201527f7468657220666f722065616368204e4654290000000000000000000000000000604082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b60038110614dfb57614dfa61450a565b5b50565b614e07816142af565b8114614e1257600080fd5b50565b614e1e816142c1565b8114614e2957600080fd5b50565b614e35816142cd565b8114614e4057600080fd5b50565b614e4c816142d7565b8114614e5757600080fd5b50565b614e6381614336565b8114614e6e57600080fd5b50565b614e7a81614340565b8114614e8557600080fd5b5056fea2646970667358221220568f538c7bc1816ea3673dbabbfc94101041db0bd22f6d5cc8ce97325653a31b64736f6c63430008070033697066733a2f2f516d6558587263354a73323759425a6f6a547179527345577058415077546b384c594e786d516f6369465569354e2f

Deployed Bytecode

0x6080604052600436106102295760003560e01c806370a0823111610123578063bdb4b848116100ab578063eab417821161006f578063eab41782146107f3578063f16e4f841461080a578063f2fde38b14610835578063fbaca3c91461085e578063ff9849941461088957610230565b8063bdb4b848146106fa578063c4d8b9df14610725578063c87b56dd1461074e578063ca2fc70f1461078b578063e985e9c5146107b657610230565b806395d89b41116100f257806395d89b4114610627578063a22cb46514610652578063b0a1c1c41461067b578063b4561cb0146106a6578063b88d4fde146106d157610230565b806370a082311461057d578063715018a6146105ba5780637501f741146105d15780638da5cb5b146105fc57610230565b80633023eba6116101b1578063603f4d5211610175578063603f4d52146104a857806361b20d8c146104d35780636352211e146104ea57806364ef533b146105275780637035bf181461055257610230565b80633023eba6146103b357806332624114146103f057806339a0c6f91461042d57806342842e0e146104565780635136efb81461047f57610230565b8063081812fc116101f8578063081812fc146102dd578063095ea7b31461031a57806310aec4a61461034357806318160ddd1461035f57806323b872dd1461038a57610230565b80630191a6571461023557806301ffc9a71461025e57806306fdde031461029b57806308003f78146102c657610230565b3661023057005b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613284565b6108a0565b005b34801561026a57600080fd5b50610285600480360381019061028091906134ae565b610960565b6040516102929190613c6d565b60405180910390f35b3480156102a757600080fd5b506102b0610a42565b6040516102bd9190613ce8565b60405180910390f35b3480156102d257600080fd5b506102db610ad4565b005b3480156102e957600080fd5b5061030460048036038101906102ff9190613551565b610b5b565b6040516103119190613c06565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c9190613407565b610be0565b005b61035d6004803603810190610358919061357e565b610cf8565b005b34801561036b57600080fd5b506103746110fe565b60405161038191906140aa565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac91906132f1565b611108565b005b3480156103bf57600080fd5b506103da60048036038101906103d59190613284565b611168565b6040516103e791906140aa565b60405180910390f35b3480156103fc57600080fd5b5061041760048036038101906104129190613447565b611180565b6040516104249190613c6d565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190613508565b61127e565b005b34801561046257600080fd5b5061047d600480360381019061047891906132f1565b611314565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613551565b611334565b005b3480156104b457600080fd5b506104bd611523565b6040516104ca9190613ccd565b60405180910390f35b3480156104df57600080fd5b506104e861153a565b005b3480156104f657600080fd5b50610511600480360381019061050c9190613551565b61165e565b60405161051e9190613c06565b60405180910390f35b34801561053357600080fd5b5061053c611710565b60405161054991906140aa565b60405180910390f35b34801561055e57600080fd5b50610567611727565b6040516105749190613ce8565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190613284565b6117b5565b6040516105b191906140aa565b60405180910390f35b3480156105c657600080fd5b506105cf61186d565b005b3480156105dd57600080fd5b506105e66118f5565b6040516105f391906140aa565b60405180910390f35b34801561060857600080fd5b506106116118fb565b60405161061e9190613c06565b60405180910390f35b34801561063357600080fd5b5061063c611925565b6040516106499190613ce8565b60405180910390f35b34801561065e57600080fd5b50610679600480360381019061067491906133c7565b6119b7565b005b34801561068757600080fd5b50610690611b38565b60405161069d91906140aa565b60405180910390f35b3480156106b257600080fd5b506106bb611bbc565b6040516106c891906140aa565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190613344565b611c42565b005b34801561070657600080fd5b5061070f611ca4565b60405161071c91906140aa565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190613508565b611d3d565b005b34801561075a57600080fd5b5061077560048036038101906107709190613551565b611dd3565b6040516107829190613ce8565b60405180910390f35b34801561079757600080fd5b506107a0611f32565b6040516107ad91906140aa565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d891906132b1565b611f3e565b6040516107ea9190613c6d565b60405180910390f35b3480156107ff57600080fd5b50610808611fd2565b005b34801561081657600080fd5b5061081f6120f8565b60405161082c9190613ccd565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613284565b61210b565b005b34801561086a57600080fd5b50610873612203565b60405161088091906140aa565b60405180910390f35b34801561089557600080fd5b5061089e61220e565b005b6108a8612381565b73ffffffffffffffffffffffffffffffffffffffff166108c66118fb565b73ffffffffffffffffffffffffffffffffffffffff161461091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091390613faa565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a3b5750610a3a82612389565b5b9050919050565b606060008054610a51906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7d906143a1565b8015610aca5780601f10610a9f57610100808354040283529160200191610aca565b820191906000526020600020905b815481529060010190602001808311610aad57829003601f168201915b5050505050905090565b610adc612381565b73ffffffffffffffffffffffffffffffffffffffff16610afa6118fb565b73ffffffffffffffffffffffffffffffffffffffff1614610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4790613faa565b60405180910390fd5b600b54600d81905550565b6000610b66826123f3565b610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c90613f6a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610beb8261165e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c539061402a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7b612381565b73ffffffffffffffffffffffffffffffffffffffff161480610caa5750610ca981610ca4612381565b611f3e565b5b610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090613eaa565b60405180910390fd5b610cf3838361245f565b505050565b828282610d0733848484611180565b610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d90613f8a565b60405180910390fd5b60006002811115610d5a57610d5961450a565b5b601660009054906101000a900460ff166002811115610d7c57610d7b61450a565b5b1415610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db49061408a565b60405180910390fd5b601154601254610dcd919061427b565b600d54610dda919061427b565b87600b54610de8919061419a565b1115610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090613e6a565b60405180910390fd5b60016002811115610e3d57610e3c61450a565b5b601660009054906101000a900460ff166002811115610e5f57610e5e61450a565b5b1415610fa05760105487601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eb3919061419a565b1115610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90613d2a565b60405180910390fd5b8666ae153d89fe8000610f079190614221565b341015610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4090613f0a565b60405180910390fd5b600e5487600c54610f5a919061419a565b1115610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290613d4a565b60405180910390fd5b610ff7565b8667015c2a7b13fd0000610fb49190614221565b341015610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90613f4a565b60405180910390fd5b5b60005b878110156110f457600061100c612518565b9050611018338261252e565b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611068919061419a565b925050819055506001600b6000828254611082919061419a565b925050819055506001600281111561109d5761109c61450a565b5b601660009054906101000a900460ff1660028111156110bf576110be61450a565b5b14156110e0576001600c60008282546110d8919061419a565b925050819055505b5080806110ec90614404565b915050610ffa565b5050505050505050565b6000600b54905090565b611119611113612381565b82612596565b611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f9061406a565b60405180910390fd5b611163838383612674565b505050565b60156020528060005260406000206000915090505481565b6000803086604051602001611196929190613b70565b6040516020818303038152906040528051906020012090506001816040516020016111c19190613bcb565b60405160208183030381529060405280519060200120868686604051600081526020016040526040516111f79493929190613c88565b6020604051602081039080840390855afa158015611219573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b611286612381565b73ffffffffffffffffffffffffffffffffffffffff166112a46118fb565b73ffffffffffffffffffffffffffffffffffffffff16146112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f190613faa565b60405180910390fd5b80600f908051906020019061131092919061306e565b5050565b61132f83838360405180602001604052806000815250611c42565b505050565b61133c612381565b73ffffffffffffffffffffffffffffffffffffffff1661135a6118fb565b73ffffffffffffffffffffffffffffffffffffffff16146113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790613faa565b60405180910390fd5b600060028111156113c4576113c361450a565b5b601660009054906101000a900460ff1660028111156113e6576113e561450a565b5b1415611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e9061408a565b60405180910390fd5b60125481601154611438919061419a565b1115611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147090613dea565b60405180910390fd5b60005b8181101561151f57600061148e612518565b905061149a338261252e565b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114ea919061419a565b925050819055506001600b6000828254611504919061419a565b9250508190555050808061151790614404565b91505061147c565b5050565b6000601660009054906101000a900460ff16905090565b611542612381565b73ffffffffffffffffffffffffffffffffffffffff166115606118fb565b73ffffffffffffffffffffffffffffffffffffffff16146115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad90613faa565b60405180910390fd5b60006115c0611b38565b905060008111611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90613d0a565b60405180910390fd5b61164a601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e860058461163b9190614221565b61164591906141f0565b6128d0565b61165b33611656611b38565b6128d0565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90613eea565b60405180910390fd5b80915050919050565b6000600c54600e54611722919061427b565b905090565b60078054611734906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611760906143a1565b80156117ad5780601f10611782576101008083540402835291602001916117ad565b820191906000526020600020905b81548152906001019060200180831161179057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d90613eca565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611875612381565b73ffffffffffffffffffffffffffffffffffffffff166118936118fb565b73ffffffffffffffffffffffffffffffffffffffff16146118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e090613faa565b60405180910390fd5b6118f36000612981565b565b60105481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611934906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611960906143a1565b80156119ad5780601f10611982576101008083540402835291602001916119ad565b820191906000526020600020905b81548152906001019060200180831161199057829003601f168201915b5050505050905090565b6119bf612381565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2490613e4a565b60405180910390fd5b8060056000611a3a612381565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ae7612381565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b2c9190613c6d565b60405180910390a35050565b6000611b42612381565b73ffffffffffffffffffffffffffffffffffffffff16611b606118fb565b73ffffffffffffffffffffffffffffffffffffffff1614611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad90613faa565b60405180910390fd5b47905090565b6000611bc6612381565b73ffffffffffffffffffffffffffffffffffffffff16611be46118fb565b73ffffffffffffffffffffffffffffffffffffffff1614611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190613faa565b60405180910390fd5b601154905090565b611c53611c4d612381565b83612596565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c899061406a565b60405180910390fd5b611c9e84848484612a47565b50505050565b6000806002811115611cb957611cb861450a565b5b601660009054906101000a900460ff166002811115611cdb57611cda61450a565b5b1480611d1a575060016002811115611cf657611cf561450a565b5b601660009054906101000a900460ff166002811115611d1857611d1761450a565b5b145b15611d2e5766ae153d89fe80009050611d3a565b67015c2a7b13fd000090505b90565b611d45612381565b73ffffffffffffffffffffffffffffffffffffffff16611d636118fb565b73ffffffffffffffffffffffffffffffffffffffff1614611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090613faa565b60405180910390fd5b8060079080519060200190611dcf92919061306e565b5050565b6060611dde826123f3565b611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1490613fea565b60405180910390fd5b60006009541480611e3d57506202a300600954611e3a919061419a565b42105b15611ed45760078054611e4f906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7b906143a1565b8015611ec85780601f10611e9d57610100808354040283529160200191611ec8565b820191906000526020600020905b815481529060010190602001808311611eab57829003601f168201915b50505050509050611f2d565b6000611ede612aa3565b90506000815111611efe5760405180602001604052806000815250611f29565b80611f0884612b35565b604051602001611f19929190613b9c565b6040516020818303038152906040525b9150505b919050565b67015c2a7b13fd000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fda612381565b73ffffffffffffffffffffffffffffffffffffffff16611ff86118fb565b73ffffffffffffffffffffffffffffffffffffffff161461204e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204590613faa565b60405180910390fd5b600060028111156120625761206161450a565b5b601660009054906101000a900460ff1660028111156120845761208361450a565b5b146120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb9061404a565b60405180910390fd5b6001601660006101000a81548160ff021916908360028111156120ea576120e961450a565b5b021790555042600881905550565b601660009054906101000a900460ff1681565b612113612381565b73ffffffffffffffffffffffffffffffffffffffff166121316118fb565b73ffffffffffffffffffffffffffffffffffffffff1614612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90613faa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee90613daa565b60405180910390fd5b61220081612981565b50565b66ae153d89fe800081565b612216612381565b73ffffffffffffffffffffffffffffffffffffffff166122346118fb565b73ffffffffffffffffffffffffffffffffffffffff161461228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228190613faa565b60405180910390fd5b60028081111561229d5761229c61450a565b5b601660009054906101000a900460ff1660028111156122bf576122be61450a565b5b1415612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790613d6a565b60405180910390fd5b600060028111156123145761231361450a565b5b601660009054906101000a900460ff1660028111156123365761233561450a565b5b1415612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e9061400a565b60405180910390fd5b61237f61254c565b565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124d28361165e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600b54612529919061419a565b905090565b612548828260405180602001604052806000815250612c96565b5050565b6002601660006101000a81548160ff021916908360028111156125725761257161450a565b5b021790555042600981905550600e54600c54101561259457600e54600c819055505b565b60006125a1826123f3565b6125e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d790613e8a565b60405180910390fd5b60006125eb8361165e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265a57508373ffffffffffffffffffffffffffffffffffffffff1661264284610b5b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061266b575061266a8185611f3e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126948261165e565b73ffffffffffffffffffffffffffffffffffffffff16146126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e190613fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275190613e2a565b60405180910390fd5b612765838383612cf1565b61277060008261245f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127c0919061427b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612817919061419a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128f690613bf1565b60006040518083038185875af1925050503d8060008114612933576040519150601f19603f3d011682016040523d82523d6000602084013e612938565b606091505b505090508061297c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297390613e0a565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a52848484612674565b612a5e84848484612cf6565b612a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9490613d8a565b60405180910390fd5b50505050565b6060600f8054612ab2906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054612ade906143a1565b8015612b2b5780601f10612b0057610100808354040283529160200191612b2b565b820191906000526020600020905b815481529060010190602001808311612b0e57829003601f168201915b5050505050905090565b60606000821415612b7d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c91565b600082905060005b60008214612baf578080612b9890614404565b915050600a82612ba891906141f0565b9150612b85565b60008167ffffffffffffffff811115612bcb57612bca614597565b5b6040519080825280601f01601f191660200182016040528015612bfd5781602001600182028036833780820191505090505b5090505b60008514612c8a57600182612c16919061427b565b9150600a85612c25919061447b565b6030612c31919061419a565b60f81b818381518110612c4757612c46614568565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c8391906141f0565b9450612c01565b8093505050505b919050565b612ca08383612e8d565b612cad6000848484612cf6565b612cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce390613d8a565b60405180910390fd5b505050565b505050565b6000612d178473ffffffffffffffffffffffffffffffffffffffff1661305b565b15612e80578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d40612381565b8786866040518563ffffffff1660e01b8152600401612d629493929190613c21565b602060405180830381600087803b158015612d7c57600080fd5b505af1925050508015612dad57506040513d601f19601f82011682018060405250810190612daa91906134db565b60015b612e30573d8060008114612ddd576040519150601f19603f3d011682016040523d82523d6000602084013e612de2565b606091505b50600081511415612e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1f90613d8a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e85565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef490613f2a565b60405180910390fd5b612f06816123f3565b15612f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3d90613dca565b60405180910390fd5b612f5260008383612cf1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa2919061419a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461307a906143a1565b90600052602060002090601f01602090048101928261309c57600085556130e3565b82601f106130b557805160ff19168380011785556130e3565b828001600101855582156130e3579182015b828111156130e25782518255916020019190600101906130c7565b5b5090506130f091906130f4565b5090565b5b8082111561310d5760008160009055506001016130f5565b5090565b600061312461311f846140ea565b6140c5565b9050828152602081018484840111156131405761313f6145cb565b5b61314b84828561435f565b509392505050565b60006131666131618461411b565b6140c5565b905082815260208101848484011115613182576131816145cb565b5b61318d84828561435f565b509392505050565b6000813590506131a481614dfe565b92915050565b6000813590506131b981614e15565b92915050565b6000813590506131ce81614e2c565b92915050565b6000813590506131e381614e43565b92915050565b6000815190506131f881614e43565b92915050565b600082601f830112613213576132126145c6565b5b8135613223848260208601613111565b91505092915050565b600082601f830112613241576132406145c6565b5b8135613251848260208601613153565b91505092915050565b60008135905061326981614e5a565b92915050565b60008135905061327e81614e71565b92915050565b60006020828403121561329a576132996145d5565b5b60006132a884828501613195565b91505092915050565b600080604083850312156132c8576132c76145d5565b5b60006132d685828601613195565b92505060206132e785828601613195565b9150509250929050565b60008060006060848603121561330a576133096145d5565b5b600061331886828701613195565b935050602061332986828701613195565b925050604061333a8682870161325a565b9150509250925092565b6000806000806080858703121561335e5761335d6145d5565b5b600061336c87828801613195565b945050602061337d87828801613195565b935050604061338e8782880161325a565b925050606085013567ffffffffffffffff8111156133af576133ae6145d0565b5b6133bb878288016131fe565b91505092959194509250565b600080604083850312156133de576133dd6145d5565b5b60006133ec85828601613195565b92505060206133fd858286016131aa565b9150509250929050565b6000806040838503121561341e5761341d6145d5565b5b600061342c85828601613195565b925050602061343d8582860161325a565b9150509250929050565b60008060008060808587031215613461576134606145d5565b5b600061346f87828801613195565b94505060206134808782880161326f565b9350506040613491878288016131bf565b92505060606134a2878288016131bf565b91505092959194509250565b6000602082840312156134c4576134c36145d5565b5b60006134d2848285016131d4565b91505092915050565b6000602082840312156134f1576134f06145d5565b5b60006134ff848285016131e9565b91505092915050565b60006020828403121561351e5761351d6145d5565b5b600082013567ffffffffffffffff81111561353c5761353b6145d0565b5b6135488482850161322c565b91505092915050565b600060208284031215613567576135666145d5565b5b60006135758482850161325a565b91505092915050565b60008060008060808587031215613598576135976145d5565b5b60006135a68782880161325a565b94505060206135b78782880161326f565b93505060406135c8878288016131bf565b92505060606135d9878288016131bf565b91505092959194509250565b6135ee816142af565b82525050565b613605613600826142af565b61444d565b82525050565b613614816142c1565b82525050565b613623816142cd565b82525050565b61363a613635826142cd565b61445f565b82525050565b600061364b8261414c565b6136558185614162565b935061366581856020860161436e565b61366e816145da565b840191505092915050565b6136828161434d565b82525050565b600061369382614157565b61369d818561417e565b93506136ad81856020860161436e565b6136b6816145da565b840191505092915050565b60006136cc82614157565b6136d6818561418f565b93506136e681856020860161436e565b80840191505092915050565b60006136ff60158361417e565b915061370a826145f8565b602082019050919050565b600061372260348361417e565b915061372d82614621565b604082019050919050565b6000613745601c8361418f565b915061375082614670565b601c82019050919050565b600061376860298361417e565b915061377382614699565b604082019050919050565b600061378b601c8361417e565b9150613796826146e8565b602082019050919050565b60006137ae60328361417e565b91506137b982614711565b604082019050919050565b60006137d160268361417e565b91506137dc82614760565b604082019050919050565b60006137f4601c8361417e565b91506137ff826147af565b602082019050919050565b600061381760338361417e565b9150613822826147d8565b604082019050919050565b600061383a60148361417e565b915061384582614827565b602082019050919050565b600061385d60248361417e565b915061386882614850565b604082019050919050565b600061388060198361417e565b915061388b8261489f565b602082019050919050565b60006138a3601e8361417e565b91506138ae826148c8565b602082019050919050565b60006138c6602c8361417e565b91506138d1826148f1565b604082019050919050565b60006138e960388361417e565b91506138f482614940565b604082019050919050565b600061390c602a8361417e565b91506139178261498f565b604082019050919050565b600061392f60298361417e565b915061393a826149de565b604082019050919050565b600061395260528361417e565b915061395d82614a2d565b606082019050919050565b600061397560208361417e565b915061398082614aa2565b602082019050919050565b600061399860528361417e565b91506139a382614acb565b606082019050919050565b60006139bb602c8361417e565b91506139c682614b40565b604082019050919050565b60006139de60058361418f565b91506139e982614b8f565b600582019050919050565b6000613a0160118361417e565b9150613a0c82614bb8565b602082019050919050565b6000613a2460208361417e565b9150613a2f82614be1565b602082019050919050565b6000613a4760298361417e565b9150613a5282614c0a565b604082019050919050565b6000613a6a602f8361417e565b9150613a7582614c59565b604082019050919050565b6000613a8d603d8361417e565b9150613a9882614ca8565b604082019050919050565b6000613ab060218361417e565b9150613abb82614cf7565b604082019050919050565b6000613ad3601b8361417e565b9150613ade82614d46565b602082019050919050565b6000613af6600083614173565b9150613b0182614d6f565b600082019050919050565b6000613b1960318361417e565b9150613b2482614d72565b604082019050919050565b6000613b3c60158361417e565b9150613b4782614dc1565b602082019050919050565b613b5b81614336565b82525050565b613b6a81614340565b82525050565b6000613b7c82856135f4565b601482019150613b8c82846135f4565b6014820191508190509392505050565b6000613ba882856136c1565b9150613bb482846136c1565b9150613bbf826139d1565b91508190509392505050565b6000613bd682613738565b9150613be28284613629565b60208201915081905092915050565b6000613bfc82613ae9565b9150819050919050565b6000602082019050613c1b60008301846135e5565b92915050565b6000608082019050613c3660008301876135e5565b613c4360208301866135e5565b613c506040830185613b52565b8181036060830152613c628184613640565b905095945050505050565b6000602082019050613c82600083018461360b565b92915050565b6000608082019050613c9d600083018761361a565b613caa6020830186613b61565b613cb7604083018561361a565b613cc4606083018461361a565b95945050505050565b6000602082019050613ce26000830184613679565b92915050565b60006020820190508181036000830152613d028184613688565b905092915050565b60006020820190508181036000830152613d23816136f2565b9050919050565b60006020820190508181036000830152613d4381613715565b9050919050565b60006020820190508181036000830152613d638161375b565b9050919050565b60006020820190508181036000830152613d838161377e565b9050919050565b60006020820190508181036000830152613da3816137a1565b9050919050565b60006020820190508181036000830152613dc3816137c4565b9050919050565b60006020820190508181036000830152613de3816137e7565b9050919050565b60006020820190508181036000830152613e038161380a565b9050919050565b60006020820190508181036000830152613e238161382d565b9050919050565b60006020820190508181036000830152613e4381613850565b9050919050565b60006020820190508181036000830152613e6381613873565b9050919050565b60006020820190508181036000830152613e8381613896565b9050919050565b60006020820190508181036000830152613ea3816138b9565b9050919050565b60006020820190508181036000830152613ec3816138dc565b9050919050565b60006020820190508181036000830152613ee3816138ff565b9050919050565b60006020820190508181036000830152613f0381613922565b9050919050565b60006020820190508181036000830152613f2381613945565b9050919050565b60006020820190508181036000830152613f4381613968565b9050919050565b60006020820190508181036000830152613f638161398b565b9050919050565b60006020820190508181036000830152613f83816139ae565b9050919050565b60006020820190508181036000830152613fa3816139f4565b9050919050565b60006020820190508181036000830152613fc381613a17565b9050919050565b60006020820190508181036000830152613fe381613a3a565b9050919050565b6000602082019050818103600083015261400381613a5d565b9050919050565b6000602082019050818103600083015261402381613a80565b9050919050565b6000602082019050818103600083015261404381613aa3565b9050919050565b6000602082019050818103600083015261406381613ac6565b9050919050565b6000602082019050818103600083015261408381613b0c565b9050919050565b600060208201905081810360008301526140a381613b2f565b9050919050565b60006020820190506140bf6000830184613b52565b92915050565b60006140cf6140e0565b90506140db82826143d3565b919050565b6000604051905090565b600067ffffffffffffffff82111561410557614104614597565b5b61410e826145da565b9050602081019050919050565b600067ffffffffffffffff82111561413657614135614597565b5b61413f826145da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006141a582614336565b91506141b083614336565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141e5576141e46144ac565b5b828201905092915050565b60006141fb82614336565b915061420683614336565b925082614216576142156144db565b5b828204905092915050565b600061422c82614336565b915061423783614336565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142705761426f6144ac565b5b828202905092915050565b600061428682614336565b915061429183614336565b9250828210156142a4576142a36144ac565b5b828203905092915050565b60006142ba82614316565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061431182614dea565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061435882614303565b9050919050565b82818337600083830152505050565b60005b8381101561438c578082015181840152602081019050614371565b8381111561439b576000848401525b50505050565b600060028204905060018216806143b957607f821691505b602082108114156143cd576143cc614539565b5b50919050565b6143dc826145da565b810181811067ffffffffffffffff821117156143fb576143fa614597565b5b80604052505050565b600061440f82614336565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614442576144416144ac565b5b600182019050919050565b600061445882614469565b9050919050565b6000819050919050565b6000614474826145eb565b9050919050565b600061448682614336565b915061449183614336565b9250826144a1576144a06144db565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b7f4d6178696d756d206e756d626572206f66204d696e747320706572204164647260008201527f65737320696e2050726573616c65206973203221000000000000000000000000602082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e7420696e2060008201527f50726573616c652e2e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f756768205265736572766564204e46547320666f722043726560008201527f61746f72206c65667420746f206d696e742e2e00000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303439206560208201527f7468657220666f722065616368204e4654290000000000000000000000000000604082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303938206560208201527f7468657220666f722065616368204e4654290000000000000000000000000000604082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b60038110614dfb57614dfa61450a565b5b50565b614e07816142af565b8114614e1257600080fd5b50565b614e1e816142c1565b8114614e2957600080fd5b50565b614e35816142cd565b8114614e4057600080fd5b50565b614e4c816142d7565b8114614e5757600080fd5b50565b614e6381614336565b8114614e6e57600080fd5b50565b614e7a81614340565b8114614e8557600080fd5b5056fea2646970667358221220568f538c7bc1816ea3673dbabbfc94101041db0bd22f6d5cc8ce97325653a31b64736f6c63430008070033

Deployed Bytecode Sourcemap

35655:8447:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37657:8;;;42469:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23234:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24185:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42142:94;;;;;;;;;;;;;:::i;:::-;;26036:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25559:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39228:1444;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42628:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26926:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37013:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38874:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37884:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27336:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40717:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43719:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42992:287;;;;;;;;;;;;;:::i;:::-;;23879:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43552:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22653:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23609:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:94;;;;;;;;;;;;;:::i;:::-;;36346:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24354:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26329:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42286:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42815:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27592:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43848:246;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38005:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24529:626;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36238:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26695:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41264:211;;;;;;;;;;;;;:::i;:::-;;37151:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36181:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41517:280;;;;;;;;;;;;;:::i;:::-;;42469:87;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42542:6:::1;42534:5;;:14;;;;;;;;;;;;;;;;;;42469:87:::0;:::o;23234:305::-;23336:4;23388:25;23373:40;;;:11;:40;;;;:105;;;;23445:33;23430:48;;;:11;:48;;;;23373:105;:158;;;;23495:36;23519:11;23495:23;:36::i;:::-;23373:158;23353:178;;23234:305;;;:::o;24185:100::-;24239:13;24272:5;24265:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24185:100;:::o;42142:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42209:19:::1;;42192:14;:36;;;;42142:94::o:0;26036:221::-;26112:7;26140:16;26148:7;26140;:16::i;:::-;26132:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26225:15;:24;26241:7;26225:24;;;;;;;;;;;;;;;;;;;;;26218:31;;26036:221;;;:::o;25559:411::-;25640:13;25656:23;25671:7;25656:14;:23::i;:::-;25640:39;;25704:5;25698:11;;:2;:11;;;;25690:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25798:5;25782:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25807:37;25824:5;25831:12;:10;:12::i;:::-;25807:16;:37::i;:::-;25782:62;25760:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25941:21;25950:2;25954:7;25941:8;:21::i;:::-;25629:341;25559:411;;:::o;39228:1444::-;39308:2;39312;39316;38376:41;38397:10;38408:2;38411;38414;38376:20;:41::i;:::-;38367:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39368:12:::1;39354:26;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;;39346:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;39501:21;;39475:23;;:47;;;;:::i;:::-;39457:14;;:66;;;;:::i;:::-;39447:6;39425:19;;:28;;;;:::i;:::-;:98;;39417:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;39597:13;39583:27;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;39579:615;;;39675:7;;39665:6;39635:15;:27;39651:10;39635:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:47;;39627:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;39793:6;36220:11;39775:24;;;;:::i;:::-;39762:9;:37;;39754:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;39943:16;;39933:6;39909:21;;:30;;;;:::i;:::-;:50;;39901:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;39579:615;;;40089:6;36280:11;40068:27;;;;:::i;:::-;40055:9;:40;;40047:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;39579:615;40219:9;40214:449;40238:6;40234:1;:10;40214:449;;;40266:11;40280:9;:7;:9::i;:::-;40266:23;;40304:26;40314:10;40326:3;40304:9;:26::i;:::-;40376:1;40345:15;:27;40361:10;40345:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;40415:1;40392:19;;:24;;;;;;;:::i;:::-;;;;;;;;40449:13;40435:27;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;40431:221;;;40508:1;40483:21;;:26;;;;;;;:::i;:::-;;;;;;;;40431:221;40251:412;40246:3;;;;;:::i;:::-;;;;40214:449;;;;39228:1444:::0;;;;;;;:::o;42628:94::-;42671:4;42695:19;;42688:26;;42628:94;:::o;26926:339::-;27121:41;27140:12;:10;:12::i;:::-;27154:7;27121:18;:41::i;:::-;27113:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27229:28;27239:4;27245:2;27249:7;27229:9;:28::i;:::-;26926:339;;;:::o;37013:50::-;;;;;;;;;;;;;;;;;:::o;38874:306::-;38973:4;38990:12;39040:4;39047;39015:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39005:48;;;;;;38990:63;;39080:92;39153:4;39100:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;39090:69;;;;;;39161:2;39165;39169;39080:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39071:101;;:5;;;;;;;;;;;:101;;;39064:108;;;38874:306;;;;;;:::o;37884:109::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37977:8:::1;37959:15;:26;;;;;;;;;;;;:::i;:::-;;37884:109:::0;:::o;27336:185::-;27474:39;27491:4;27497:2;27501:7;27474:39;;;;;;;;;;;;:16;:39::i;:::-;27336:185;;;:::o;40717:497::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40812:12:::1;40798:26;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;;40790:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;40903:23;;40893:6;40869:21;;:30;;;;:::i;:::-;:57;;40861:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;40998:9;40993:214;41017:6;41013:1;:10;40993:214;;;41045:11;41059:9;:7;:9::i;:::-;41045:23;;41083:26;41093:10;41105:3;41083:9;:26::i;:::-;41155:1;41124:15;:27;41140:10;41124:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;41194:1;41171:19;;:24;;;;;;;:::i;:::-;;;;;;;;41030:177;41025:3;;;;;:::i;:::-;;;;40993:214;;;;40717:497:::0;:::o;43719:84::-;43760:5;43785:10;;;;;;;;;;;43778:17;;43719:84;:::o;42992:287::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43045:15:::1;43063:16;:14;:16::i;:::-;43045:34;;43108:1;43098:7;:11;43090:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;43148:34;43158:3;;;;;;;;;;;43177:4;43174:1;43164:7;:11;;;;:::i;:::-;43163:18;;;;:::i;:::-;43148:9;:34::i;:::-;43193:48;43211:10;43224:16;:14;:16::i;:::-;43193:9;:48::i;:::-;43034:245;42992:287::o:0;23879:239::-;23951:7;23971:13;23987:7;:16;23995:7;23987:16;;;;;;;;;;;;;;;;;;;;;23971:32;;24039:1;24022:19;;:5;:19;;;;24014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24105:5;24098:12;;;23879:239;;;:::o;43552:121::-;43601:4;43644:21;;43625:16;;:40;;;;:::i;:::-;43618:47;;43552:121;:::o;22653:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23609:208::-;23681:7;23726:1;23709:19;;:5;:19;;;;23701:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23793:9;:16;23803:5;23793:16;;;;;;;;;;;;;;;;23786:23;;23609:208;;;:::o;4591:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;36346:19::-;;;;:::o;3940:87::-;3986:7;4013:6;;;;;;;;;;;4006:13;;3940:87;:::o;24354:104::-;24410:13;24443:7;24436:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24354:104;:::o;26329:295::-;26444:12;:10;:12::i;:::-;26432:24;;:8;:24;;;;26424:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26544:8;26499:18;:32;26518:12;:10;:12::i;:::-;26499:32;;;;;;;;;;;;;;;:42;26532:8;26499:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26597:8;26568:48;;26583:12;:10;:12::i;:::-;26568:48;;;26607:8;26568:48;;;;;;:::i;:::-;;;;;;;;26329:295;;:::o;42286:109::-;42342:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42366:21:::1;42359:28;;42286:109:::0;:::o;42815:115::-;42877:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42901:21:::1;;42894:28;;42815:115:::0;:::o;27592:328::-;27767:41;27786:12;:10;:12::i;:::-;27800:7;27767:18;:41::i;:::-;27759:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27873:39;27887:4;27893:2;27897:7;27906:5;27873:13;:39::i;:::-;27592:328;;;;:::o;43848:246::-;43888:7;43926:12;43912:26;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;:57;;;;43956:13;43942:27;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;43912:57;43908:179;;;36220:11;43986:22;;;;43908:179;36280:11;44050:25;;43848:246;;:::o;38005:125::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38108:14:::1;38092:13;:30;;;;;;;;;;;;:::i;:::-;;38005:125:::0;:::o;24529:626::-;24602:13;24636:16;24644:7;24636;:16::i;:::-;24628:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24840:1;24816:20;;:25;:76;;;;24886:6;24863:20;;:29;;;;:::i;:::-;24845:15;:47;24816:76;24812:332;;;24916:13;24909:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24812:332;24981:21;25005:10;:8;:10::i;:::-;24981:34;;25061:1;25043:7;25037:21;:25;:95;;;;;;;;;;;;;;;;;25089:7;25098:18;:7;:16;:18::i;:::-;25072:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25037:95;25030:102;;;24529:626;;;;:::o;36238:53::-;36280:11;36238:53;:::o;26695:164::-;26792:4;26816:18;:25;26835:5;26816:25;;;;;;;;;;;;;;;:35;26842:8;26816:35;;;;;;;;;;;;;;;;;;;;;;;;;26809:42;;26695:164;;;;:::o;41264:211::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41340:12:::1;41326:26;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;41318:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41408:13;41395:10;;:26;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;41452:15;41432:17;:35;;;;41264:211::o:0;37151:23::-;;;;;;;;;;;;;:::o;4840:192::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:1:::1;4929:22;;:8;:22;;;;4921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:19;5015:8;5005:9;:19::i;:::-;4840:192:::0;:::o;36181:50::-;36220:11;36181:50;:::o;41517:280::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41597:16:::1;41583:30:::0;::::1;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;;41575:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41679:12;41665:26;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;;41657:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;41768:21;:19;:21::i;:::-;41517:280::o:0;2728:98::-;2781:7;2808:10;2801:17;;2728:98;:::o;15926:157::-;16011:4;16050:25;16035:40;;;:11;:40;;;;16028:47;;15926:157;;;:::o;29430:127::-;29495:4;29547:1;29519:30;;:7;:16;29527:7;29519:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29512:37;;29430:127;;;:::o;33412:174::-;33514:2;33487:15;:24;33503:7;33487:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33570:7;33566:2;33532:46;;33541:23;33556:7;33541:14;:23::i;:::-;33532:46;;;;;;;;;;;;33412:174;;:::o;38186:99::-;38227:7;38276:1;38254:19;;:23;;;;:::i;:::-;38247:30;;38186:99;:::o;30414:110::-;30490:26;30500:2;30504:7;30490:26;;;;;;;;;;;;:9;:26::i;:::-;30414:110;;:::o;41809:270::-;41873:16;41860:10;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;41923:15;41900:20;:38;;;;41987:16;;41963:21;;:40;41959:113;;;42044:16;;42020:21;:40;;;;41959:113;41809:270::o;29724:348::-;29817:4;29842:16;29850:7;29842;:16::i;:::-;29834:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29918:13;29934:23;29949:7;29934:14;:23::i;:::-;29918:39;;29987:5;29976:16;;:7;:16;;;:51;;;;30020:7;29996:31;;:20;30008:7;29996:11;:20::i;:::-;:31;;;29976:51;:87;;;;30031:32;30048:5;30055:7;30031:16;:32::i;:::-;29976:87;29968:96;;;29724:348;;;;:::o;32716:578::-;32875:4;32848:31;;:23;32863:7;32848:14;:23::i;:::-;:31;;;32840:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32958:1;32944:16;;:2;:16;;;;32936:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33014:39;33035:4;33041:2;33045:7;33014:20;:39::i;:::-;33118:29;33135:1;33139:7;33118:8;:29::i;:::-;33179:1;33160:9;:15;33170:4;33160:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33208:1;33191:9;:13;33201:2;33191:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33239:2;33220:7;:16;33228:7;33220:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33278:7;33274:2;33259:27;;33268:4;33259:27;;;;;;;;;;;;32716:578;;;:::o;43287:183::-;43368:9;43383:7;:12;;43403:6;43383:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43367:47;;;43433:4;43425:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;43356:114;43287:183;;:::o;5040:173::-;5096:16;5115:6;;;;;;;;;;;5096:25;;5141:8;5132:6;;:17;;;;;;;;;;;;;;;;;;5196:8;5165:40;;5186:8;5165:40;;;;;;;;;;;;5085:128;5040:173;:::o;28802:315::-;28959:28;28969:4;28975:2;28979:7;28959:9;:28::i;:::-;29006:48;29029:4;29035:2;29039:7;29048:5;29006:22;:48::i;:::-;28998:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28802:315;;;;:::o;37710:116::-;37770:13;37803:15;37796:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37710:116;:::o;344:723::-;400:13;630:1;621:5;:10;617:53;;;648:10;;;;;;;;;;;;;;;;;;;;;617:53;680:12;695:5;680:20;;711:14;736:78;751:1;743:4;:9;736:78;;769:8;;;;;:::i;:::-;;;;800:2;792:10;;;;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;824:39;;874:154;890:1;881:5;:10;874:154;;918:1;908:11;;;;;:::i;:::-;;;985:2;977:5;:10;;;;:::i;:::-;964:2;:24;;;;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1014:2;1005:11;;;;;:::i;:::-;;;874:154;;;1052:6;1038:21;;;;;344:723;;;;:::o;30751:321::-;30881:18;30887:2;30891:7;30881:5;:18::i;:::-;30932:54;30963:1;30967:2;30971:7;30980:5;30932:22;:54::i;:::-;30910:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30751:321;;;:::o;35522:126::-;;;;:::o;34151:799::-;34306:4;34327:15;:2;:13;;;:15::i;:::-;34323:620;;;34379:2;34363:36;;;34400:12;:10;:12::i;:::-;34414:4;34420:7;34429:5;34363:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34359:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34622:1;34605:6;:13;:18;34601:272;;;34648:60;;;;;;;;;;:::i;:::-;;;;;;;;34601:272;34823:6;34817:13;34808:6;34804:2;34800:15;34793:38;34359:529;34496:41;;;34486:51;;;:6;:51;;;;34479:58;;;;;34323:620;34927:4;34920:11;;34151:799;;;;;;;:::o;31408:382::-;31502:1;31488:16;;:2;:16;;;;31480:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31561:16;31569:7;31561;:16::i;:::-;31560:17;31552:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31623:45;31652:1;31656:2;31660:7;31623:20;:45::i;:::-;31698:1;31681:9;:13;31691:2;31681:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31729:2;31710:7;:16;31718:7;31710:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31774:7;31770:2;31749:33;;31766:1;31749:33;;;;;;;;;;;;31408:382;;:::o;5986:387::-;6046:4;6254:12;6321:7;6309:20;6301:28;;6364:1;6357:4;:8;6350:15;;;5986:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423: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;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:135::-;2466:5;2504:6;2491:20;2482:29;;2520:31;2545:5;2520:31;:::i;:::-;2422:135;;;;:::o;2563:329::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2797:1;2822:53;2867:7;2858:6;2847:9;2843:22;2822:53;:::i;:::-;2812:63;;2768:117;2563:329;;;;:::o;2898:474::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3120:117;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2898:474;;;;;:::o;3378:619::-;3455:6;3463;3471;3520:2;3508:9;3499:7;3495:23;3491:32;3488:119;;;3526:79;;:::i;:::-;3488:119;3646:1;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3617:117;3773:2;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3744:118;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;3378:619;;;;;:::o;4003:943::-;4098:6;4106;4114;4122;4171:3;4159:9;4150:7;4146:23;4142:33;4139:120;;;4178:79;;:::i;:::-;4139:120;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4709:2;4698:9;4694:18;4681:32;4740:18;4732:6;4729:30;4726:117;;;4762:79;;:::i;:::-;4726:117;4867:62;4921:7;4912:6;4901:9;4897:22;4867:62;:::i;:::-;4857:72;;4652:287;4003:943;;;;;;;:::o;4952:468::-;5017:6;5025;5074:2;5062:9;5053:7;5049:23;5045:32;5042:119;;;5080:79;;:::i;:::-;5042:119;5200:1;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5171:117;5327:2;5353:50;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;;5298:115;4952:468;;;;;:::o;5426:474::-;5494:6;5502;5551:2;5539:9;5530:7;5526:23;5522:32;5519:119;;;5557:79;;:::i;:::-;5519:119;5677:1;5702:53;5747:7;5738:6;5727:9;5723:22;5702:53;:::i;:::-;5692:63;;5648:117;5804:2;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5775:118;5426:474;;;;;:::o;5906:761::-;5990:6;5998;6006;6014;6063:3;6051:9;6042:7;6038:23;6034:33;6031:120;;;6070:79;;:::i;:::-;6031:120;6190:1;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6161:117;6317:2;6343:51;6386:7;6377:6;6366:9;6362:22;6343:51;:::i;:::-;6333:61;;6288:116;6443:2;6469:53;6514:7;6505:6;6494:9;6490:22;6469:53;:::i;:::-;6459:63;;6414:118;6571:2;6597:53;6642:7;6633:6;6622:9;6618:22;6597:53;:::i;:::-;6587:63;;6542:118;5906:761;;;;;;;:::o;6673:327::-;6731:6;6780:2;6768:9;6759:7;6755:23;6751:32;6748:119;;;6786:79;;:::i;:::-;6748:119;6906:1;6931:52;6975:7;6966:6;6955:9;6951:22;6931:52;:::i;:::-;6921:62;;6877:116;6673:327;;;;:::o;7006:349::-;7075:6;7124:2;7112:9;7103:7;7099:23;7095:32;7092:119;;;7130:79;;:::i;:::-;7092:119;7250:1;7275:63;7330:7;7321:6;7310:9;7306:22;7275:63;:::i;:::-;7265:73;;7221:127;7006:349;;;;:::o;7361:509::-;7430:6;7479:2;7467:9;7458:7;7454:23;7450:32;7447:119;;;7485:79;;:::i;:::-;7447:119;7633:1;7622:9;7618:17;7605:31;7663:18;7655:6;7652:30;7649:117;;;7685:79;;:::i;:::-;7649:117;7790:63;7845:7;7836:6;7825:9;7821:22;7790:63;:::i;:::-;7780:73;;7576:287;7361:509;;;;:::o;7876:329::-;7935:6;7984:2;7972:9;7963:7;7959:23;7955:32;7952:119;;;7990:79;;:::i;:::-;7952:119;8110:1;8135:53;8180:7;8171:6;8160:9;8156:22;8135:53;:::i;:::-;8125:63;;8081:117;7876:329;;;;:::o;8211:761::-;8295:6;8303;8311;8319;8368:3;8356:9;8347:7;8343:23;8339:33;8336:120;;;8375:79;;:::i;:::-;8336:120;8495:1;8520:53;8565:7;8556:6;8545:9;8541:22;8520:53;:::i;:::-;8510:63;;8466:117;8622:2;8648:51;8691:7;8682:6;8671:9;8667:22;8648:51;:::i;:::-;8638:61;;8593:116;8748:2;8774:53;8819:7;8810:6;8799:9;8795:22;8774:53;:::i;:::-;8764:63;;8719:118;8876:2;8902:53;8947:7;8938:6;8927:9;8923:22;8902:53;:::i;:::-;8892:63;;8847:118;8211:761;;;;;;;:::o;8978:118::-;9065:24;9083:5;9065:24;:::i;:::-;9060:3;9053:37;8978:118;;:::o;9102:157::-;9207:45;9227:24;9245:5;9227:24;:::i;:::-;9207:45;:::i;:::-;9202:3;9195:58;9102:157;;:::o;9265:109::-;9346:21;9361:5;9346:21;:::i;:::-;9341:3;9334:34;9265:109;;:::o;9380:118::-;9467:24;9485:5;9467:24;:::i;:::-;9462:3;9455:37;9380:118;;:::o;9504:157::-;9609:45;9629:24;9647:5;9629:24;:::i;:::-;9609:45;:::i;:::-;9604:3;9597:58;9504:157;;:::o;9667:360::-;9753:3;9781:38;9813:5;9781:38;:::i;:::-;9835:70;9898:6;9893:3;9835:70;:::i;:::-;9828:77;;9914:52;9959:6;9954:3;9947:4;9940:5;9936:16;9914:52;:::i;:::-;9991:29;10013:6;9991:29;:::i;:::-;9986:3;9982:39;9975:46;;9757:270;9667:360;;;;:::o;10033:147::-;10128:45;10167:5;10128:45;:::i;:::-;10123:3;10116:58;10033:147;;:::o;10186:364::-;10274:3;10302:39;10335:5;10302:39;:::i;:::-;10357:71;10421:6;10416:3;10357:71;:::i;:::-;10350:78;;10437:52;10482:6;10477:3;10470:4;10463:5;10459:16;10437:52;:::i;:::-;10514:29;10536:6;10514:29;:::i;:::-;10509:3;10505:39;10498:46;;10278:272;10186:364;;;;:::o;10556:377::-;10662:3;10690:39;10723:5;10690:39;:::i;:::-;10745:89;10827:6;10822:3;10745:89;:::i;:::-;10738:96;;10843:52;10888:6;10883:3;10876:4;10869:5;10865:16;10843:52;:::i;:::-;10920:6;10915:3;10911:16;10904:23;;10666:267;10556:377;;;;:::o;10939:366::-;11081:3;11102:67;11166:2;11161:3;11102:67;:::i;:::-;11095:74;;11178:93;11267:3;11178:93;:::i;:::-;11296:2;11291:3;11287:12;11280:19;;10939:366;;;:::o;11311:::-;11453:3;11474:67;11538:2;11533:3;11474:67;:::i;:::-;11467:74;;11550:93;11639:3;11550:93;:::i;:::-;11668:2;11663:3;11659:12;11652:19;;11311:366;;;:::o;11683:402::-;11843:3;11864:85;11946:2;11941:3;11864:85;:::i;:::-;11857:92;;11958:93;12047:3;11958:93;:::i;:::-;12076:2;12071:3;12067:12;12060:19;;11683:402;;;:::o;12091:366::-;12233:3;12254:67;12318:2;12313:3;12254:67;:::i;:::-;12247:74;;12330:93;12419:3;12330:93;:::i;:::-;12448:2;12443:3;12439:12;12432:19;;12091:366;;;:::o;12463:::-;12605:3;12626:67;12690:2;12685:3;12626:67;:::i;:::-;12619:74;;12702:93;12791:3;12702:93;:::i;:::-;12820:2;12815:3;12811:12;12804:19;;12463:366;;;:::o;12835:::-;12977:3;12998:67;13062:2;13057:3;12998:67;:::i;:::-;12991:74;;13074:93;13163:3;13074:93;:::i;:::-;13192:2;13187:3;13183:12;13176:19;;12835:366;;;:::o;13207:::-;13349:3;13370:67;13434:2;13429:3;13370:67;:::i;:::-;13363:74;;13446:93;13535:3;13446:93;:::i;:::-;13564:2;13559:3;13555:12;13548:19;;13207:366;;;:::o;13579:::-;13721:3;13742:67;13806:2;13801:3;13742:67;:::i;:::-;13735:74;;13818:93;13907:3;13818:93;:::i;:::-;13936:2;13931:3;13927:12;13920:19;;13579:366;;;:::o;13951:::-;14093:3;14114:67;14178:2;14173:3;14114:67;:::i;:::-;14107:74;;14190:93;14279:3;14190:93;:::i;:::-;14308:2;14303:3;14299:12;14292:19;;13951:366;;;:::o;14323:::-;14465:3;14486:67;14550:2;14545:3;14486:67;:::i;:::-;14479:74;;14562:93;14651:3;14562:93;:::i;:::-;14680:2;14675:3;14671:12;14664:19;;14323:366;;;:::o;14695:::-;14837:3;14858:67;14922:2;14917:3;14858:67;:::i;:::-;14851:74;;14934:93;15023:3;14934:93;:::i;:::-;15052:2;15047:3;15043:12;15036:19;;14695:366;;;:::o;15067:::-;15209:3;15230:67;15294:2;15289:3;15230:67;:::i;:::-;15223:74;;15306:93;15395:3;15306:93;:::i;:::-;15424:2;15419:3;15415:12;15408:19;;15067:366;;;:::o;15439:::-;15581:3;15602:67;15666:2;15661:3;15602:67;:::i;:::-;15595:74;;15678:93;15767:3;15678:93;:::i;:::-;15796:2;15791:3;15787:12;15780:19;;15439:366;;;:::o;15811:::-;15953:3;15974:67;16038:2;16033:3;15974:67;:::i;:::-;15967:74;;16050:93;16139:3;16050:93;:::i;:::-;16168:2;16163:3;16159:12;16152:19;;15811:366;;;:::o;16183:::-;16325:3;16346:67;16410:2;16405:3;16346:67;:::i;:::-;16339:74;;16422:93;16511:3;16422:93;:::i;:::-;16540:2;16535:3;16531:12;16524:19;;16183:366;;;:::o;16555:::-;16697:3;16718:67;16782:2;16777:3;16718:67;:::i;:::-;16711:74;;16794:93;16883:3;16794:93;:::i;:::-;16912:2;16907:3;16903:12;16896:19;;16555:366;;;:::o;16927:::-;17069:3;17090:67;17154:2;17149:3;17090:67;:::i;:::-;17083:74;;17166:93;17255:3;17166:93;:::i;:::-;17284:2;17279:3;17275:12;17268:19;;16927:366;;;:::o;17299:::-;17441:3;17462:67;17526:2;17521:3;17462:67;:::i;:::-;17455:74;;17538:93;17627:3;17538:93;:::i;:::-;17656:2;17651:3;17647:12;17640:19;;17299:366;;;:::o;17671:::-;17813:3;17834:67;17898:2;17893:3;17834:67;:::i;:::-;17827:74;;17910:93;17999:3;17910:93;:::i;:::-;18028:2;18023:3;18019:12;18012:19;;17671:366;;;:::o;18043:::-;18185:3;18206:67;18270:2;18265:3;18206:67;:::i;:::-;18199:74;;18282:93;18371:3;18282:93;:::i;:::-;18400:2;18395:3;18391:12;18384:19;;18043:366;;;:::o;18415:::-;18557:3;18578:67;18642:2;18637:3;18578:67;:::i;:::-;18571:74;;18654:93;18743:3;18654:93;:::i;:::-;18772:2;18767:3;18763:12;18756:19;;18415:366;;;:::o;18787:400::-;18947:3;18968:84;19050:1;19045:3;18968:84;:::i;:::-;18961:91;;19061:93;19150:3;19061:93;:::i;:::-;19179:1;19174:3;19170:11;19163:18;;18787:400;;;:::o;19193:366::-;19335:3;19356:67;19420:2;19415:3;19356:67;:::i;:::-;19349:74;;19432:93;19521:3;19432:93;:::i;:::-;19550:2;19545:3;19541:12;19534:19;;19193:366;;;:::o;19565:::-;19707:3;19728:67;19792:2;19787:3;19728:67;:::i;:::-;19721:74;;19804:93;19893:3;19804:93;:::i;:::-;19922:2;19917:3;19913:12;19906:19;;19565:366;;;:::o;19937:::-;20079:3;20100:67;20164:2;20159:3;20100:67;:::i;:::-;20093:74;;20176:93;20265:3;20176:93;:::i;:::-;20294:2;20289:3;20285:12;20278:19;;19937:366;;;:::o;20309:::-;20451:3;20472:67;20536:2;20531:3;20472:67;:::i;:::-;20465:74;;20548:93;20637:3;20548:93;:::i;:::-;20666:2;20661:3;20657:12;20650:19;;20309:366;;;:::o;20681:::-;20823:3;20844:67;20908:2;20903:3;20844:67;:::i;:::-;20837:74;;20920:93;21009:3;20920:93;:::i;:::-;21038:2;21033:3;21029:12;21022:19;;20681:366;;;:::o;21053:::-;21195:3;21216:67;21280:2;21275:3;21216:67;:::i;:::-;21209:74;;21292:93;21381:3;21292:93;:::i;:::-;21410:2;21405:3;21401:12;21394:19;;21053:366;;;:::o;21425:::-;21567:3;21588:67;21652:2;21647:3;21588:67;:::i;:::-;21581:74;;21664:93;21753:3;21664:93;:::i;:::-;21782:2;21777:3;21773:12;21766:19;;21425:366;;;:::o;21797:398::-;21956:3;21977:83;22058:1;22053:3;21977:83;:::i;:::-;21970:90;;22069:93;22158:3;22069:93;:::i;:::-;22187:1;22182:3;22178:11;22171:18;;21797:398;;;:::o;22201:366::-;22343:3;22364:67;22428:2;22423:3;22364:67;:::i;:::-;22357:74;;22440:93;22529:3;22440:93;:::i;:::-;22558:2;22553:3;22549:12;22542:19;;22201:366;;;:::o;22573:::-;22715:3;22736:67;22800:2;22795:3;22736:67;:::i;:::-;22729:74;;22812:93;22901:3;22812:93;:::i;:::-;22930:2;22925:3;22921:12;22914:19;;22573:366;;;:::o;22945:118::-;23032:24;23050:5;23032:24;:::i;:::-;23027:3;23020:37;22945:118;;:::o;23069:112::-;23152:22;23168:5;23152:22;:::i;:::-;23147:3;23140:35;23069:112;;:::o;23187:397::-;23327:3;23342:75;23413:3;23404:6;23342:75;:::i;:::-;23442:2;23437:3;23433:12;23426:19;;23455:75;23526:3;23517:6;23455:75;:::i;:::-;23555:2;23550:3;23546:12;23539:19;;23575:3;23568:10;;23187:397;;;;;:::o;23590:701::-;23871:3;23893:95;23984:3;23975:6;23893:95;:::i;:::-;23886:102;;24005:95;24096:3;24087:6;24005:95;:::i;:::-;23998:102;;24117:148;24261:3;24117:148;:::i;:::-;24110:155;;24282:3;24275:10;;23590:701;;;;;:::o;24297:522::-;24510:3;24532:148;24676:3;24532:148;:::i;:::-;24525:155;;24690:75;24761:3;24752:6;24690:75;:::i;:::-;24790:2;24785:3;24781:12;24774:19;;24810:3;24803:10;;24297:522;;;;:::o;24825:379::-;25009:3;25031:147;25174:3;25031:147;:::i;:::-;25024:154;;25195:3;25188:10;;24825:379;;;:::o;25210:222::-;25303:4;25341:2;25330:9;25326:18;25318:26;;25354:71;25422:1;25411:9;25407:17;25398:6;25354:71;:::i;:::-;25210:222;;;;:::o;25438:640::-;25633:4;25671:3;25660:9;25656:19;25648:27;;25685:71;25753:1;25742:9;25738:17;25729:6;25685:71;:::i;:::-;25766:72;25834:2;25823:9;25819:18;25810:6;25766:72;:::i;:::-;25848;25916:2;25905:9;25901:18;25892:6;25848:72;:::i;:::-;25967:9;25961:4;25957:20;25952:2;25941:9;25937:18;25930:48;25995:76;26066:4;26057:6;25995:76;:::i;:::-;25987:84;;25438:640;;;;;;;:::o;26084:210::-;26171:4;26209:2;26198:9;26194:18;26186:26;;26222:65;26284:1;26273:9;26269:17;26260:6;26222:65;:::i;:::-;26084:210;;;;:::o;26300:545::-;26473:4;26511:3;26500:9;26496:19;26488:27;;26525:71;26593:1;26582:9;26578:17;26569:6;26525:71;:::i;:::-;26606:68;26670:2;26659:9;26655:18;26646:6;26606:68;:::i;:::-;26684:72;26752:2;26741:9;26737:18;26728:6;26684:72;:::i;:::-;26766;26834:2;26823:9;26819:18;26810:6;26766:72;:::i;:::-;26300:545;;;;;;;:::o;26851:238::-;26952:4;26990:2;26979:9;26975:18;26967:26;;27003:79;27079:1;27068:9;27064:17;27055:6;27003:79;:::i;:::-;26851:238;;;;:::o;27095:313::-;27208:4;27246:2;27235:9;27231:18;27223:26;;27295:9;27289:4;27285:20;27281:1;27270:9;27266:17;27259:47;27323:78;27396:4;27387:6;27323:78;:::i;:::-;27315:86;;27095:313;;;;:::o;27414:419::-;27580:4;27618:2;27607:9;27603:18;27595:26;;27667:9;27661:4;27657:20;27653:1;27642:9;27638:17;27631:47;27695:131;27821:4;27695:131;:::i;:::-;27687:139;;27414:419;;;:::o;27839:::-;28005:4;28043:2;28032:9;28028:18;28020:26;;28092:9;28086:4;28082:20;28078:1;28067:9;28063:17;28056:47;28120:131;28246:4;28120:131;:::i;:::-;28112:139;;27839:419;;;:::o;28264:::-;28430:4;28468:2;28457:9;28453:18;28445:26;;28517:9;28511:4;28507:20;28503:1;28492:9;28488:17;28481:47;28545:131;28671:4;28545:131;:::i;:::-;28537:139;;28264:419;;;:::o;28689:::-;28855:4;28893:2;28882:9;28878:18;28870:26;;28942:9;28936:4;28932:20;28928:1;28917:9;28913:17;28906:47;28970:131;29096:4;28970:131;:::i;:::-;28962:139;;28689:419;;;:::o;29114:::-;29280:4;29318:2;29307:9;29303:18;29295:26;;29367:9;29361:4;29357:20;29353:1;29342:9;29338:17;29331:47;29395:131;29521:4;29395:131;:::i;:::-;29387:139;;29114:419;;;:::o;29539:::-;29705:4;29743:2;29732:9;29728:18;29720:26;;29792:9;29786:4;29782:20;29778:1;29767:9;29763:17;29756:47;29820:131;29946:4;29820:131;:::i;:::-;29812:139;;29539:419;;;:::o;29964:::-;30130:4;30168:2;30157:9;30153:18;30145:26;;30217:9;30211:4;30207:20;30203:1;30192:9;30188:17;30181:47;30245:131;30371:4;30245:131;:::i;:::-;30237:139;;29964:419;;;:::o;30389:::-;30555:4;30593:2;30582:9;30578:18;30570:26;;30642:9;30636:4;30632:20;30628:1;30617:9;30613:17;30606:47;30670:131;30796:4;30670:131;:::i;:::-;30662:139;;30389:419;;;:::o;30814:::-;30980:4;31018:2;31007:9;31003:18;30995:26;;31067:9;31061:4;31057:20;31053:1;31042:9;31038:17;31031:47;31095:131;31221:4;31095:131;:::i;:::-;31087:139;;30814:419;;;:::o;31239:::-;31405:4;31443:2;31432:9;31428:18;31420:26;;31492:9;31486:4;31482:20;31478:1;31467:9;31463:17;31456:47;31520:131;31646:4;31520:131;:::i;:::-;31512:139;;31239:419;;;:::o;31664:::-;31830:4;31868:2;31857:9;31853:18;31845:26;;31917:9;31911:4;31907:20;31903:1;31892:9;31888:17;31881:47;31945:131;32071:4;31945:131;:::i;:::-;31937:139;;31664:419;;;:::o;32089:::-;32255:4;32293:2;32282:9;32278:18;32270:26;;32342:9;32336:4;32332:20;32328:1;32317:9;32313:17;32306:47;32370:131;32496:4;32370:131;:::i;:::-;32362:139;;32089:419;;;:::o;32514:::-;32680:4;32718:2;32707:9;32703:18;32695:26;;32767:9;32761:4;32757:20;32753:1;32742:9;32738:17;32731:47;32795:131;32921:4;32795:131;:::i;:::-;32787:139;;32514:419;;;:::o;32939:::-;33105:4;33143:2;33132:9;33128:18;33120:26;;33192:9;33186:4;33182:20;33178:1;33167:9;33163:17;33156:47;33220:131;33346:4;33220:131;:::i;:::-;33212:139;;32939:419;;;:::o;33364:::-;33530:4;33568:2;33557:9;33553:18;33545:26;;33617:9;33611:4;33607:20;33603:1;33592:9;33588:17;33581:47;33645:131;33771:4;33645:131;:::i;:::-;33637:139;;33364:419;;;:::o;33789:::-;33955:4;33993:2;33982:9;33978:18;33970:26;;34042:9;34036:4;34032:20;34028:1;34017:9;34013:17;34006:47;34070:131;34196:4;34070:131;:::i;:::-;34062:139;;33789:419;;;:::o;34214:::-;34380:4;34418:2;34407:9;34403:18;34395:26;;34467:9;34461:4;34457:20;34453:1;34442:9;34438:17;34431:47;34495:131;34621:4;34495:131;:::i;:::-;34487:139;;34214:419;;;:::o;34639:::-;34805:4;34843:2;34832:9;34828:18;34820:26;;34892:9;34886:4;34882:20;34878:1;34867:9;34863:17;34856:47;34920:131;35046:4;34920:131;:::i;:::-;34912:139;;34639:419;;;:::o;35064:::-;35230:4;35268:2;35257:9;35253:18;35245:26;;35317:9;35311:4;35307:20;35303:1;35292:9;35288:17;35281:47;35345:131;35471:4;35345:131;:::i;:::-;35337:139;;35064:419;;;:::o;35489:::-;35655:4;35693:2;35682:9;35678:18;35670:26;;35742:9;35736:4;35732:20;35728:1;35717:9;35713:17;35706:47;35770:131;35896:4;35770:131;:::i;:::-;35762:139;;35489:419;;;:::o;35914:::-;36080:4;36118:2;36107:9;36103:18;36095:26;;36167:9;36161:4;36157:20;36153:1;36142:9;36138:17;36131:47;36195:131;36321:4;36195:131;:::i;:::-;36187:139;;35914:419;;;:::o;36339:::-;36505:4;36543:2;36532:9;36528:18;36520:26;;36592:9;36586:4;36582:20;36578:1;36567:9;36563:17;36556:47;36620:131;36746:4;36620:131;:::i;:::-;36612:139;;36339:419;;;:::o;36764:::-;36930:4;36968:2;36957:9;36953:18;36945:26;;37017:9;37011:4;37007:20;37003:1;36992:9;36988:17;36981:47;37045:131;37171:4;37045:131;:::i;:::-;37037:139;;36764:419;;;:::o;37189:::-;37355:4;37393:2;37382:9;37378:18;37370:26;;37442:9;37436:4;37432:20;37428:1;37417:9;37413:17;37406:47;37470:131;37596:4;37470:131;:::i;:::-;37462:139;;37189:419;;;:::o;37614:::-;37780:4;37818:2;37807:9;37803:18;37795:26;;37867:9;37861:4;37857:20;37853:1;37842:9;37838:17;37831:47;37895:131;38021:4;37895:131;:::i;:::-;37887:139;;37614:419;;;:::o;38039:::-;38205:4;38243:2;38232:9;38228:18;38220:26;;38292:9;38286:4;38282:20;38278:1;38267:9;38263:17;38256:47;38320:131;38446:4;38320:131;:::i;:::-;38312:139;;38039:419;;;:::o;38464:::-;38630:4;38668:2;38657:9;38653:18;38645:26;;38717:9;38711:4;38707:20;38703:1;38692:9;38688:17;38681:47;38745:131;38871:4;38745:131;:::i;:::-;38737:139;;38464:419;;;:::o;38889:::-;39055:4;39093:2;39082:9;39078:18;39070:26;;39142:9;39136:4;39132:20;39128:1;39117:9;39113:17;39106:47;39170:131;39296:4;39170:131;:::i;:::-;39162:139;;38889:419;;;:::o;39314:::-;39480:4;39518:2;39507:9;39503:18;39495:26;;39567:9;39561:4;39557:20;39553:1;39542:9;39538:17;39531:47;39595:131;39721:4;39595:131;:::i;:::-;39587:139;;39314:419;;;:::o;39739:222::-;39832:4;39870:2;39859:9;39855:18;39847:26;;39883:71;39951:1;39940:9;39936:17;39927:6;39883:71;:::i;:::-;39739:222;;;;:::o;39967:129::-;40001:6;40028:20;;:::i;:::-;40018:30;;40057:33;40085:4;40077:6;40057:33;:::i;:::-;39967:129;;;:::o;40102:75::-;40135:6;40168:2;40162:9;40152:19;;40102:75;:::o;40183:307::-;40244:4;40334:18;40326:6;40323:30;40320:56;;;40356:18;;:::i;:::-;40320:56;40394:29;40416:6;40394:29;:::i;:::-;40386:37;;40478:4;40472;40468:15;40460:23;;40183:307;;;:::o;40496:308::-;40558:4;40648:18;40640:6;40637:30;40634:56;;;40670:18;;:::i;:::-;40634:56;40708:29;40730:6;40708:29;:::i;:::-;40700:37;;40792:4;40786;40782:15;40774:23;;40496:308;;;:::o;40810:98::-;40861:6;40895:5;40889:12;40879:22;;40810:98;;;:::o;40914:99::-;40966:6;41000:5;40994:12;40984:22;;40914:99;;;:::o;41019:168::-;41102:11;41136:6;41131:3;41124:19;41176:4;41171:3;41167:14;41152:29;;41019:168;;;;:::o;41193:147::-;41294:11;41331:3;41316:18;;41193:147;;;;:::o;41346:169::-;41430:11;41464:6;41459:3;41452:19;41504:4;41499:3;41495:14;41480:29;;41346:169;;;;:::o;41521:148::-;41623:11;41660:3;41645:18;;41521:148;;;;:::o;41675:305::-;41715:3;41734:20;41752:1;41734:20;:::i;:::-;41729:25;;41768:20;41786:1;41768:20;:::i;:::-;41763:25;;41922:1;41854:66;41850:74;41847:1;41844:81;41841:107;;;41928:18;;:::i;:::-;41841:107;41972:1;41969;41965:9;41958:16;;41675:305;;;;:::o;41986:185::-;42026:1;42043:20;42061:1;42043:20;:::i;:::-;42038:25;;42077:20;42095:1;42077:20;:::i;:::-;42072:25;;42116:1;42106:35;;42121:18;;:::i;:::-;42106:35;42163:1;42160;42156:9;42151:14;;41986:185;;;;:::o;42177:348::-;42217:7;42240:20;42258:1;42240:20;:::i;:::-;42235:25;;42274:20;42292:1;42274:20;:::i;:::-;42269:25;;42462:1;42394:66;42390:74;42387:1;42384:81;42379:1;42372:9;42365:17;42361:105;42358:131;;;42469:18;;:::i;:::-;42358:131;42517:1;42514;42510:9;42499:20;;42177:348;;;;:::o;42531:191::-;42571:4;42591:20;42609:1;42591:20;:::i;:::-;42586:25;;42625:20;42643:1;42625:20;:::i;:::-;42620:25;;42664:1;42661;42658:8;42655:34;;;42669:18;;:::i;:::-;42655:34;42714:1;42711;42707:9;42699:17;;42531:191;;;;:::o;42728:96::-;42765:7;42794:24;42812:5;42794:24;:::i;:::-;42783:35;;42728:96;;;:::o;42830:90::-;42864:7;42907:5;42900:13;42893:21;42882:32;;42830:90;;;:::o;42926:77::-;42963:7;42992:5;42981:16;;42926:77;;;:::o;43009:149::-;43045:7;43085:66;43078:5;43074:78;43063:89;;43009:149;;;:::o;43164:131::-;43211:7;43240:5;43229:16;;43246:43;43283:5;43246:43;:::i;:::-;43164:131;;;:::o;43301:126::-;43338:7;43378:42;43371:5;43367:54;43356:65;;43301:126;;;:::o;43433:77::-;43470:7;43499:5;43488:16;;43433:77;;;:::o;43516:86::-;43551:7;43591:4;43584:5;43580:16;43569:27;;43516:86;;;:::o;43608:131::-;43666:9;43699:34;43727:5;43699:34;:::i;:::-;43686:47;;43608:131;;;:::o;43745:154::-;43829:6;43824:3;43819;43806:30;43891:1;43882:6;43877:3;43873:16;43866:27;43745:154;;;:::o;43905:307::-;43973:1;43983:113;43997:6;43994:1;43991:13;43983:113;;;44082:1;44077:3;44073:11;44067:18;44063:1;44058:3;44054:11;44047:39;44019:2;44016:1;44012:10;44007:15;;43983:113;;;44114:6;44111:1;44108:13;44105:101;;;44194:1;44185:6;44180:3;44176:16;44169:27;44105:101;43954:258;43905:307;;;:::o;44218:320::-;44262:6;44299:1;44293:4;44289:12;44279:22;;44346:1;44340:4;44336:12;44367:18;44357:81;;44423:4;44415:6;44411:17;44401:27;;44357:81;44485:2;44477:6;44474:14;44454:18;44451:38;44448:84;;;44504:18;;:::i;:::-;44448:84;44269:269;44218:320;;;:::o;44544:281::-;44627:27;44649:4;44627:27;:::i;:::-;44619:6;44615:40;44757:6;44745:10;44742:22;44721:18;44709:10;44706:34;44703:62;44700:88;;;44768:18;;:::i;:::-;44700:88;44808:10;44804:2;44797:22;44587:238;44544:281;;:::o;44831:233::-;44870:3;44893:24;44911:5;44893:24;:::i;:::-;44884:33;;44939:66;44932:5;44929:77;44926:103;;;45009:18;;:::i;:::-;44926:103;45056:1;45049:5;45045:13;45038:20;;44831:233;;;:::o;45070:100::-;45109:7;45138:26;45158:5;45138:26;:::i;:::-;45127:37;;45070:100;;;:::o;45176:79::-;45215:7;45244:5;45233:16;;45176:79;;;:::o;45261:94::-;45300:7;45329:20;45343:5;45329:20;:::i;:::-;45318:31;;45261:94;;;:::o;45361:176::-;45393:1;45410:20;45428:1;45410:20;:::i;:::-;45405:25;;45444:20;45462:1;45444:20;:::i;:::-;45439:25;;45483:1;45473:35;;45488:18;;:::i;:::-;45473:35;45529:1;45526;45522:9;45517:14;;45361:176;;;;:::o;45543:180::-;45591:77;45588:1;45581:88;45688:4;45685:1;45678:15;45712:4;45709:1;45702:15;45729:180;45777:77;45774:1;45767:88;45874:4;45871:1;45864:15;45898:4;45895:1;45888:15;45915:180;45963:77;45960:1;45953:88;46060:4;46057:1;46050:15;46084:4;46081:1;46074:15;46101:180;46149:77;46146:1;46139:88;46246:4;46243:1;46236:15;46270:4;46267:1;46260:15;46287:180;46335:77;46332:1;46325:88;46432:4;46429:1;46422:15;46456:4;46453:1;46446:15;46473:180;46521:77;46518:1;46511:88;46618:4;46615:1;46608:15;46642:4;46639:1;46632:15;46659:117;46768:1;46765;46758:12;46782:117;46891:1;46888;46881:12;46905:117;47014:1;47011;47004:12;47028:117;47137:1;47134;47127:12;47151:102;47192:6;47243:2;47239:7;47234:2;47227:5;47223:14;47219:28;47209:38;;47151:102;;;:::o;47259:94::-;47292:8;47340:5;47336:2;47332:14;47311:35;;47259:94;;;:::o;47359:171::-;47499:23;47495:1;47487:6;47483:14;47476:47;47359:171;:::o;47536:239::-;47676:34;47672:1;47664:6;47660:14;47653:58;47745:22;47740:2;47732:6;47728:15;47721:47;47536:239;:::o;47781:214::-;47921:66;47917:1;47909:6;47905:14;47898:90;47781:214;:::o;48001:228::-;48141:34;48137:1;48129:6;48125:14;48118:58;48210:11;48205:2;48197:6;48193:15;48186:36;48001:228;:::o;48235:178::-;48375:30;48371:1;48363:6;48359:14;48352:54;48235:178;:::o;48419:237::-;48559:34;48555:1;48547:6;48543:14;48536:58;48628:20;48623:2;48615:6;48611:15;48604:45;48419:237;:::o;48662:225::-;48802:34;48798:1;48790:6;48786:14;48779:58;48871:8;48866:2;48858:6;48854:15;48847:33;48662:225;:::o;48893:178::-;49033:30;49029:1;49021:6;49017:14;49010:54;48893:178;:::o;49077:238::-;49217:34;49213:1;49205:6;49201:14;49194:58;49286:21;49281:2;49273:6;49269:15;49262:46;49077:238;:::o;49321:170::-;49461:22;49457:1;49449:6;49445:14;49438:46;49321:170;:::o;49497:223::-;49637:34;49633:1;49625:6;49621:14;49614:58;49706:6;49701:2;49693:6;49689:15;49682:31;49497:223;:::o;49726:175::-;49866:27;49862:1;49854:6;49850:14;49843:51;49726:175;:::o;49907:180::-;50047:32;50043:1;50035:6;50031:14;50024:56;49907:180;:::o;50093:231::-;50233:34;50229:1;50221:6;50217:14;50210:58;50302:14;50297:2;50289:6;50285:15;50278:39;50093:231;:::o;50330:243::-;50470:34;50466:1;50458:6;50454:14;50447:58;50539:26;50534:2;50526:6;50522:15;50515:51;50330:243;:::o;50579:229::-;50719:34;50715:1;50707:6;50703:14;50696:58;50788:12;50783:2;50775:6;50771:15;50764:37;50579:229;:::o;50814:228::-;50954:34;50950:1;50942:6;50938:14;50931:58;51023:11;51018:2;51010:6;51006:15;50999:36;50814:228;:::o;51048:306::-;51188:34;51184:1;51176:6;51172:14;51165:58;51257:34;51252:2;51244:6;51240:15;51233:59;51326:20;51321:2;51313:6;51309:15;51302:45;51048:306;:::o;51360:182::-;51500:34;51496:1;51488:6;51484:14;51477:58;51360:182;:::o;51548:306::-;51688:34;51684:1;51676:6;51672:14;51665:58;51757:34;51752:2;51744:6;51740:15;51733:59;51826:20;51821:2;51813:6;51809:15;51802:45;51548:306;:::o;51860:231::-;52000:34;51996:1;51988:6;51984:14;51977:58;52069:14;52064:2;52056:6;52052:15;52045:39;51860:231;:::o;52097:155::-;52237:7;52233:1;52225:6;52221:14;52214:31;52097:155;:::o;52258:167::-;52398:19;52394:1;52386:6;52382:14;52375:43;52258:167;:::o;52431:182::-;52571:34;52567:1;52559:6;52555:14;52548:58;52431:182;:::o;52619:228::-;52759:34;52755:1;52747:6;52743:14;52736:58;52828:11;52823:2;52815:6;52811:15;52804:36;52619:228;:::o;52853:234::-;52993:34;52989:1;52981:6;52977:14;52970:58;53062:17;53057:2;53049:6;53045:15;53038:42;52853:234;:::o;53093:248::-;53233:34;53229:1;53221:6;53217:14;53210:58;53302:31;53297:2;53289:6;53285:15;53278:56;53093:248;:::o;53347:220::-;53487:34;53483:1;53475:6;53471:14;53464:58;53556:3;53551:2;53543:6;53539:15;53532:28;53347:220;:::o;53573:177::-;53713:29;53709:1;53701:6;53697:14;53690:53;53573:177;:::o;53756:114::-;;:::o;53876:236::-;54016:34;54012:1;54004:6;54000:14;53993:58;54085:19;54080:2;54072:6;54068:15;54061:44;53876:236;:::o;54118:171::-;54258:23;54254:1;54246:6;54242:14;54235:47;54118:171;:::o;54295:115::-;54378:1;54371:5;54368:12;54358:46;;54384:18;;:::i;:::-;54358:46;54295:115;:::o;54416:122::-;54489:24;54507:5;54489:24;:::i;:::-;54482:5;54479:35;54469:63;;54528:1;54525;54518:12;54469:63;54416:122;:::o;54544:116::-;54614:21;54629:5;54614:21;:::i;:::-;54607:5;54604:32;54594:60;;54650:1;54647;54640:12;54594:60;54544:116;:::o;54666:122::-;54739:24;54757:5;54739:24;:::i;:::-;54732:5;54729:35;54719:63;;54778:1;54775;54768:12;54719:63;54666:122;:::o;54794:120::-;54866:23;54883:5;54866:23;:::i;:::-;54859:5;54856:34;54846:62;;54904:1;54901;54894:12;54846:62;54794:120;:::o;54920:122::-;54993:24;55011:5;54993:24;:::i;:::-;54986:5;54983:35;54973:63;;55032:1;55029;55022:12;54973:63;54920:122;:::o;55048:118::-;55119:22;55135:5;55119:22;:::i;:::-;55112:5;55109:33;55099:61;;55156:1;55153;55146:12;55099:61;55048:118;:::o

Swarm Source

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