ETH Price: $3,346.06 (-2.13%)

Token

The Club of Cool Apes (COCA)
 

Overview

Max Total Supply

953 COCA

Holders

323

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 COCA
0xD9968DfdF930463FFfb8059B917E89220C0e05AE
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
COCA

Compiler Version
v0.8.0+commit.c7dfd78e

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-31
*/

// SPDX-License-Identifier: MIT
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);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IERC20 {
    function transferFrom(address from_, address to_, uint256 amount_) external;
}
// interface IERC721 {
//     function transferFrom(address from_, address to_, uint256 tokenId_) external;
// }
interface IERC1155 {
    function safeTransferFrom(address from_, address to_, uint256 id_, uint256 amount_, bytes calldata data_) external;
    function safeBatchTransferFrom(address from_, address to_, uint256[] calldata ids_, uint256[] calldata amounts_, bytes calldata data_) external;
}

abstract contract ERCWithdrawable {
    /*  All functions in this abstract contract are marked as internal because it should
        generally be paired with ownable.
        Virtual is for overwritability.
    */
    function _withdrawERC20(address contractAddress_, uint256 amount_) internal virtual {
        IERC20(contractAddress_).transferFrom(address(this), msg.sender, amount_);
    }
    function _withdrawERC721(address contractAddress_, uint256 tokenId_) internal virtual {
        IERC721(contractAddress_).transferFrom(address(this), msg.sender, tokenId_);
    }
    function _withdrawERC1155(address contractAddress_, uint256 tokenId_, uint256 amount_) internal virtual {
        IERC1155(contractAddress_).safeTransferFrom(address(this), msg.sender, tokenId_, amount_, "");
    }
    function _withdrawERC1155Batch(address contractAddress_, uint256[] calldata ids_, uint256[] calldata amounts_) internal virtual {
        IERC1155(contractAddress_).safeBatchTransferFrom(address(this), msg.sender, ids_, amounts_, "");
    }
}

// Open0x Ownable
abstract contract Ownable {
    address public owner;
    
    event OwnershipTransferred(address indexed oldOwner_, address indexed newOwner_);

    constructor() { owner = msg.sender; }

    modifier onlyOwner {
        require(owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    function _transferOwnership(address newOwner_) internal virtual {
        address _oldOwner = owner;
        owner = newOwner_;
        emit OwnershipTransferred(_oldOwner, newOwner_);    
    }

    function transferOwnership(address newOwner_) public virtual onlyOwner {
        require(newOwner_ != address(0x0), "Ownable: new owner is the zero address!");
        _transferOwnership(newOwner_);
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0x0));
    }
}

interface iRenderer {
    function tokenURI(uint256 tokenId_) external view returns (string memory);
}

interface iYield {
    function updateReward(address from_, address to_, uint256 tokenId_) external;
}

contract COCA is ERC721, Ownable, ERCWithdrawable {
    // Constructor
    constructor() ERC721("The Club of Cool Apes", "COCA") {}


    // Project Constraints
    uint16 immutable public maxTokens = 3000;
    
    // General NFT Variables
    uint256 public totalSupply;

    string internal baseTokenURI = "ipfs://QmeBMgzfLWM5BY5pPAwYJ5XTSaeSmeQMBQQo2eKHaXurGq/";

    // Interfaces
    iYield public yieldToken;

    // Whitelist Mappings
    mapping(address => uint16) public addressToPublicMinted;

    // Events
    event Mint(address to_, uint256 tokenId_);
    event NameChange(uint256 tokenId_, string name_);
    event BioChange(uint256 tokenId_, string bio_);

    // Contract Governance
    function withdrawEther() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance); }
    

    function publicMint(uint16 amount) external payable onlySender publicSale {
        require(amount <= 3, "Max 3 mints per transaction");
        require(addressToPublicMinted[msg.sender] < 12, "Max 12 mints per account!");
        require(maxTokens > totalSupply, "No more remaining tokens!");

        uint priceRemaining = msg.value; 
        for (uint16 i = 0; i < amount; i++) {
            uint currentPrice = getPrice(__getTokenId());
            require(priceRemaining >= currentPrice, "Invalid value sent!");
            _mint(msg.sender, __getTokenId());
            emit Mint(msg.sender, __getTokenId());
            addressToPublicMinted[msg.sender]++;
            totalSupply++;
            priceRemaining -= currentPrice;
        }
    }

    // ERCWithdrawable
    function withdrawERC20(address contractAddress_, uint256 amount_) external onlyOwner {
        _withdrawERC20(contractAddress_, amount_);
    }
    function withdrawERC721(address contractAddress_, uint256 tokenId_) external onlyOwner {
        _withdrawERC721(contractAddress_, tokenId_);
    }


    // Public Sale
    bool public publicSaleEnabled;
    uint256 public publicSaleTime;
    function setPublicSale(bool bool_) external onlyOwner {
        publicSaleEnabled = bool_; }
    modifier publicSale {
        require(publicSaleEnabled, "Public Sale is not open yet!"); _; }
    function publicSaleIsEnabled() public view returns (bool) {
        return (publicSaleEnabled); }

    // Modifiers
    modifier onlySender {
        require(msg.sender == tx.origin, "No smart contracts!"); _; }

    // Contract Administration
    function setYieldToken(address address_) external onlyOwner {
        yieldToken = iYield(address_); }
    function setBaseTokenURI(string memory uri_) external onlyOwner {
        baseTokenURI = uri_; }
    
    // Mint functions
    function __getTokenId() internal view returns (uint256) {
        return totalSupply + 1;
    }

    function getPrice(uint256 tokenId) internal pure returns (uint256) {
        if (tokenId <= 500) {
            return 0;
        }
        
        return 0.027 ether;
    }

    // Transfer Hooks 
    function transferFrom(address from_, address to_, uint256 tokenId_) public override {
        if ( yieldToken != iYield(address(0x0)) ) {
            yieldToken.updateReward(from_, to_, tokenId_);
        }
        ERC721.transferFrom(from_, to_, tokenId_);
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes memory data_) public override {
        if ( yieldToken != iYield(address(0x0)) ) {
            yieldToken.updateReward(from_, to_, tokenId_);
        }
        ERC721.safeTransferFrom(from_, to_, tokenId_, data_);
    }

    // View Function for Tokens
    function tokenURI(uint256 tokenId_) public view override returns (string memory) {
        require(_exists(tokenId_), "Token doesn't exist!");
        return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId_), ".json"));
    }
}

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":false,"internalType":"uint256","name":"tokenId_","type":"uint256"},{"indexed":false,"internalType":"string","name":"bio_","type":"string"}],"name":"BioChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to_","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId_","type":"uint256"},{"indexed":false,"internalType":"string","name":"name_","type":"string"}],"name":"NameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner_","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner_","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToPublicMinted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"setYieldToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldToken","outputs":[{"internalType":"contract iYield","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a0604052610bb861ffff1660809061ffff1660f01b81525060405180606001604052806036815260200162003ff66036913960089080519060200190620000499291906200013f565b503480156200005757600080fd5b506040518060400160405280601581526020017f54686520436c7562206f6620436f6f6c204170657300000000000000000000008152506040518060400160405280600481526020017f434f4341000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000dc9291906200013f565b508060019080519060200190620000f59291906200013f565b50505033600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000254565b8280546200014d90620001ef565b90600052602060002090601f016020900481019282620001715760008555620001bd565b82601f106200018c57805160ff1916838001178555620001bd565b82800160010185558215620001bd579182015b82811115620001bc5782518255916020019190600101906200019f565b5b509050620001cc9190620001d0565b5090565b5b80821115620001eb576000816000905550600101620001d1565b5090565b600060028204905060018216806200020857607f821691505b602082108114156200021f576200021e62000225565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160f01c613d7c6200027a6000396000818161132c015261172a0152613d7c6000f3fe6080604052600436106101cd5760003560e01c80637362377b116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610662578063f2fde38b1461069f578063f3e414f8146106c8578063f607cc4c146106f1576101cd565b8063b88d4fde14610594578063c7bf90bf146105bd578063c87b56dd146105fa578063e831574214610637576101cd565b806395d89b41116100d157806395d89b41146104ec578063a1db978214610517578063a22cb46514610540578063a59af6f614610569576101cd565b80637362377b1461047f57806376d5de85146104965780638da5cb5b146104c1576101cd565b806323ffce851161016f5780635aca1bb61161013e5780635aca1bb6146103c55780636352211e146103ee57806370a082311461042b578063715018a614610468576101cd565b806323ffce851461031f5780632ab91bba1461034857806330176e131461037357806342842e0e1461039c576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a05780632344be0a146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612b31565b61070d565b6040516102069190613575565b60405180910390f35b34801561021b57600080fd5b506102246107ef565b60405161023191906135ab565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612bed565b610881565b60405161026e91906134ae565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612acc565b610906565b005b3480156102ac57600080fd5b506102b5610a1e565b6040516102c29190613888565b60405180910390f35b3480156102d757600080fd5b506102e0610a24565b6040516102ed9190613888565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906129c6565b610a2a565b005b34801561032b57600080fd5b5061034660048036038101906103419190612961565b610b22565b005b34801561035457600080fd5b5061035d610bf6565b60405161036a9190613575565b60405180910390f35b34801561037f57600080fd5b5061039a60048036038101906103959190612b83565b610c09565b005b3480156103a857600080fd5b506103c360048036038101906103be91906129c6565b610cb3565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190612b08565b610cd3565b005b3480156103fa57600080fd5b5061041560048036038101906104109190612bed565b610d80565b60405161042291906134ae565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612961565b610dbd565b60405161045f9190613888565b60405180910390f35b34801561047457600080fd5b5061047d610e75565b005b34801561048b57600080fd5b50610494610f11565b005b3480156104a257600080fd5b506104ab610fea565b6040516104b89190613590565b60405180910390f35b3480156104cd57600080fd5b506104d6611010565b6040516104e391906134ae565b60405180910390f35b3480156104f857600080fd5b50610501611036565b60405161050e91906135ab565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190612acc565b6110c8565b005b34801561054c57600080fd5b5061056760048036038101906105629190612a90565b611166565b005b34801561057557600080fd5b5061057e61117c565b60405161058b9190613575565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190612a15565b611193565b005b3480156105c957600080fd5b506105e460048036038101906105df9190612961565b61128d565b6040516105f1919061386d565b60405180910390f35b34801561060657600080fd5b50610621600480360381019061061c9190612bed565b6112ae565b60405161062e91906135ab565b60405180910390f35b34801561064357600080fd5b5061064c61132a565b604051610659919061386d565b60405180910390f35b34801561066e57600080fd5b506106896004803603810190610684919061298a565b61134e565b6040516106969190613575565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c19190612961565b6113e2565b005b3480156106d457600080fd5b506106ef60048036038101906106ea9190612acc565b6114ee565b005b61070b60048036038101906107069190612bc4565b61158c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107d857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e857506107e782611904565b5b9050919050565b6060600080546107fe90613b2f565b80601f016020809104026020016040519081016040528092919081815260200182805461082a90613b2f565b80156108775780601f1061084c57610100808354040283529160200191610877565b820191906000526020600020905b81548152906001019060200180831161085a57829003601f168201915b5050505050905090565b600061088c8261196e565b6108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c2906137ad565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091182610d80565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109799061380d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109a16119da565b73ffffffffffffffffffffffffffffffffffffffff1614806109d057506109cf816109ca6119da565b61134e565b5b610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a069061372d565b60405180910390fd5b610a1983836119e2565b505050565b60075481565b600c5481565b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b1257600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c8e8dfa8484846040518463ffffffff1660e01b8152600401610adf939291906134c9565b600060405180830381600087803b158015610af957600080fd5b505af1158015610b0d573d6000803e3d6000fd5b505050505b610b1d838383611a9b565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba9906137cd565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c90906137cd565b60405180910390fd5b8060089080519060200190610caf929190612770565b5050565b610cce83838360405180602001604052806000815250611193565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a906137cd565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e259061374d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc906137cd565b60405180910390fd5b610f0f6000611afb565b565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f98906137cd565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fe7573d6000803e3d6000fd5b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461104590613b2f565b80601f016020809104026020016040519081016040528092919081815260200182805461107190613b2f565b80156110be5780601f10611093576101008083540402835291602001916110be565b820191906000526020600020905b8154815290600101906020018083116110a157829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906137cd565b60405180910390fd5b6111628282611bc1565b5050565b6111786111716119da565b8383611c34565b5050565b6000600b60009054906101000a900460ff16905090565b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127b57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c8e8dfa8585856040518463ffffffff1660e01b8152600401611248939291906134c9565b600060405180830381600087803b15801561126257600080fd5b505af1158015611276573d6000803e3d6000fd5b505050505b61128784848484611da1565b50505050565b600a6020528060005260406000206000915054906101000a900461ffff1681565b60606112b98261196e565b6112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef9061366d565b60405180910390fd5b600861130383611e03565b60405160200161131492919061347f565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611469906137cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d9906135ed565b60405180910390fd5b6114eb81611afb565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461157e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611575906137cd565b60405180910390fd5b6115888282611fb0565b5050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f19061376d565b60405180910390fd5b600b60009054906101000a900460ff16611649576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116409061364d565b60405180910390fd5b60038161ffff161115611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061384d565b60405180910390fd5b600c600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff1610611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c9061360d565b60405180910390fd5b6007547f000000000000000000000000000000000000000000000000000000000000000061ffff161161178d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611784906136ed565b60405180910390fd5b600034905060005b8261ffff168161ffff1610156118ff5760006117b76117b2612023565b612039565b9050808310156117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f39061370d565b60405180910390fd5b61180d33611808612023565b61205d565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688533611837612023565b60405161184592919061354c565b60405180910390a1600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900461ffff16809291906118aa90613b61565b91906101000a81548161ffff021916908361ffff16021790555050600760008154809291906118d890613b8c565b919050555080836118e99190613a13565b92505080806118f790613b61565b915050611795565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a5583610d80565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611aac611aa66119da565b8261222b565b611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae29061382d565b60405180910390fd5b611af6838383612309565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611bfe939291906134c9565b600060405180830381600087803b158015611c1857600080fd5b505af1158015611c2c573d6000803e3d6000fd5b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a906136ad565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d949190613575565b60405180910390a3505050565b611db2611dac6119da565b8361222b565b611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de89061382d565b60405180910390fd5b611dfd84848484612565565b50505050565b60606000821415611e4b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fab565b600082905060005b60008214611e7d578080611e6690613b8c565b915050600a82611e7691906139e2565b9150611e53565b60008167ffffffffffffffff811115611ebf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ef15781602001600182028036833780820191505090505b5090505b60008514611fa457600182611f0a9190613a13565b9150600a85611f199190613bd5565b6030611f25919061398c565b60f81b818381518110611f61577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f9d91906139e2565b9450611ef5565b8093505050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611fed939291906134c9565b600060405180830381600087803b15801561200757600080fd5b505af115801561201b573d6000803e3d6000fd5b505050505050565b60006001600754612034919061398c565b905090565b60006101f4821161204d5760009050612058565b665fec5b60ef800090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c49061378d565b60405180910390fd5b6120d68161196e565b15612116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210d9061362d565b60405180910390fd5b612122600083836125c1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612172919061398c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006122368261196e565b612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c906136cd565b60405180910390fd5b600061228083610d80565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122ef57508373ffffffffffffffffffffffffffffffffffffffff166122d784610881565b73ffffffffffffffffffffffffffffffffffffffff16145b8061230057506122ff818561134e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661232982610d80565b73ffffffffffffffffffffffffffffffffffffffff161461237f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612376906137ed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e69061368d565b60405180910390fd5b6123fa8383836125c1565b6124056000826119e2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124559190613a13565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ac919061398c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612570848484612309565b61257c848484846125c6565b6125bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b2906135cd565b60405180910390fd5b50505050565b505050565b60006125e78473ffffffffffffffffffffffffffffffffffffffff1661275d565b15612750578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126106119da565b8786866040518563ffffffff1660e01b81526004016126329493929190613500565b602060405180830381600087803b15801561264c57600080fd5b505af192505050801561267d57506040513d601f19601f8201168201806040525081019061267a9190612b5a565b60015b612700573d80600081146126ad576040519150601f19603f3d011682016040523d82523d6000602084013e6126b2565b606091505b506000815114156126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef906135cd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612755565b600190505b949350505050565b600080823b905060008111915050919050565b82805461277c90613b2f565b90600052602060002090601f01602090048101928261279e57600085556127e5565b82601f106127b757805160ff19168380011785556127e5565b828001600101855582156127e5579182015b828111156127e45782518255916020019190600101906127c9565b5b5090506127f291906127f6565b5090565b5b8082111561280f5760008160009055506001016127f7565b5090565b6000612826612821846138d4565b6138a3565b90508281526020810184848401111561283e57600080fd5b612849848285613aed565b509392505050565b600061286461285f84613904565b6138a3565b90508281526020810184848401111561287c57600080fd5b612887848285613aed565b509392505050565b60008135905061289e81613cd3565b92915050565b6000813590506128b381613cea565b92915050565b6000813590506128c881613d01565b92915050565b6000815190506128dd81613d01565b92915050565b600082601f8301126128f457600080fd5b8135612904848260208601612813565b91505092915050565b600082601f83011261291e57600080fd5b813561292e848260208601612851565b91505092915050565b60008135905061294681613d18565b92915050565b60008135905061295b81613d2f565b92915050565b60006020828403121561297357600080fd5b60006129818482850161288f565b91505092915050565b6000806040838503121561299d57600080fd5b60006129ab8582860161288f565b92505060206129bc8582860161288f565b9150509250929050565b6000806000606084860312156129db57600080fd5b60006129e98682870161288f565b93505060206129fa8682870161288f565b9250506040612a0b8682870161294c565b9150509250925092565b60008060008060808587031215612a2b57600080fd5b6000612a398782880161288f565b9450506020612a4a8782880161288f565b9350506040612a5b8782880161294c565b925050606085013567ffffffffffffffff811115612a7857600080fd5b612a84878288016128e3565b91505092959194509250565b60008060408385031215612aa357600080fd5b6000612ab18582860161288f565b9250506020612ac2858286016128a4565b9150509250929050565b60008060408385031215612adf57600080fd5b6000612aed8582860161288f565b9250506020612afe8582860161294c565b9150509250929050565b600060208284031215612b1a57600080fd5b6000612b28848285016128a4565b91505092915050565b600060208284031215612b4357600080fd5b6000612b51848285016128b9565b91505092915050565b600060208284031215612b6c57600080fd5b6000612b7a848285016128ce565b91505092915050565b600060208284031215612b9557600080fd5b600082013567ffffffffffffffff811115612baf57600080fd5b612bbb8482850161290d565b91505092915050565b600060208284031215612bd657600080fd5b6000612be484828501612937565b91505092915050565b600060208284031215612bff57600080fd5b6000612c0d8482850161294c565b91505092915050565b612c1f81613a47565b82525050565b612c2e81613a59565b82525050565b6000612c3f82613949565b612c49818561395f565b9350612c59818560208601613afc565b612c6281613cc2565b840191505092915050565b612c7681613ac9565b82525050565b6000612c8782613954565b612c918185613970565b9350612ca1818560208601613afc565b612caa81613cc2565b840191505092915050565b6000612cc082613954565b612cca8185613981565b9350612cda818560208601613afc565b80840191505092915050565b60008154612cf381613b2f565b612cfd8186613981565b94506001821660008114612d185760018114612d2957612d5c565b60ff19831686528186019350612d5c565b612d3285613934565b60005b83811015612d5457815481890152600182019150602081019050612d35565b838801955050505b50505092915050565b6000612d72603283613970565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612dd8602783613970565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737321000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e3e601983613970565b91507f4d6178203132206d696e747320706572206163636f756e7421000000000000006000830152602082019050919050565b6000612e7e601c83613970565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612ebe601c83613970565b91507f5075626c69632053616c65206973206e6f74206f70656e2079657421000000006000830152602082019050919050565b6000612efe601483613970565b91507f546f6b656e20646f65736e2774206578697374210000000000000000000000006000830152602082019050919050565b6000612f3e602483613970565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fa4601983613970565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612fe4602c83613970565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061304a601983613970565b91507f4e6f206d6f72652072656d61696e696e6720746f6b656e7321000000000000006000830152602082019050919050565b600061308a601383613970565b91507f496e76616c69642076616c75652073656e7421000000000000000000000000006000830152602082019050919050565b60006130ca603883613970565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613130602a83613970565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613196601383613970565b91507f4e6f20736d61727420636f6e74726163747321000000000000000000000000006000830152602082019050919050565b60006131d6602083613970565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613216602c83613970565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061327c600583613981565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006132bc602083613970565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006132fc602983613970565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613362602183613970565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133c8603183613970565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061342e601b83613970565b91507f4d61782033206d696e747320706572207472616e73616374696f6e00000000006000830152602082019050919050565b61346a81613a91565b82525050565b61347981613abf565b82525050565b600061348b8285612ce6565b91506134978284612cb5565b91506134a28261326f565b91508190509392505050565b60006020820190506134c36000830184612c16565b92915050565b60006060820190506134de6000830186612c16565b6134eb6020830185612c16565b6134f86040830184613470565b949350505050565b60006080820190506135156000830187612c16565b6135226020830186612c16565b61352f6040830185613470565b81810360608301526135418184612c34565b905095945050505050565b60006040820190506135616000830185612c16565b61356e6020830184613470565b9392505050565b600060208201905061358a6000830184612c25565b92915050565b60006020820190506135a56000830184612c6d565b92915050565b600060208201905081810360008301526135c58184612c7c565b905092915050565b600060208201905081810360008301526135e681612d65565b9050919050565b6000602082019050818103600083015261360681612dcb565b9050919050565b6000602082019050818103600083015261362681612e31565b9050919050565b6000602082019050818103600083015261364681612e71565b9050919050565b6000602082019050818103600083015261366681612eb1565b9050919050565b6000602082019050818103600083015261368681612ef1565b9050919050565b600060208201905081810360008301526136a681612f31565b9050919050565b600060208201905081810360008301526136c681612f97565b9050919050565b600060208201905081810360008301526136e681612fd7565b9050919050565b600060208201905081810360008301526137068161303d565b9050919050565b600060208201905081810360008301526137268161307d565b9050919050565b60006020820190508181036000830152613746816130bd565b9050919050565b6000602082019050818103600083015261376681613123565b9050919050565b6000602082019050818103600083015261378681613189565b9050919050565b600060208201905081810360008301526137a6816131c9565b9050919050565b600060208201905081810360008301526137c681613209565b9050919050565b600060208201905081810360008301526137e6816132af565b9050919050565b60006020820190508181036000830152613806816132ef565b9050919050565b6000602082019050818103600083015261382681613355565b9050919050565b60006020820190508181036000830152613846816133bb565b9050919050565b6000602082019050818103600083015261386681613421565b9050919050565b60006020820190506138826000830184613461565b92915050565b600060208201905061389d6000830184613470565b92915050565b6000604051905081810181811067ffffffffffffffff821117156138ca576138c9613c93565b5b8060405250919050565b600067ffffffffffffffff8211156138ef576138ee613c93565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561391f5761391e613c93565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061399782613abf565b91506139a283613abf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139d7576139d6613c06565b5b828201905092915050565b60006139ed82613abf565b91506139f883613abf565b925082613a0857613a07613c35565b5b828204905092915050565b6000613a1e82613abf565b9150613a2983613abf565b925082821015613a3c57613a3b613c06565b5b828203905092915050565b6000613a5282613a9f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613ad482613adb565b9050919050565b6000613ae682613a9f565b9050919050565b82818337600083830152505050565b60005b83811015613b1a578082015181840152602081019050613aff565b83811115613b29576000848401525b50505050565b60006002820490506001821680613b4757607f821691505b60208210811415613b5b57613b5a613c64565b5b50919050565b6000613b6c82613a91565b915061ffff821415613b8157613b80613c06565b5b600182019050919050565b6000613b9782613abf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bca57613bc9613c06565b5b600182019050919050565b6000613be082613abf565b9150613beb83613abf565b925082613bfb57613bfa613c35565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613cdc81613a47565b8114613ce757600080fd5b50565b613cf381613a59565b8114613cfe57600080fd5b50565b613d0a81613a65565b8114613d1557600080fd5b50565b613d2181613a91565b8114613d2c57600080fd5b50565b613d3881613abf565b8114613d4357600080fd5b5056fea26469706673582212202a0b554e6030c058a96420d91c8cfbe2f18e40f6a93a0488fd20d94f1750718d64736f6c63430008000033697066733a2f2f516d65424d677a664c574d3542593570504177594a355854536165536d65514d4251516f32654b486158757247712f

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80637362377b116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610662578063f2fde38b1461069f578063f3e414f8146106c8578063f607cc4c146106f1576101cd565b8063b88d4fde14610594578063c7bf90bf146105bd578063c87b56dd146105fa578063e831574214610637576101cd565b806395d89b41116100d157806395d89b41146104ec578063a1db978214610517578063a22cb46514610540578063a59af6f614610569576101cd565b80637362377b1461047f57806376d5de85146104965780638da5cb5b146104c1576101cd565b806323ffce851161016f5780635aca1bb61161013e5780635aca1bb6146103c55780636352211e146103ee57806370a082311461042b578063715018a614610468576101cd565b806323ffce851461031f5780632ab91bba1461034857806330176e131461037357806342842e0e1461039c576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a05780632344be0a146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612b31565b61070d565b6040516102069190613575565b60405180910390f35b34801561021b57600080fd5b506102246107ef565b60405161023191906135ab565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612bed565b610881565b60405161026e91906134ae565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612acc565b610906565b005b3480156102ac57600080fd5b506102b5610a1e565b6040516102c29190613888565b60405180910390f35b3480156102d757600080fd5b506102e0610a24565b6040516102ed9190613888565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906129c6565b610a2a565b005b34801561032b57600080fd5b5061034660048036038101906103419190612961565b610b22565b005b34801561035457600080fd5b5061035d610bf6565b60405161036a9190613575565b60405180910390f35b34801561037f57600080fd5b5061039a60048036038101906103959190612b83565b610c09565b005b3480156103a857600080fd5b506103c360048036038101906103be91906129c6565b610cb3565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190612b08565b610cd3565b005b3480156103fa57600080fd5b5061041560048036038101906104109190612bed565b610d80565b60405161042291906134ae565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612961565b610dbd565b60405161045f9190613888565b60405180910390f35b34801561047457600080fd5b5061047d610e75565b005b34801561048b57600080fd5b50610494610f11565b005b3480156104a257600080fd5b506104ab610fea565b6040516104b89190613590565b60405180910390f35b3480156104cd57600080fd5b506104d6611010565b6040516104e391906134ae565b60405180910390f35b3480156104f857600080fd5b50610501611036565b60405161050e91906135ab565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190612acc565b6110c8565b005b34801561054c57600080fd5b5061056760048036038101906105629190612a90565b611166565b005b34801561057557600080fd5b5061057e61117c565b60405161058b9190613575565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190612a15565b611193565b005b3480156105c957600080fd5b506105e460048036038101906105df9190612961565b61128d565b6040516105f1919061386d565b60405180910390f35b34801561060657600080fd5b50610621600480360381019061061c9190612bed565b6112ae565b60405161062e91906135ab565b60405180910390f35b34801561064357600080fd5b5061064c61132a565b604051610659919061386d565b60405180910390f35b34801561066e57600080fd5b506106896004803603810190610684919061298a565b61134e565b6040516106969190613575565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c19190612961565b6113e2565b005b3480156106d457600080fd5b506106ef60048036038101906106ea9190612acc565b6114ee565b005b61070b60048036038101906107069190612bc4565b61158c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107d857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e857506107e782611904565b5b9050919050565b6060600080546107fe90613b2f565b80601f016020809104026020016040519081016040528092919081815260200182805461082a90613b2f565b80156108775780601f1061084c57610100808354040283529160200191610877565b820191906000526020600020905b81548152906001019060200180831161085a57829003601f168201915b5050505050905090565b600061088c8261196e565b6108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c2906137ad565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091182610d80565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610982576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109799061380d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109a16119da565b73ffffffffffffffffffffffffffffffffffffffff1614806109d057506109cf816109ca6119da565b61134e565b5b610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a069061372d565b60405180910390fd5b610a1983836119e2565b505050565b60075481565b600c5481565b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b1257600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c8e8dfa8484846040518463ffffffff1660e01b8152600401610adf939291906134c9565b600060405180830381600087803b158015610af957600080fd5b505af1158015610b0d573d6000803e3d6000fd5b505050505b610b1d838383611a9b565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba9906137cd565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c90906137cd565b60405180910390fd5b8060089080519060200190610caf929190612770565b5050565b610cce83838360405180602001604052806000815250611193565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a906137cd565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e259061374d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc906137cd565b60405180910390fd5b610f0f6000611afb565b565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f98906137cd565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610fe7573d6000803e3d6000fd5b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461104590613b2f565b80601f016020809104026020016040519081016040528092919081815260200182805461107190613b2f565b80156110be5780601f10611093576101008083540402835291602001916110be565b820191906000526020600020905b8154815290600101906020018083116110a157829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906137cd565b60405180910390fd5b6111628282611bc1565b5050565b6111786111716119da565b8383611c34565b5050565b6000600b60009054906101000a900460ff16905090565b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127b57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c8e8dfa8585856040518463ffffffff1660e01b8152600401611248939291906134c9565b600060405180830381600087803b15801561126257600080fd5b505af1158015611276573d6000803e3d6000fd5b505050505b61128784848484611da1565b50505050565b600a6020528060005260406000206000915054906101000a900461ffff1681565b60606112b98261196e565b6112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef9061366d565b60405180910390fd5b600861130383611e03565b60405160200161131492919061347f565b6040516020818303038152906040529050919050565b7f0000000000000000000000000000000000000000000000000000000000000bb881565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611469906137cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d9906135ed565b60405180910390fd5b6114eb81611afb565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461157e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611575906137cd565b60405180910390fd5b6115888282611fb0565b5050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f19061376d565b60405180910390fd5b600b60009054906101000a900460ff16611649576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116409061364d565b60405180910390fd5b60038161ffff161115611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116889061384d565b60405180910390fd5b600c600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff1610611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c9061360d565b60405180910390fd5b6007547f0000000000000000000000000000000000000000000000000000000000000bb861ffff161161178d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611784906136ed565b60405180910390fd5b600034905060005b8261ffff168161ffff1610156118ff5760006117b76117b2612023565b612039565b9050808310156117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f39061370d565b60405180910390fd5b61180d33611808612023565b61205d565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688533611837612023565b60405161184592919061354c565b60405180910390a1600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900461ffff16809291906118aa90613b61565b91906101000a81548161ffff021916908361ffff16021790555050600760008154809291906118d890613b8c565b919050555080836118e99190613a13565b92505080806118f790613b61565b915050611795565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a5583610d80565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611aac611aa66119da565b8261222b565b611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae29061382d565b60405180910390fd5b611af6838383612309565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611bfe939291906134c9565b600060405180830381600087803b158015611c1857600080fd5b505af1158015611c2c573d6000803e3d6000fd5b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a906136ad565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d949190613575565b60405180910390a3505050565b611db2611dac6119da565b8361222b565b611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de89061382d565b60405180910390fd5b611dfd84848484612565565b50505050565b60606000821415611e4b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fab565b600082905060005b60008214611e7d578080611e6690613b8c565b915050600a82611e7691906139e2565b9150611e53565b60008167ffffffffffffffff811115611ebf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ef15781602001600182028036833780820191505090505b5090505b60008514611fa457600182611f0a9190613a13565b9150600a85611f199190613bd5565b6030611f25919061398c565b60f81b818381518110611f61577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f9d91906139e2565b9450611ef5565b8093505050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611fed939291906134c9565b600060405180830381600087803b15801561200757600080fd5b505af115801561201b573d6000803e3d6000fd5b505050505050565b60006001600754612034919061398c565b905090565b60006101f4821161204d5760009050612058565b665fec5b60ef800090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c49061378d565b60405180910390fd5b6120d68161196e565b15612116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210d9061362d565b60405180910390fd5b612122600083836125c1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612172919061398c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006122368261196e565b612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c906136cd565b60405180910390fd5b600061228083610d80565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122ef57508373ffffffffffffffffffffffffffffffffffffffff166122d784610881565b73ffffffffffffffffffffffffffffffffffffffff16145b8061230057506122ff818561134e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661232982610d80565b73ffffffffffffffffffffffffffffffffffffffff161461237f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612376906137ed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e69061368d565b60405180910390fd5b6123fa8383836125c1565b6124056000826119e2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124559190613a13565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ac919061398c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612570848484612309565b61257c848484846125c6565b6125bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b2906135cd565b60405180910390fd5b50505050565b505050565b60006125e78473ffffffffffffffffffffffffffffffffffffffff1661275d565b15612750578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126106119da565b8786866040518563ffffffff1660e01b81526004016126329493929190613500565b602060405180830381600087803b15801561264c57600080fd5b505af192505050801561267d57506040513d601f19601f8201168201806040525081019061267a9190612b5a565b60015b612700573d80600081146126ad576040519150601f19603f3d011682016040523d82523d6000602084013e6126b2565b606091505b506000815114156126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ef906135cd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612755565b600190505b949350505050565b600080823b905060008111915050919050565b82805461277c90613b2f565b90600052602060002090601f01602090048101928261279e57600085556127e5565b82601f106127b757805160ff19168380011785556127e5565b828001600101855582156127e5579182015b828111156127e45782518255916020019190600101906127c9565b5b5090506127f291906127f6565b5090565b5b8082111561280f5760008160009055506001016127f7565b5090565b6000612826612821846138d4565b6138a3565b90508281526020810184848401111561283e57600080fd5b612849848285613aed565b509392505050565b600061286461285f84613904565b6138a3565b90508281526020810184848401111561287c57600080fd5b612887848285613aed565b509392505050565b60008135905061289e81613cd3565b92915050565b6000813590506128b381613cea565b92915050565b6000813590506128c881613d01565b92915050565b6000815190506128dd81613d01565b92915050565b600082601f8301126128f457600080fd5b8135612904848260208601612813565b91505092915050565b600082601f83011261291e57600080fd5b813561292e848260208601612851565b91505092915050565b60008135905061294681613d18565b92915050565b60008135905061295b81613d2f565b92915050565b60006020828403121561297357600080fd5b60006129818482850161288f565b91505092915050565b6000806040838503121561299d57600080fd5b60006129ab8582860161288f565b92505060206129bc8582860161288f565b9150509250929050565b6000806000606084860312156129db57600080fd5b60006129e98682870161288f565b93505060206129fa8682870161288f565b9250506040612a0b8682870161294c565b9150509250925092565b60008060008060808587031215612a2b57600080fd5b6000612a398782880161288f565b9450506020612a4a8782880161288f565b9350506040612a5b8782880161294c565b925050606085013567ffffffffffffffff811115612a7857600080fd5b612a84878288016128e3565b91505092959194509250565b60008060408385031215612aa357600080fd5b6000612ab18582860161288f565b9250506020612ac2858286016128a4565b9150509250929050565b60008060408385031215612adf57600080fd5b6000612aed8582860161288f565b9250506020612afe8582860161294c565b9150509250929050565b600060208284031215612b1a57600080fd5b6000612b28848285016128a4565b91505092915050565b600060208284031215612b4357600080fd5b6000612b51848285016128b9565b91505092915050565b600060208284031215612b6c57600080fd5b6000612b7a848285016128ce565b91505092915050565b600060208284031215612b9557600080fd5b600082013567ffffffffffffffff811115612baf57600080fd5b612bbb8482850161290d565b91505092915050565b600060208284031215612bd657600080fd5b6000612be484828501612937565b91505092915050565b600060208284031215612bff57600080fd5b6000612c0d8482850161294c565b91505092915050565b612c1f81613a47565b82525050565b612c2e81613a59565b82525050565b6000612c3f82613949565b612c49818561395f565b9350612c59818560208601613afc565b612c6281613cc2565b840191505092915050565b612c7681613ac9565b82525050565b6000612c8782613954565b612c918185613970565b9350612ca1818560208601613afc565b612caa81613cc2565b840191505092915050565b6000612cc082613954565b612cca8185613981565b9350612cda818560208601613afc565b80840191505092915050565b60008154612cf381613b2f565b612cfd8186613981565b94506001821660008114612d185760018114612d2957612d5c565b60ff19831686528186019350612d5c565b612d3285613934565b60005b83811015612d5457815481890152600182019150602081019050612d35565b838801955050505b50505092915050565b6000612d72603283613970565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612dd8602783613970565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737321000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e3e601983613970565b91507f4d6178203132206d696e747320706572206163636f756e7421000000000000006000830152602082019050919050565b6000612e7e601c83613970565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612ebe601c83613970565b91507f5075626c69632053616c65206973206e6f74206f70656e2079657421000000006000830152602082019050919050565b6000612efe601483613970565b91507f546f6b656e20646f65736e2774206578697374210000000000000000000000006000830152602082019050919050565b6000612f3e602483613970565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fa4601983613970565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612fe4602c83613970565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061304a601983613970565b91507f4e6f206d6f72652072656d61696e696e6720746f6b656e7321000000000000006000830152602082019050919050565b600061308a601383613970565b91507f496e76616c69642076616c75652073656e7421000000000000000000000000006000830152602082019050919050565b60006130ca603883613970565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613130602a83613970565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613196601383613970565b91507f4e6f20736d61727420636f6e74726163747321000000000000000000000000006000830152602082019050919050565b60006131d6602083613970565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613216602c83613970565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061327c600583613981565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006132bc602083613970565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006132fc602983613970565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613362602183613970565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133c8603183613970565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061342e601b83613970565b91507f4d61782033206d696e747320706572207472616e73616374696f6e00000000006000830152602082019050919050565b61346a81613a91565b82525050565b61347981613abf565b82525050565b600061348b8285612ce6565b91506134978284612cb5565b91506134a28261326f565b91508190509392505050565b60006020820190506134c36000830184612c16565b92915050565b60006060820190506134de6000830186612c16565b6134eb6020830185612c16565b6134f86040830184613470565b949350505050565b60006080820190506135156000830187612c16565b6135226020830186612c16565b61352f6040830185613470565b81810360608301526135418184612c34565b905095945050505050565b60006040820190506135616000830185612c16565b61356e6020830184613470565b9392505050565b600060208201905061358a6000830184612c25565b92915050565b60006020820190506135a56000830184612c6d565b92915050565b600060208201905081810360008301526135c58184612c7c565b905092915050565b600060208201905081810360008301526135e681612d65565b9050919050565b6000602082019050818103600083015261360681612dcb565b9050919050565b6000602082019050818103600083015261362681612e31565b9050919050565b6000602082019050818103600083015261364681612e71565b9050919050565b6000602082019050818103600083015261366681612eb1565b9050919050565b6000602082019050818103600083015261368681612ef1565b9050919050565b600060208201905081810360008301526136a681612f31565b9050919050565b600060208201905081810360008301526136c681612f97565b9050919050565b600060208201905081810360008301526136e681612fd7565b9050919050565b600060208201905081810360008301526137068161303d565b9050919050565b600060208201905081810360008301526137268161307d565b9050919050565b60006020820190508181036000830152613746816130bd565b9050919050565b6000602082019050818103600083015261376681613123565b9050919050565b6000602082019050818103600083015261378681613189565b9050919050565b600060208201905081810360008301526137a6816131c9565b9050919050565b600060208201905081810360008301526137c681613209565b9050919050565b600060208201905081810360008301526137e6816132af565b9050919050565b60006020820190508181036000830152613806816132ef565b9050919050565b6000602082019050818103600083015261382681613355565b9050919050565b60006020820190508181036000830152613846816133bb565b9050919050565b6000602082019050818103600083015261386681613421565b9050919050565b60006020820190506138826000830184613461565b92915050565b600060208201905061389d6000830184613470565b92915050565b6000604051905081810181811067ffffffffffffffff821117156138ca576138c9613c93565b5b8060405250919050565b600067ffffffffffffffff8211156138ef576138ee613c93565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561391f5761391e613c93565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061399782613abf565b91506139a283613abf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139d7576139d6613c06565b5b828201905092915050565b60006139ed82613abf565b91506139f883613abf565b925082613a0857613a07613c35565b5b828204905092915050565b6000613a1e82613abf565b9150613a2983613abf565b925082821015613a3c57613a3b613c06565b5b828203905092915050565b6000613a5282613a9f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613ad482613adb565b9050919050565b6000613ae682613a9f565b9050919050565b82818337600083830152505050565b60005b83811015613b1a578082015181840152602081019050613aff565b83811115613b29576000848401525b50505050565b60006002820490506001821680613b4757607f821691505b60208210811415613b5b57613b5a613c64565b5b50919050565b6000613b6c82613a91565b915061ffff821415613b8157613b80613c06565b5b600182019050919050565b6000613b9782613abf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bca57613bc9613c06565b5b600182019050919050565b6000613be082613abf565b9150613beb83613abf565b925082613bfb57613bfa613c35565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613cdc81613a47565b8114613ce757600080fd5b50565b613cf381613a59565b8114613cfe57600080fd5b50565b613d0a81613a65565b8114613d1557600080fd5b50565b613d2181613a91565b8114613d2c57600080fd5b50565b613d3881613abf565b8114613d4357600080fd5b5056fea26469706673582212202a0b554e6030c058a96420d91c8cfbe2f18e40f6a93a0488fd20d94f1750718d64736f6c63430008000033

Deployed Bytecode Sourcemap

34993:3928:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19839:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20827:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22386:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21909:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35247:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37008:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38057:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37500:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36972:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37609:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23546:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37044:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20478:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20208:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34665:105;;;;;;;;;;;;;:::i;:::-;;35722:109;;;;;;;;;;;;;:::i;:::-;;35397:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33955:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20996:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36642:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22679:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37244:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38331:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35457:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38675:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35164:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22905:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34450:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36793:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35845:765;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19839:305;19941:4;19993:25;19978:40;;;:11;:40;;;;:105;;;;20050:33;20035:48;;;:11;:48;;;;19978:105;:158;;;;20100:36;20124:11;20100:23;:36::i;:::-;19978:158;19958:178;;19839:305;;;:::o;20827:100::-;20881:13;20914:5;20907:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20827:100;:::o;22386:221::-;22462:7;22490:16;22498:7;22490;:16::i;:::-;22482:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22575:15;:24;22591:7;22575:24;;;;;;;;;;;;;;;;;;;;;22568:31;;22386:221;;;:::o;21909:411::-;21990:13;22006:23;22021:7;22006:14;:23::i;:::-;21990:39;;22054:5;22048:11;;:2;:11;;;;22040:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22148:5;22132:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22157:37;22174:5;22181:12;:10;:12::i;:::-;22157:16;:37::i;:::-;22132:62;22110:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22291:21;22300:2;22304:7;22291:8;:21::i;:::-;21909:411;;;:::o;35247:26::-;;;;:::o;37008:29::-;;;;:::o;38057:268::-;38186:3;38157:34;;:10;;;;;;;;;;;:34;;;38152:114;;38209:10;;;;;;;;;;;:23;;;38233:5;38240:3;38245:8;38209:45;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38152:114;38276:41;38296:5;38303:3;38308:8;38276:19;:41::i;:::-;38057:268;;;:::o;37500:103::-;34169:10;34160:19;;:5;;;;;;;;;;;:19;;;34152:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37591:8:::1;37571:10;;:29;;;;;;;;;;;;;;;;;;37500:103:::0;:::o;36972:29::-;;;;;;;;;;;;;:::o;37609:97::-;34169:10;34160:19;;:5;;;;;;;;;;;:19;;;34152:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37699:4:::1;37684:12;:19;;;;;;;;;;;;:::i;:::-;;37609:97:::0;:::o;23546:185::-;23684:39;23701:4;23707:2;23711:7;23684:39;;;;;;;;;;;;:16;:39::i;:::-;23546:185;;;:::o;37044:93::-;34169:10;34160:19;;:5;;;;;;;;;;;:19;;;34152:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37129:5:::1;37109:17;;:25;;;;;;;;;;;;;;;;;;37044:93:::0;:::o;20478:282::-;20550:7;20736;:16;20744:7;20736:16;;;;;;;;;;;;;;;;;;;;;20729:23;;20478:282;;;:::o;20208:208::-;20280:7;20325:1;20308:19;;:5;:19;;;;20300:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20392:9;:16;20402:5;20392:16;;;;;;;;;;;;;;;;20385:23;;20208:208;;;:::o;34665:105::-;34169:10;34160:19;;:5;;;;;;;;;;;:19;;;34152:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34730:32:::1;34757:3;34730:18;:32::i;:::-;34665:105::o:0;35722:109::-;34169:10;34160:19;;:5;;;;;;;;;;;:19;;;34152:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35785:10:::1;35777:28;;:51;35806:21;35777:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;35722:109::o:0;35397:24::-;;;;;;;;;;;;;:::o;33955:20::-;;;;;;;;;;;;;:::o;20996:104::-;21052:13;21085:7;21078:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20996:104;:::o;36642:145::-;34169:10;34160:19;;:5;;;;;;;;;;;:19;;;34152:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36738:41:::1;36753:16;36771:7;36738:14;:41::i;:::-;36642:145:::0;;:::o;22679:155::-;22774:52;22793:12;:10;:12::i;:::-;22807:8;22817;22774:18;:52::i;:::-;22679:155;;:::o;37244:98::-;37296:4;37321:17;;;;;;;;;;;37313:26;;37244:98;:::o;38331:303::-;38484:3;38455:34;;:10;;;;;;;;;;;:34;;;38450:114;;38507:10;;;;;;;;;;;:23;;;38531:5;38538:3;38543:8;38507:45;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38450:114;38574:52;38598:5;38605:3;38610:8;38620:5;38574:23;:52::i;:::-;38331:303;;;;:::o;35457:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;38675:243::-;38741:13;38775:17;38783:8;38775:7;:17::i;:::-;38767:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;38859:12;38873:26;38890:8;38873:16;:26::i;:::-;38842:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38828:82;;38675:243;;;:::o;35164:40::-;;;:::o;22905:164::-;23002:4;23026:18;:25;23045:5;23026:25;;;;;;;;;;;;;;;:35;23052:8;23026:35;;;;;;;;;;;;;;;;;;;;;;;;;23019:42;;22905:164;;;;:::o;34450:207::-;34169:10;34160:19;;:5;;;;;;;;;;;:19;;;34152:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34561:3:::1;34540:25;;:9;:25;;;;34532:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;34620:29;34639:9;34620:18;:29::i;:::-;34450:207:::0;:::o;36793:149::-;34169:10;34160:19;;:5;;;;;;;;;;;:19;;;34152:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36891:43:::1;36907:16;36925:8;36891:15;:43::i;:::-;36793:149:::0;;:::o;35845:765::-;37421:9;37407:23;;:10;:23;;;37399:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37182:17:::1;;;;;;;;;;;37174:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35948:1:::2;35938:6;:11;;;;35930:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;36036:2;36000:21;:33;36022:10;36000:33;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;35992:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;36099:11;;36087:9;:23;;;36079:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36153:19;36175:9;36153:31;;36201:8;36196:407;36219:6;36215:10;;:1;:10;;;36196:407;;;36247:17;36267:24;36276:14;:12;:14::i;:::-;36267:8;:24::i;:::-;36247:44;;36332:12;36314:14;:30;;36306:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;36383:33;36389:10;36401:14;:12;:14::i;:::-;36383:5;:33::i;:::-;36436:32;36441:10;36453:14;:12;:14::i;:::-;36436:32;;;;;;;:::i;:::-;;;;;;;;36483:21;:33;36505:10;36483:33;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;36533:11;;:13;;;;;;;;;:::i;:::-;;;;;;36579:12;36561:30;;;;;:::i;:::-;;;36196:407;36227:3;;;;;:::i;:::-;;;;36196:407;;;;37234:1;35845:765:::0;:::o;13121:157::-;13206:4;13245:25;13230:40;;;:11;:40;;;;13223:47;;13121:157;;;:::o;25640:127::-;25705:4;25757:1;25729:30;;:7;:16;25737:7;25729:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25722:37;;25640:127;;;:::o;2585:98::-;2638:7;2665:10;2658:17;;2585:98;:::o;29622:174::-;29724:2;29697:15;:24;29713:7;29697:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29780:7;29776:2;29742:46;;29751:23;29766:7;29751:14;:23::i;:::-;29742:46;;;;;;;;;;;;29622:174;;:::o;23136:339::-;23331:41;23350:12;:10;:12::i;:::-;23364:7;23331:18;:41::i;:::-;23323:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23439:28;23449:4;23455:2;23459:7;23439:9;:28::i;:::-;23136:339;;;:::o;34244:198::-;34319:17;34339:5;;;;;;;;;;;34319:25;;34363:9;34355:5;;:17;;;;;;;;;;;;;;;;;;34420:9;34388:42;;34409:9;34388:42;;;;;;;;;;;;34244:198;;:::o;33064:176::-;33166:16;33159:37;;;33205:4;33212:10;33224:7;33159:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33064:176;;:::o;29938:315::-;30093:8;30084:17;;:5;:17;;;;30076:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30180:8;30142:18;:25;30161:5;30142:25;;;;;;;;;;;;;;;:35;30168:8;30142:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30226:8;30204:41;;30219:5;30204:41;;;30236:8;30204:41;;;;;;:::i;:::-;;;;;;;;29938:315;;;:::o;23802:328::-;23977:41;23996:12;:10;:12::i;:::-;24010:7;23977:18;:41::i;:::-;23969:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24083:39;24097:4;24103:2;24107:7;24116:5;24083:13;:39::i;:::-;23802:328;;;;:::o;286:723::-;342:13;572:1;563:5;:10;559:53;;;590:10;;;;;;;;;;;;;;;;;;;;;559:53;622:12;637:5;622:20;;653:14;678:78;693:1;685:4;:9;678:78;;711:8;;;;;:::i;:::-;;;;742:2;734:10;;;;;:::i;:::-;;;678:78;;;766:19;798:6;788:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;766:39;;816:154;832:1;823:5;:10;816:154;;860:1;850:11;;;;;:::i;:::-;;;927:2;919:5;:10;;;;:::i;:::-;906:2;:24;;;;:::i;:::-;893:39;;876:6;883;876:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;956:2;947:11;;;;;:::i;:::-;;;816:154;;;994:6;980:21;;;;;286:723;;;;:::o;33246:180::-;33351:16;33343:38;;;33390:4;33397:10;33409:8;33343:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33246:180;;:::o;37741:97::-;37788:7;37829:1;37815:11;;:15;;;;:::i;:::-;37808:22;;37741:97;:::o;37846:179::-;37904:7;37939:3;37928:7;:14;37924:55;;37966:1;37959:8;;;;37924:55;38006:11;37999:18;;37846:179;;;;:::o;27618:382::-;27712:1;27698:16;;:2;:16;;;;27690:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27771:16;27779:7;27771;:16::i;:::-;27770:17;27762:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27833:45;27862:1;27866:2;27870:7;27833:20;:45::i;:::-;27908:1;27891:9;:13;27901:2;27891:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27939:2;27920:7;:16;27928:7;27920:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27984:7;27980:2;27959:33;;27976:1;27959:33;;;;;;;;;;;;27618:382;;:::o;25934:348::-;26027:4;26052:16;26060:7;26052;:16::i;:::-;26044:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26128:13;26144:23;26159:7;26144:14;:23::i;:::-;26128:39;;26197:5;26186:16;;:7;:16;;;:51;;;;26230:7;26206:31;;:20;26218:7;26206:11;:20::i;:::-;:31;;;26186:51;:87;;;;26241:32;26258:5;26265:7;26241:16;:32::i;:::-;26186:87;26178:96;;;25934:348;;;;:::o;28926:578::-;29085:4;29058:31;;:23;29073:7;29058:14;:23::i;:::-;:31;;;29050:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29168:1;29154:16;;:2;:16;;;;29146:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29224:39;29245:4;29251:2;29255:7;29224:20;:39::i;:::-;29328:29;29345:1;29349:7;29328:8;:29::i;:::-;29389:1;29370:9;:15;29380:4;29370:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29418:1;29401:9;:13;29411:2;29401:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29449:2;29430:7;:16;29438:7;29430:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29488:7;29484:2;29469:27;;29478:4;29469:27;;;;;;;;;;;;28926:578;;;:::o;25012:315::-;25169:28;25179:4;25185:2;25189:7;25169:9;:28::i;:::-;25216:48;25239:4;25245:2;25249:7;25258:5;25216:22;:48::i;:::-;25208:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25012:315;;;;:::o;32189:126::-;;;;:::o;30818:799::-;30973:4;30994:15;:2;:13;;;:15::i;:::-;30990:620;;;31046:2;31030:36;;;31067:12;:10;:12::i;:::-;31081:4;31087:7;31096:5;31030:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31026:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31289:1;31272:6;:13;:18;31268:272;;;31315:60;;;;;;;;;;:::i;:::-;;;;;;;;31268:272;31490:6;31484:13;31475:6;31471:2;31467:15;31460:38;31026:529;31163:41;;;31153:51;;;:6;:51;;;;31146:58;;;;;30990:620;31594:4;31587:11;;30818:799;;;;;;;:::o;3480:387::-;3540:4;3748:12;3815:7;3803:20;3795:28;;3858:1;3851:4;:8;3844:15;;;3480:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:137::-;;1945:6;1932:20;1923:29;;1961:32;1987:5;1961:32;:::i;:::-;1913:86;;;;:::o;2005:139::-;;2089:6;2076:20;2067:29;;2105:33;2132:5;2105:33;:::i;:::-;2057:87;;;;:::o;2150:262::-;;2258:2;2246:9;2237:7;2233:23;2229:32;2226:2;;;2274:1;2271;2264:12;2226:2;2317:1;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2288:117;2216:196;;;;:::o;2418:407::-;;;2543:2;2531:9;2522:7;2518:23;2514:32;2511:2;;;2559:1;2556;2549:12;2511:2;2602:1;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2573:117;2729:2;2755:53;2800:7;2791:6;2780:9;2776:22;2755:53;:::i;:::-;2745:63;;2700:118;2501:324;;;;;:::o;2831:552::-;;;;2973:2;2961:9;2952:7;2948:23;2944:32;2941:2;;;2989:1;2986;2979:12;2941:2;3032:1;3057:53;3102:7;3093:6;3082:9;3078:22;3057:53;:::i;:::-;3047:63;;3003:117;3159:2;3185:53;3230:7;3221:6;3210:9;3206:22;3185:53;:::i;:::-;3175:63;;3130:118;3287:2;3313:53;3358:7;3349:6;3338:9;3334:22;3313:53;:::i;:::-;3303:63;;3258:118;2931:452;;;;;:::o;3389:809::-;;;;;3557:3;3545:9;3536:7;3532:23;3528:33;3525:2;;;3574:1;3571;3564:12;3525:2;3617:1;3642:53;3687:7;3678:6;3667:9;3663:22;3642:53;:::i;:::-;3632:63;;3588:117;3744:2;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3715:118;3872:2;3898:53;3943:7;3934:6;3923:9;3919:22;3898:53;:::i;:::-;3888:63;;3843:118;4028:2;4017:9;4013:18;4000:32;4059:18;4051:6;4048:30;4045:2;;;4091:1;4088;4081:12;4045:2;4119:62;4173:7;4164:6;4153:9;4149:22;4119:62;:::i;:::-;4109:72;;3971:220;3515:683;;;;;;;:::o;4204:401::-;;;4326:2;4314:9;4305:7;4301:23;4297:32;4294:2;;;4342:1;4339;4332:12;4294:2;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4512:2;4538:50;4580:7;4571:6;4560:9;4556:22;4538:50;:::i;:::-;4528:60;;4483:115;4284:321;;;;;:::o;4611:407::-;;;4736:2;4724:9;4715:7;4711:23;4707:32;4704:2;;;4752:1;4749;4742:12;4704:2;4795:1;4820:53;4865:7;4856:6;4845:9;4841:22;4820:53;:::i;:::-;4810:63;;4766:117;4922:2;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4893:118;4694:324;;;;;:::o;5024:256::-;;5129:2;5117:9;5108:7;5104:23;5100:32;5097:2;;;5145:1;5142;5135:12;5097:2;5188:1;5213:50;5255:7;5246:6;5235:9;5231:22;5213:50;:::i;:::-;5203:60;;5159:114;5087:193;;;;:::o;5286:260::-;;5393:2;5381:9;5372:7;5368:23;5364:32;5361:2;;;5409:1;5406;5399:12;5361:2;5452:1;5477:52;5521:7;5512:6;5501:9;5497:22;5477:52;:::i;:::-;5467:62;;5423:116;5351:195;;;;:::o;5552:282::-;;5670:2;5658:9;5649:7;5645:23;5641:32;5638:2;;;5686:1;5683;5676:12;5638:2;5729:1;5754:63;5809:7;5800:6;5789:9;5785:22;5754:63;:::i;:::-;5744:73;;5700:127;5628:206;;;;:::o;5840:375::-;;5958:2;5946:9;5937:7;5933:23;5929:32;5926:2;;;5974:1;5971;5964:12;5926:2;6045:1;6034:9;6030:17;6017:31;6075:18;6067:6;6064:30;6061:2;;;6107:1;6104;6097:12;6061:2;6135:63;6190:7;6181:6;6170:9;6166:22;6135:63;:::i;:::-;6125:73;;5988:220;5916:299;;;;:::o;6221:260::-;;6328:2;6316:9;6307:7;6303:23;6299:32;6296:2;;;6344:1;6341;6334:12;6296:2;6387:1;6412:52;6456:7;6447:6;6436:9;6432:22;6412:52;:::i;:::-;6402:62;;6358:116;6286:195;;;;:::o;6487:262::-;;6595:2;6583:9;6574:7;6570:23;6566:32;6563:2;;;6611:1;6608;6601:12;6563:2;6654:1;6679:53;6724:7;6715:6;6704:9;6700:22;6679:53;:::i;:::-;6669:63;;6625:117;6553:196;;;;:::o;6755:118::-;6842:24;6860:5;6842:24;:::i;:::-;6837:3;6830:37;6820:53;;:::o;6879:109::-;6960:21;6975:5;6960:21;:::i;:::-;6955:3;6948:34;6938:50;;:::o;6994:360::-;;7108:38;7140:5;7108:38;:::i;:::-;7162:70;7225:6;7220:3;7162:70;:::i;:::-;7155:77;;7241:52;7286:6;7281:3;7274:4;7267:5;7263:16;7241:52;:::i;:::-;7318:29;7340:6;7318:29;:::i;:::-;7313:3;7309:39;7302:46;;7084:270;;;;;:::o;7360:161::-;7462:52;7508:5;7462:52;:::i;:::-;7457:3;7450:65;7440:81;;:::o;7527:364::-;;7643:39;7676:5;7643:39;:::i;:::-;7698:71;7762:6;7757:3;7698:71;:::i;:::-;7691:78;;7778:52;7823:6;7818:3;7811:4;7804:5;7800:16;7778:52;:::i;:::-;7855:29;7877:6;7855:29;:::i;:::-;7850:3;7846:39;7839:46;;7619:272;;;;;:::o;7897:377::-;;8031:39;8064:5;8031:39;:::i;:::-;8086:89;8168:6;8163:3;8086:89;:::i;:::-;8079:96;;8184:52;8229:6;8224:3;8217:4;8210:5;8206:16;8184:52;:::i;:::-;8261:6;8256:3;8252:16;8245:23;;8007:267;;;;;:::o;8304:845::-;;8444:5;8438:12;8473:36;8499:9;8473:36;:::i;:::-;8525:89;8607:6;8602:3;8525:89;:::i;:::-;8518:96;;8645:1;8634:9;8630:17;8661:1;8656:137;;;;8807:1;8802:341;;;;8623:520;;8656:137;8740:4;8736:9;8725;8721:25;8716:3;8709:38;8776:6;8771:3;8767:16;8760:23;;8656:137;;8802:341;8869:38;8901:5;8869:38;:::i;:::-;8929:1;8943:154;8957:6;8954:1;8951:13;8943:154;;;9031:7;9025:14;9021:1;9016:3;9012:11;9005:35;9081:1;9072:7;9068:15;9057:26;;8979:4;8976:1;8972:12;8967:17;;8943:154;;;9126:6;9121:3;9117:16;9110:23;;8809:334;;8623:520;;8411:738;;;;;;:::o;9155:382::-;;9318:67;9382:2;9377:3;9318:67;:::i;:::-;9311:74;;9415:34;9411:1;9406:3;9402:11;9395:55;9481:20;9476:2;9471:3;9467:12;9460:42;9528:2;9523:3;9519:12;9512:19;;9301:236;;;:::o;9543:371::-;;9706:67;9770:2;9765:3;9706:67;:::i;:::-;9699:74;;9803:34;9799:1;9794:3;9790:11;9783:55;9869:9;9864:2;9859:3;9855:12;9848:31;9905:2;9900:3;9896:12;9889:19;;9689:225;;;:::o;9920:323::-;;10083:67;10147:2;10142:3;10083:67;:::i;:::-;10076:74;;10180:27;10176:1;10171:3;10167:11;10160:48;10234:2;10229:3;10225:12;10218:19;;10066:177;;;:::o;10249:326::-;;10412:67;10476:2;10471:3;10412:67;:::i;:::-;10405:74;;10509:30;10505:1;10500:3;10496:11;10489:51;10566:2;10561:3;10557:12;10550:19;;10395:180;;;:::o;10581:326::-;;10744:67;10808:2;10803:3;10744:67;:::i;:::-;10737:74;;10841:30;10837:1;10832:3;10828:11;10821:51;10898:2;10893:3;10889:12;10882:19;;10727:180;;;:::o;10913:318::-;;11076:67;11140:2;11135:3;11076:67;:::i;:::-;11069:74;;11173:22;11169:1;11164:3;11160:11;11153:43;11222:2;11217:3;11213:12;11206:19;;11059:172;;;:::o;11237:368::-;;11400:67;11464:2;11459:3;11400:67;:::i;:::-;11393:74;;11497:34;11493:1;11488:3;11484:11;11477:55;11563:6;11558:2;11553:3;11549:12;11542:28;11596:2;11591:3;11587:12;11580:19;;11383:222;;;:::o;11611:323::-;;11774:67;11838:2;11833:3;11774:67;:::i;:::-;11767:74;;11871:27;11867:1;11862:3;11858:11;11851:48;11925:2;11920:3;11916:12;11909:19;;11757:177;;;:::o;11940:376::-;;12103:67;12167:2;12162:3;12103:67;:::i;:::-;12096:74;;12200:34;12196:1;12191:3;12187:11;12180:55;12266:14;12261:2;12256:3;12252:12;12245:36;12307:2;12302:3;12298:12;12291:19;;12086:230;;;:::o;12322:323::-;;12485:67;12549:2;12544:3;12485:67;:::i;:::-;12478:74;;12582:27;12578:1;12573:3;12569:11;12562:48;12636:2;12631:3;12627:12;12620:19;;12468:177;;;:::o;12651:317::-;;12814:67;12878:2;12873:3;12814:67;:::i;:::-;12807:74;;12911:21;12907:1;12902:3;12898:11;12891:42;12959:2;12954:3;12950:12;12943:19;;12797:171;;;:::o;12974:388::-;;13137:67;13201:2;13196:3;13137:67;:::i;:::-;13130:74;;13234:34;13230:1;13225:3;13221:11;13214:55;13300:26;13295:2;13290:3;13286:12;13279:48;13353:2;13348:3;13344:12;13337:19;;13120:242;;;:::o;13368:374::-;;13531:67;13595:2;13590:3;13531:67;:::i;:::-;13524:74;;13628:34;13624:1;13619:3;13615:11;13608:55;13694:12;13689:2;13684:3;13680:12;13673:34;13733:2;13728:3;13724:12;13717:19;;13514:228;;;:::o;13748:317::-;;13911:67;13975:2;13970:3;13911:67;:::i;:::-;13904:74;;14008:21;14004:1;13999:3;13995:11;13988:42;14056:2;14051:3;14047:12;14040:19;;13894:171;;;:::o;14071:330::-;;14234:67;14298:2;14293:3;14234:67;:::i;:::-;14227:74;;14331:34;14327:1;14322:3;14318:11;14311:55;14392:2;14387:3;14383:12;14376:19;;14217:184;;;:::o;14407:376::-;;14570:67;14634:2;14629:3;14570:67;:::i;:::-;14563:74;;14667:34;14663:1;14658:3;14654:11;14647:55;14733:14;14728:2;14723:3;14719:12;14712:36;14774:2;14769:3;14765:12;14758:19;;14553:230;;;:::o;14789:337::-;;14970:84;15052:1;15047:3;14970:84;:::i;:::-;14963:91;;15084:7;15080:1;15075:3;15071:11;15064:28;15118:1;15113:3;15109:11;15102:18;;14953:173;;;:::o;15132:330::-;;15295:67;15359:2;15354:3;15295:67;:::i;:::-;15288:74;;15392:34;15388:1;15383:3;15379:11;15372:55;15453:2;15448:3;15444:12;15437:19;;15278:184;;;:::o;15468:373::-;;15631:67;15695:2;15690:3;15631:67;:::i;:::-;15624:74;;15728:34;15724:1;15719:3;15715:11;15708:55;15794:11;15789:2;15784:3;15780:12;15773:33;15832:2;15827:3;15823:12;15816:19;;15614:227;;;:::o;15847:365::-;;16010:67;16074:2;16069:3;16010:67;:::i;:::-;16003:74;;16107:34;16103:1;16098:3;16094:11;16087:55;16173:3;16168:2;16163:3;16159:12;16152:25;16203:2;16198:3;16194:12;16187:19;;15993:219;;;:::o;16218:381::-;;16381:67;16445:2;16440:3;16381:67;:::i;:::-;16374:74;;16478:34;16474:1;16469:3;16465:11;16458:55;16544:19;16539:2;16534:3;16530:12;16523:41;16590:2;16585:3;16581:12;16574:19;;16364:235;;;:::o;16605:325::-;;16768:67;16832:2;16827:3;16768:67;:::i;:::-;16761:74;;16865:29;16861:1;16856:3;16852:11;16845:50;16921:2;16916:3;16912:12;16905:19;;16751:179;;;:::o;16936:115::-;17021:23;17038:5;17021:23;:::i;:::-;17016:3;17009:36;16999:52;;:::o;17057:118::-;17144:24;17162:5;17144:24;:::i;:::-;17139:3;17132:37;17122:53;;:::o;17181:695::-;;17481:92;17569:3;17560:6;17481:92;:::i;:::-;17474:99;;17590:95;17681:3;17672:6;17590:95;:::i;:::-;17583:102;;17702:148;17846:3;17702:148;:::i;:::-;17695:155;;17867:3;17860:10;;17463:413;;;;;:::o;17882:222::-;;18013:2;18002:9;17998:18;17990:26;;18026:71;18094:1;18083:9;18079:17;18070:6;18026:71;:::i;:::-;17980:124;;;;:::o;18110:442::-;;18297:2;18286:9;18282:18;18274:26;;18310:71;18378:1;18367:9;18363:17;18354:6;18310:71;:::i;:::-;18391:72;18459:2;18448:9;18444:18;18435:6;18391:72;:::i;:::-;18473;18541:2;18530:9;18526:18;18517:6;18473:72;:::i;:::-;18264:288;;;;;;:::o;18558:640::-;;18791:3;18780:9;18776:19;18768:27;;18805:71;18873:1;18862:9;18858:17;18849:6;18805:71;:::i;:::-;18886:72;18954:2;18943:9;18939:18;18930:6;18886:72;:::i;:::-;18968;19036:2;19025:9;19021:18;19012:6;18968:72;:::i;:::-;19087:9;19081:4;19077:20;19072:2;19061:9;19057:18;19050:48;19115:76;19186:4;19177:6;19115:76;:::i;:::-;19107:84;;18758:440;;;;;;;:::o;19204:332::-;;19363:2;19352:9;19348:18;19340:26;;19376:71;19444:1;19433:9;19429:17;19420:6;19376:71;:::i;:::-;19457:72;19525:2;19514:9;19510:18;19501:6;19457:72;:::i;:::-;19330:206;;;;;:::o;19542:210::-;;19667:2;19656:9;19652:18;19644:26;;19680:65;19742:1;19731:9;19727:17;19718:6;19680:65;:::i;:::-;19634:118;;;;:::o;19758:252::-;;19904:2;19893:9;19889:18;19881:26;;19917:86;20000:1;19989:9;19985:17;19976:6;19917:86;:::i;:::-;19871:139;;;;:::o;20016:313::-;;20167:2;20156:9;20152:18;20144:26;;20216:9;20210:4;20206:20;20202:1;20191:9;20187:17;20180:47;20244:78;20317:4;20308:6;20244:78;:::i;:::-;20236:86;;20134:195;;;;:::o;20335:419::-;;20539:2;20528:9;20524:18;20516:26;;20588:9;20582:4;20578:20;20574:1;20563:9;20559:17;20552:47;20616:131;20742:4;20616:131;:::i;:::-;20608:139;;20506:248;;;:::o;20760:419::-;;20964:2;20953:9;20949:18;20941:26;;21013:9;21007:4;21003:20;20999:1;20988:9;20984:17;20977:47;21041:131;21167:4;21041:131;:::i;:::-;21033:139;;20931:248;;;:::o;21185:419::-;;21389:2;21378:9;21374:18;21366:26;;21438:9;21432:4;21428:20;21424:1;21413:9;21409:17;21402:47;21466:131;21592:4;21466:131;:::i;:::-;21458:139;;21356:248;;;:::o;21610:419::-;;21814:2;21803:9;21799:18;21791:26;;21863:9;21857:4;21853:20;21849:1;21838:9;21834:17;21827:47;21891:131;22017:4;21891:131;:::i;:::-;21883:139;;21781:248;;;:::o;22035:419::-;;22239:2;22228:9;22224:18;22216:26;;22288:9;22282:4;22278:20;22274:1;22263:9;22259:17;22252:47;22316:131;22442:4;22316:131;:::i;:::-;22308:139;;22206:248;;;:::o;22460:419::-;;22664:2;22653:9;22649:18;22641:26;;22713:9;22707:4;22703:20;22699:1;22688:9;22684:17;22677:47;22741:131;22867:4;22741:131;:::i;:::-;22733:139;;22631:248;;;:::o;22885:419::-;;23089:2;23078:9;23074:18;23066:26;;23138:9;23132:4;23128:20;23124:1;23113:9;23109:17;23102:47;23166:131;23292:4;23166:131;:::i;:::-;23158:139;;23056:248;;;:::o;23310:419::-;;23514:2;23503:9;23499:18;23491:26;;23563:9;23557:4;23553:20;23549:1;23538:9;23534:17;23527:47;23591:131;23717:4;23591:131;:::i;:::-;23583:139;;23481:248;;;:::o;23735:419::-;;23939:2;23928:9;23924:18;23916:26;;23988:9;23982:4;23978:20;23974:1;23963:9;23959:17;23952:47;24016:131;24142:4;24016:131;:::i;:::-;24008:139;;23906:248;;;:::o;24160:419::-;;24364:2;24353:9;24349:18;24341:26;;24413:9;24407:4;24403:20;24399:1;24388:9;24384:17;24377:47;24441:131;24567:4;24441:131;:::i;:::-;24433:139;;24331:248;;;:::o;24585:419::-;;24789:2;24778:9;24774:18;24766:26;;24838:9;24832:4;24828:20;24824:1;24813:9;24809:17;24802:47;24866:131;24992:4;24866:131;:::i;:::-;24858:139;;24756:248;;;:::o;25010:419::-;;25214:2;25203:9;25199:18;25191:26;;25263:9;25257:4;25253:20;25249:1;25238:9;25234:17;25227:47;25291:131;25417:4;25291:131;:::i;:::-;25283:139;;25181:248;;;:::o;25435:419::-;;25639:2;25628:9;25624:18;25616:26;;25688:9;25682:4;25678:20;25674:1;25663:9;25659:17;25652:47;25716:131;25842:4;25716:131;:::i;:::-;25708:139;;25606:248;;;:::o;25860:419::-;;26064:2;26053:9;26049:18;26041:26;;26113:9;26107:4;26103:20;26099:1;26088:9;26084:17;26077:47;26141:131;26267:4;26141:131;:::i;:::-;26133:139;;26031:248;;;:::o;26285:419::-;;26489:2;26478:9;26474:18;26466:26;;26538:9;26532:4;26528:20;26524:1;26513:9;26509:17;26502:47;26566:131;26692:4;26566:131;:::i;:::-;26558:139;;26456:248;;;:::o;26710:419::-;;26914:2;26903:9;26899:18;26891:26;;26963:9;26957:4;26953:20;26949:1;26938:9;26934:17;26927:47;26991:131;27117:4;26991:131;:::i;:::-;26983:139;;26881:248;;;:::o;27135:419::-;;27339:2;27328:9;27324:18;27316:26;;27388:9;27382:4;27378:20;27374:1;27363:9;27359:17;27352:47;27416:131;27542:4;27416:131;:::i;:::-;27408:139;;27306:248;;;:::o;27560:419::-;;27764:2;27753:9;27749:18;27741:26;;27813:9;27807:4;27803:20;27799:1;27788:9;27784:17;27777:47;27841:131;27967:4;27841:131;:::i;:::-;27833:139;;27731:248;;;:::o;27985:419::-;;28189:2;28178:9;28174:18;28166:26;;28238:9;28232:4;28228:20;28224:1;28213:9;28209:17;28202:47;28266:131;28392:4;28266:131;:::i;:::-;28258:139;;28156:248;;;:::o;28410:419::-;;28614:2;28603:9;28599:18;28591:26;;28663:9;28657:4;28653:20;28649:1;28638:9;28634:17;28627:47;28691:131;28817:4;28691:131;:::i;:::-;28683:139;;28581:248;;;:::o;28835:419::-;;29039:2;29028:9;29024:18;29016:26;;29088:9;29082:4;29078:20;29074:1;29063:9;29059:17;29052:47;29116:131;29242:4;29116:131;:::i;:::-;29108:139;;29006:248;;;:::o;29260:218::-;;29389:2;29378:9;29374:18;29366:26;;29402:69;29468:1;29457:9;29453:17;29444:6;29402:69;:::i;:::-;29356:122;;;;:::o;29484:222::-;;29615:2;29604:9;29600:18;29592:26;;29628:71;29696:1;29685:9;29681:17;29672:6;29628:71;:::i;:::-;29582:124;;;;:::o;29712:283::-;;29778:2;29772:9;29762:19;;29820:4;29812:6;29808:17;29927:6;29915:10;29912:22;29891:18;29879:10;29876:34;29873:62;29870:2;;;29938:18;;:::i;:::-;29870:2;29978:10;29974:2;29967:22;29752:243;;;;:::o;30001:331::-;;30152:18;30144:6;30141:30;30138:2;;;30174:18;;:::i;:::-;30138:2;30259:4;30255:9;30248:4;30240:6;30236:17;30232:33;30224:41;;30320:4;30314;30310:15;30302:23;;30067:265;;;:::o;30338:332::-;;30490:18;30482:6;30479:30;30476:2;;;30512:18;;:::i;:::-;30476:2;30597:4;30593:9;30586:4;30578:6;30574:17;30570:33;30562:41;;30658:4;30652;30648:15;30640:23;;30405:265;;;:::o;30676:141::-;;30748:3;30740:11;;30771:3;30768:1;30761:14;30805:4;30802:1;30792:18;30784:26;;30730:87;;;:::o;30823:98::-;;30908:5;30902:12;30892:22;;30881:40;;;:::o;30927:99::-;;31013:5;31007:12;30997:22;;30986:40;;;:::o;31032:168::-;;31149:6;31144:3;31137:19;31189:4;31184:3;31180:14;31165:29;;31127:73;;;;:::o;31206:169::-;;31324:6;31319:3;31312:19;31364:4;31359:3;31355:14;31340:29;;31302:73;;;;:::o;31381:148::-;;31520:3;31505:18;;31495:34;;;;:::o;31535:305::-;;31594:20;31612:1;31594:20;:::i;:::-;31589:25;;31628:20;31646:1;31628:20;:::i;:::-;31623:25;;31782:1;31714:66;31710:74;31707:1;31704:81;31701:2;;;31788:18;;:::i;:::-;31701:2;31832:1;31829;31825:9;31818:16;;31579:261;;;;:::o;31846:185::-;;31903:20;31921:1;31903:20;:::i;:::-;31898:25;;31937:20;31955:1;31937:20;:::i;:::-;31932:25;;31976:1;31966:2;;31981:18;;:::i;:::-;31966:2;32023:1;32020;32016:9;32011:14;;31888:143;;;;:::o;32037:191::-;;32097:20;32115:1;32097:20;:::i;:::-;32092:25;;32131:20;32149:1;32131:20;:::i;:::-;32126:25;;32170:1;32167;32164:8;32161:2;;;32175:18;;:::i;:::-;32161:2;32220:1;32217;32213:9;32205:17;;32082:146;;;;:::o;32234:96::-;;32300:24;32318:5;32300:24;:::i;:::-;32289:35;;32279:51;;;:::o;32336:90::-;;32413:5;32406:13;32399:21;32388:32;;32378:48;;;:::o;32432:149::-;;32508:66;32501:5;32497:78;32486:89;;32476:105;;;:::o;32587:89::-;;32663:6;32656:5;32652:18;32641:29;;32631:45;;;:::o;32682:126::-;;32759:42;32752:5;32748:54;32737:65;;32727:81;;;:::o;32814:77::-;;32880:5;32869:16;;32859:32;;;:::o;32897:156::-;;32995:52;33041:5;32995:52;:::i;:::-;32982:65;;32972:81;;;:::o;33059:128::-;;33157:24;33175:5;33157:24;:::i;:::-;33144:37;;33134:53;;;:::o;33193:154::-;33277:6;33272:3;33267;33254:30;33339:1;33330:6;33325:3;33321:16;33314:27;33244:103;;;:::o;33353:307::-;33421:1;33431:113;33445:6;33442:1;33439:13;33431:113;;;33530:1;33525:3;33521:11;33515:18;33511:1;33506:3;33502:11;33495:39;33467:2;33464:1;33460:10;33455:15;;33431:113;;;33562:6;33559:1;33556:13;33553:2;;;33642:1;33633:6;33628:3;33624:16;33617:27;33553:2;33402:258;;;;:::o;33666:320::-;;33747:1;33741:4;33737:12;33727:22;;33794:1;33788:4;33784:12;33815:18;33805:2;;33871:4;33863:6;33859:17;33849:27;;33805:2;33933;33925:6;33922:14;33902:18;33899:38;33896:2;;;33952:18;;:::i;:::-;33896:2;33717:269;;;;:::o;33992:171::-;;34053:23;34070:5;34053:23;:::i;:::-;34044:32;;34098:6;34091:5;34088:17;34085:2;;;34108:18;;:::i;:::-;34085:2;34155:1;34148:5;34144:13;34137:20;;34034:129;;;:::o;34169:233::-;;34231:24;34249:5;34231:24;:::i;:::-;34222:33;;34277:66;34270:5;34267:77;34264:2;;;34347:18;;:::i;:::-;34264:2;34394:1;34387:5;34383:13;34376:20;;34212:190;;;:::o;34408:176::-;;34457:20;34475:1;34457:20;:::i;:::-;34452:25;;34491:20;34509:1;34491:20;:::i;:::-;34486:25;;34530:1;34520:2;;34535:18;;:::i;:::-;34520:2;34576:1;34573;34569:9;34564:14;;34442:142;;;;:::o;34590:180::-;34638:77;34635:1;34628:88;34735:4;34732:1;34725:15;34759:4;34756:1;34749:15;34776:180;34824:77;34821:1;34814:88;34921:4;34918:1;34911:15;34945:4;34942:1;34935:15;34962:180;35010:77;35007:1;35000:88;35107:4;35104:1;35097:15;35131:4;35128:1;35121:15;35148:180;35196:77;35193:1;35186:88;35293:4;35290:1;35283:15;35317:4;35314:1;35307:15;35334:102;;35426:2;35422:7;35417:2;35410:5;35406:14;35402:28;35392:38;;35382:54;;;:::o;35442:122::-;35515:24;35533:5;35515:24;:::i;:::-;35508:5;35505:35;35495:2;;35554:1;35551;35544:12;35495:2;35485:79;:::o;35570:116::-;35640:21;35655:5;35640:21;:::i;:::-;35633:5;35630:32;35620:2;;35676:1;35673;35666:12;35620:2;35610:76;:::o;35692:120::-;35764:23;35781:5;35764:23;:::i;:::-;35757:5;35754:34;35744:2;;35802:1;35799;35792:12;35744:2;35734:78;:::o;35818:120::-;35890:23;35907:5;35890:23;:::i;:::-;35883:5;35880:34;35870:2;;35928:1;35925;35918:12;35870:2;35860:78;:::o;35944:122::-;36017:24;36035:5;36017:24;:::i;:::-;36010:5;36007:35;35997:2;;36056:1;36053;36046:12;35997:2;35987:79;:::o

Swarm Source

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