ETH Price: $3,478.02 (-1.10%)
Gas: 5 Gwei

Token

CryptoCrooksDAO (CROOK)
 

Overview

Max Total Supply

344 CROOK

Holders

129

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CROOK
0xCB89Bb708293caF2A0f8f9c30C527BaF95A19136
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

CryptoCrooks is a **limited** collection of **5000 unique digital NFTs** powering a DeFi-centric **DAO** on the Ethereum blockchain. **80% of minting fees** are **deposited and donated** into yield bearing strategies controlled by a DAO. The community votes and decides which ...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoCrooks

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-08
*/

// SPDX-License-Identifier: MIT

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

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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}


// File contracts/CryptoCrooks.sol


pragma solidity ^0.8.0;




contract CryptoCrooks is 
    ERC721, 
    ERC721Enumerable, 
    Ownable {

    string public LICENSE_TEXT = "ALL RIGHTS TO TOKEN HOLDER";  
    string public CROOKS_PROVENANCE = "";       // IPFS URL WILL BE ADDED WHEN CROOKS ARE REVEALED
    string public nftBaseURI = "";

    bool licenseLocked = false;                 // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE
    bool public saleIsActive = false;
    bool public preSaleIsActive = false;
    
    bytes32 public merkleTreeRoot;

    mapping(uint => string) public crookNames;  // Custom names
    mapping(uint => string) public crookScenes; // Provenanced Scenes
    mapping(address => bool) public hasClaimed; // Has user claimed presale?
    
    // Address to transfer Fund fees to upon minting
    address payable public daoVaultAddress = payable(0x54Bc506b4EB3570522c062539b35E5b61853AbEc);

    uint public constant MAX_CROOKS = 5000;

    uint public constant maxCrookPurchase = 10;
    uint public constant daoShare = 80; // in %, Percentage of minting fee thats being payed to DAO on minting
        
    uint public crookReserve = 500; // Reserve 500 Crooks for team - Giveaways/Prizes etc
    uint public crookPresaleReserve = 250; // Reserve 250 Crooks for minting @ discount during presale phase

    uint256 public constant crookPrice = 80000000000000000;           // 0.08 ETH
    uint256 public constant crookPresalePrice = 50000000000000000;    // 0.05 ETH
    uint256 public constant changeCrookNamePrice = 10000000000000000; // 0.01 ETH
    uint256 public constant changeCrookScenePrice = 10000000000000000;// 0.01 ETH
    
    event LicenseIsLocked(string _licenseText);
    event PreSaleActivated(bool isActive);
    event PreSaleClaimed(address _by, uint _amount);
    event SaleActivated(bool isActive);
    event MintNFT(address _by, uint _amount);
    event DaoVaultAddressChanged(address payable _to);
    event DaoVaultFunded(uint256 amount);
    event CrookNameChanged(address _by, uint _tokenId, string _name);
    event CrookSceneChanged(address _by, uint _tokenId, string _name);
    
    constructor(
        bytes32 _merkleTreeRoot,
        address payable _daoVaultAddress,
        string memory _nftBaseURI
    ) ERC721("CryptoCrooksDAO", "CROOK") {
        merkleTreeRoot = _merkleTreeRoot;
        daoVaultAddress = _daoVaultAddress;
        nftBaseURI = _nftBaseURI;
    }

    /** START ERC721Enumerable Overrides  **/
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }
    /** END ERC721Enumerable Overrides  **/
 
    /** START MerkleTree  **/
    // Checks if a user is part of presale whitelist (using pre-generated MerkleTree)
    function verify(uint256 _amount, bytes32[] memory _proof)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, _amount));
        return MerkleProof.verify(_proof, merkleTreeRoot, leaf);
    }
    /** END MerkleTree  **/

    /** Custom baseURI **/
    function baseURI () public view returns (string memory _uri) {
       return _baseURI();
    }
    
    function setBaseURI (string memory _uri) public onlyOwner {
        nftBaseURI = _uri;
    }

    function _baseURI() internal view override returns (string memory) {
        return nftBaseURI;
    }
    /** END Custom baseURI  **/

    function setDaoVaultAddress(address payable _daoVaultAddress) public onlyOwner {
        daoVaultAddress = _daoVaultAddress;
        emit DaoVaultAddressChanged(_daoVaultAddress);
    }

    function setProvenanceHash(string memory _provenanceHash) public onlyOwner {
        CROOKS_PROVENANCE = _provenanceHash;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(owner()).transfer(balance);
    }

    function flipPreSaleState() public onlyOwner {
        preSaleIsActive = !preSaleIsActive;
        emit PreSaleActivated(preSaleIsActive);
    }
    
    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
        preSaleIsActive = false; // End presale
        emit SaleActivated(saleIsActive);
    }
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = this.balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = super.tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    // Returns the license for tokens
    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < this.totalSupply(), "Choose a crook within range");
        return LICENSE_TEXT;
    }
    
    // Locks the license to prevent further changes 
    function lockLicense() public onlyOwner {
        licenseLocked =  true;
        emit LicenseIsLocked(LICENSE_TEXT);
    }
    
    // Change the license
    function changeLicense(string memory _license) public onlyOwner {
        require(licenseLocked == false, "License already locked");
        LICENSE_TEXT = _license;
    }
    
    // Overwriting forwardFunds function because otherwise we get a failed gas estimation error
    function _forwardFunds(uint256 _amount) internal {
        // Call returns a boolean value indicating success or failure.
        // This is the current recommended method to use.
        (bool success,) = daoVaultAddress.call{value: _amount}('');
        require(success, 'Failed to forward funds');
    }
    
    function _mintLoop(address _to, uint256 _amountToMint) internal {
        for (uint i = 0; i < _amountToMint; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_CROOKS) {
                _safeMint(_to, mintIndex);
            }
        }
    }
    
    // Mints amount of Crooks to specified address, and pays its funding to the DAO
    function _mintNFT(uint _amount) internal {
        uint256 fundAmount = (msg.value / 100) * daoShare;  // Calculate 80% of sent funds
        _forwardFunds(fundAmount);                          // Transfer to DAO Vault    
        emit DaoVaultFunded(fundAmount);
    
        _mintLoop(msg.sender, _amount);
    } 

    // TEAM RESERVE MINT
    function mintTeamReserveNFTs(uint _reserveAmount) public onlyOwner {        
        mintTeamReserveNFTsToAddress(msg.sender, _reserveAmount);
    }

    function mintTeamReserveNFTsToAddress(address _address, uint _reserveAmount) public onlyOwner {        
        require(_reserveAmount > 0 && _reserveAmount <= crookReserve, "Trying to claim illegal amount");

        crookReserve = crookReserve - _reserveAmount;

        _mintLoop(_address, _reserveAmount);
    }
 
    // FOR WHITELISTED PRESALE USERS (= Mentioned in MerkleTree)
    function claimPreSaleNFT(uint256 _amount, bytes32[] memory _proof) public payable {
        require(preSaleIsActive, "Presale must be active to reserve Crooks");

        // Checks if user is part of presale Merkle Tree
        require(verify(_amount, _proof), "You have no presale claim");
        require(!hasClaimed[msg.sender], "You have already claimed");

        require(_amount > 0, "You need to claim more than 0 Crooks"); 
        require(crookPresaleReserve > 0, "All presale Crooks have been claimed"); 
        require(crookPresaleReserve - _amount >= 0, "Not enough presale Crooks left"); 

        require(msg.value >= _amount * crookPresalePrice, "Ether value sent is not sufficient"); 

        hasClaimed[msg.sender] = true; 
        crookPresaleReserve = crookPresaleReserve - _amount;
        
        // Mint and transfer part of sent funds to CryptoCrooks DAO Vault
        _mintNFT(_amount); 

        emit PreSaleClaimed(msg.sender, _amount);
    }
    
    // REGULAR MINTING
    function mintNFT(uint _amount) public payable {
        require(saleIsActive, "Sale must be active to mint Crooks");
        require(_amount > 0 && _amount <= maxCrookPurchase, "You can only mint 10 crooks per transaction");
        require(totalSupply() + _amount <= MAX_CROOKS, "Purchase would exceed max supply of Crooks");
        require(msg.value >= crookPrice * _amount, "Ether value sent is not sufficient");
        
        // Mint and transfer part of sent funds to CryptoCrooks DAO Vault
        _mintNFT(_amount);

        emit MintNFT(msg.sender, _amount);
    }
     
    function changeCrookName(uint _tokenId, string memory _name) public payable {
        require(ownerOf(_tokenId) == msg.sender, "Your wallet doesn't own this crook");
        require(msg.value >= changeCrookNamePrice, "Ether value sent is not sufficient");
        require(sha256(bytes(_name)) != sha256(bytes(crookNames[_tokenId])), "New name is same as current one");
        
        crookNames[_tokenId] = _name;
        
        emit CrookNameChanged(msg.sender, _tokenId, _name);
    }
 
    function changeCrookScene(uint _tokenId, string memory _scene) public payable {
        require(this.ownerOf(_tokenId) == msg.sender, "Your wallet doesn't own this crook");
        require(msg.value >= changeCrookScenePrice, "Ether value sent is not sufficient");
        require(sha256(bytes(_scene)) != sha256(bytes(crookScenes[_tokenId])), "New scene is same as current one");
        
        crookScenes[_tokenId] = _scene;
        
        emit CrookSceneChanged(msg.sender, _tokenId, _scene);
    }
    
    function getCrookScene(uint _tokenId) public view returns( string memory){
        require( _tokenId < this.totalSupply(), "Choose a crook within range" );
        return crookScenes[_tokenId];
    }
     
    function getCrookName(uint _tokenId) public view returns( string memory ){
        require( _tokenId < this.totalSupply(), "Choose a crook within range" );
        return crookNames[_tokenId];
    }
    
    // GET ALL CROOKS OF A WALLET AS AN ARRAY OF STRINGS. WOULD BE BETTER MAYBE IF IT RETURNED A STRUCT WITH ID-NAME MATCH
    function crookNamesOfOwner(address _owner) external view returns(string[] memory ) {
        uint256 tokenCount = this.balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new string[](0);
        } else {
            string[] memory result = new string[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = crookNames[this.tokenOfOwnerByIndex(_owner, index)] ;
            }
            return result;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_merkleTreeRoot","type":"bytes32"},{"internalType":"address payable","name":"_daoVaultAddress","type":"address"},{"internalType":"string","name":"_nftBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"CrookNameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"CrookSceneChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"_to","type":"address"}],"name":"DaoVaultAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DaoVaultFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"LicenseIsLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MintNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"PreSaleActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"PreSaleClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SaleActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CROOKS_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CROOKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeCrookName","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"changeCrookNamePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_scene","type":"string"}],"name":"changeCrookScene","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"changeCrookScenePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"claimPreSaleNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crookNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"crookNamesOfOwner","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crookPresalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crookPresaleReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crookPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crookReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crookScenes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoVaultAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCrookName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCrookScene","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxCrookPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleTreeRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"mintTeamReserveNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"mintTeamReserveNFTsToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_daoVaultAddress","type":"address"}],"name":"setDaoVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052601a60808190527f414c4c2052494748545320544f20544f4b454e20484f4c44455200000000000060a09081526200004091600b91906200020c565b506040805160208101918290526000908190526200006191600c916200020c565b506040805160208101918290526000908190526200008291600d916200020c565b50600e805462ffffff19169055601380546001600160a01b0319167354bc506b4eb3570522c062539b35e5b61853abec1790556101f460145560fa601555348015620000cd57600080fd5b506040516200433038038062004330833981016040819052620000f091620002b2565b604080518082018252600f81526e43727970746f43726f6f6b7344414f60881b60208083019182528351808501909452600584526443524f4f4b60d81b90840152815191929162000144916000916200020c565b5080516200015a9060019060208401906200020c565b5050506200017762000171620001b660201b60201c565b620001ba565b600f839055601380546001600160a01b0319166001600160a01b0384161790558051620001ac90600d9060208401906200020c565b5050505062000401565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200021a90620003ae565b90600052602060002090601f0160209004810192826200023e576000855562000289565b82601f106200025957805160ff191683800117855562000289565b8280016001018555821562000289579182015b82811115620002895782518255916020019190600101906200026c565b50620002979291506200029b565b5090565b5b808211156200029757600081556001016200029c565b600080600060608486031215620002c7578283fd5b8351602080860151919450906001600160a01b0381168114620002e8578384fd5b60408601519093506001600160401b038082111562000305578384fd5b818701915087601f83011262000319578384fd5b8151818111156200032e576200032e620003eb565b604051601f8201601f1916810185018381118282101715620003545762000354620003eb565b60405281815283820185018a10156200036b578586fd5b8592505b818310156200038e57838301850151818401860152918401916200036f565b818311156200039f57858583830101525b80955050505050509250925092565b600281046001821680620003c357607f821691505b60208210811415620003e557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613f1f80620004116000396000f3fe60806040526004361061038c5760003560e01c806373b2e80e116101dc578063b9ab969e11610102578063db8116b7116100a0578063f03255491161006f578063f032554914610979578063f093b9f01461098e578063f2fde38b146109ae578063f716aee9146109ce5761038c565b8063db8116b71461091a578063e6c0cb971461092f578063e985e9c514610944578063eb8d2444146109645761038c565b8063c720d250116100dc578063c720d250146108a5578063c87b56dd146108c5578063cd7ab12d146108e5578063d9b137b2146108fa5761038c565b8063b9ab969e14610866578063bf4702fc1461087b578063bf7b4a91146108905761038c565b806395d89b411161017a578063a79a2a2811610149578063a79a2a28146107f3578063b09904b514610813578063b0a896d814610833578063b88d4fde146108465761038c565b806395d89b411461079457806397b093d9146107a95780639c3e72bd146107be578063a22cb465146107d35761038c565b8063848d05cc116101b6578063848d05cc1461072a57806388d19f1b146107575780638da5cb5b1461076c57806392642744146107815761038c565b806373b2e80e146106bd5780637e00ce1b146106dd5780638462151c146106fd5761038c565b80633dbf4bd2116102c15780636352211e1161025f5780636eb9a8a21161022e5780636eb9a8a2146106555780636f6aed661461067557806370a0823114610688578063715018a6146106a85761038c565b80636352211e146105f85780636c0360eb146106185780636c08a64e1461062d5780636e8da4f1146106405761038c565b80634f6ccce71161029b5780634f6ccce7146105a357806355f804b3146105c35780635e83e709146105e35780635edf6127146104785761038c565b80633dbf4bd21461054357806342842e0e146105635780634dd2f20e146105835761038c565b806318160ddd1161032e5780632f745c59116103085780632f745c59146104e457806334918dfd146105045780633ccfd60b146105195780633d6a38441461052e5761038c565b806318160ddd1461049a5780631f0234d8146104af57806323b872dd146104c45761038c565b8063095ea7b31161036a578063095ea7b3146104165780630c1c885e14610438578063109695231461045857806315889383146104785761038c565b806301ffc9a71461039157806306fdde03146103c7578063081812fc146103e9575b600080fd5b34801561039d57600080fd5b506103b16103ac366004612fd8565b6109e3565b6040516103be91906133aa565b60405180910390f35b3480156103d357600080fd5b506103dc6109f6565b6040516103be91906133be565b3480156103f557600080fd5b50610409610404366004613043565b610a88565b6040516103be919061326c565b34801561042257600080fd5b50610436610431366004612f95565b610ad4565b005b34801561044457600080fd5b506103dc610453366004613043565b610b6c565b34801561046457600080fd5b50610436610473366004613010565b610c06565b34801561048457600080fd5b5061048d610c5c565b6040516103be91906133b5565b3480156104a657600080fd5b5061048d610c67565b3480156104bb57600080fd5b506103b1610c6d565b3480156104d057600080fd5b506104366104df366004612ea7565b610c7c565b3480156104f057600080fd5b5061048d6104ff366004612f95565b610cb4565b34801561051057600080fd5b50610436610d06565b34801561052557600080fd5b50610436610daa565b34801561053a57600080fd5b50610409610e2a565b34801561054f57600080fd5b506103dc61055e366004613043565b610e39565b34801561056f57600080fd5b5061043661057e366004612ea7565b610f68565b34801561058f57600080fd5b5061043661059e366004613043565b610f83565b3480156105af57600080fd5b5061048d6105be366004613043565b610fcf565b3480156105cf57600080fd5b506104366105de366004613010565b61102a565b3480156105ef57600080fd5b5061048d61107c565b34801561060457600080fd5b50610409610613366004613043565b611088565b34801561062457600080fd5b506103dc6110bd565b61043661063b36600461305b565b6110cc565b34801561064c57600080fd5b506103dc61125b565b34801561066157600080fd5b506103dc610670366004613043565b611268565b61043661068336600461310e565b611281565b34801561069457600080fd5b5061048d6106a3366004612e37565b6113f7565b3480156106b457600080fd5b5061043661143b565b3480156106c957600080fd5b506103b16106d8366004612e37565b611486565b3480156106e957600080fd5b506104366106f8366004612f95565b61149b565b34801561070957600080fd5b5061071d610718366004612e37565b611523565b6040516103be9190613366565b34801561073657600080fd5b5061074a610745366004612e37565b611675565b6040516103be9190613306565b34801561076357600080fd5b5061048d6118e2565b34801561077857600080fd5b506104096118e7565b61043661078f366004613043565b6118f6565b3480156107a057600080fd5b506103dc6119f4565b3480156107b557600080fd5b5061048d611a03565b3480156107ca57600080fd5b506103dc611a09565b3480156107df57600080fd5b506104366107ee366004612f64565b611a16565b3480156107ff57600080fd5b506103b161080e36600461305b565b611ae4565b34801561081f57600080fd5b5061043661082e366004613010565b611b27565b61043661084136600461310e565b611b9c565b34801561085257600080fd5b50610436610861366004612ee7565b611d7d565b34801561087257600080fd5b5061048d611dbc565b34801561088757600080fd5b50610436611dc2565b34801561089c57600080fd5b5061048d611e3f565b3480156108b157600080fd5b506104366108c0366004612e37565b611e44565b3480156108d157600080fd5b506103dc6108e0366004613043565b611ece565b3480156108f157600080fd5b5061048d611f51565b34801561090657600080fd5b506103dc610915366004613043565b611f57565b34801561092657600080fd5b506103dc611ff5565b34801561093b57600080fd5b5061048d612002565b34801561095057600080fd5b506103b161095f366004612e6f565b61200d565b34801561097057600080fd5b506103b161203b565b34801561098557600080fd5b50610436612049565b34801561099a57600080fd5b506103dc6109a9366004613043565b6120de565b3480156109ba57600080fd5b506104366109c9366004612e37565b612188565b3480156109da57600080fd5b5061048d6121f6565b60006109ee826121fc565b90505b919050565b606060008054610a0590613e18565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3190613e18565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b5050505050905090565b6000610a9382612221565b610ab85760405162461bcd60e51b8152600401610aaf90613944565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610adf82611088565b9050806001600160a01b0316836001600160a01b03161415610b135760405162461bcd60e51b8152600401610aaf90613a94565b806001600160a01b0316610b2561223e565b6001600160a01b03161480610b415750610b418161095f61223e565b610b5d5760405162461bcd60e51b8152600401610aaf90613755565b610b678383612242565b505050565b60116020526000908152604090208054610b8590613e18565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb190613e18565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b505050505081565b610c0e61223e565b6001600160a01b0316610c1f6118e7565b6001600160a01b031614610c455760405162461bcd60e51b8152600401610aaf90613990565b8051610c5890600c906020840190612d27565b5050565b662386f26fc1000081565b60085490565b600e5462010000900460ff1681565b610c8d610c8761223e565b826122b0565b610ca95760405162461bcd60e51b8152600401610aaf90613c00565b610b6783838361232d565b6000610cbf836113f7565b8210610cdd5760405162461bcd60e51b8152600401610aaf90613489565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d0e61223e565b6001600160a01b0316610d1f6118e7565b6001600160a01b031614610d455760405162461bcd60e51b8152600401610aaf90613990565b600e805461ff001981166101009182900460ff9081161583029190911762ff00001916928390556040517ffbb40851eb35224712cb4557f304642557d40cd3339d1bfaf7249d1cc4ba602693610da0939004909116906133aa565b60405180910390a1565b610db261223e565b6001600160a01b0316610dc36118e7565b6001600160a01b031614610de95760405162461bcd60e51b8152600401610aaf90613990565b47610df26118e7565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610c58573d6000803e3d6000fd5b6013546001600160a01b031681565b6060306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7457600080fd5b505afa158015610e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eac9190612fc0565b8210610eca5760405162461bcd60e51b8152600401610aaf90613ad5565b60008281526010602052604090208054610ee390613e18565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f90613e18565b8015610f5c5780601f10610f3157610100808354040283529160200191610f5c565b820191906000526020600020905b815481529060010190602001808311610f3f57829003601f168201915b50505050509050919050565b610b6783838360405180602001604052806000815250611d7d565b610f8b61223e565b6001600160a01b0316610f9c6118e7565b6001600160a01b031614610fc25760405162461bcd60e51b8152600401610aaf90613990565b610fcc338261149b565b50565b6000610fd9610c67565b8210610ff75760405162461bcd60e51b8152600401610aaf90613c51565b6008828154811061101857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b61103261223e565b6001600160a01b03166110436118e7565b6001600160a01b0316146110695760405162461bcd60e51b8152600401610aaf90613990565b8051610c5890600d906020840190612d27565b67011c37937e08000081565b6000818152600260205260408120546001600160a01b0316806109ee5760405162461bcd60e51b8152600401610aaf906137fc565b60606110c761245a565b905090565b600e5462010000900460ff166110f45760405162461bcd60e51b8152600401610aaf906135a3565b6110fe8282611ae4565b61111a5760405162461bcd60e51b8152600401610aaf906135eb565b3360009081526012602052604090205460ff161561114a5760405162461bcd60e51b8152600401610aaf90613a5d565b6000821161116a5760405162461bcd60e51b8152600401610aaf90613889565b60006015541161118c5760405162461bcd60e51b8152600401610aaf90613845565b60008260155461119c9190613dd5565b10156111ba5760405162461bcd60e51b8152600401610aaf90613b57565b6111cb66b1a2bc2ec5000083613db6565b3410156111ea5760405162461bcd60e51b8152600401610aaf90613902565b336000908152601260205260409020805460ff19166001179055601554611212908390613dd5565b60155561121e82612469565b7f8b40ac8053427a2f3a4193659def04afceb931b2c1456dd053a4b82259e91ece338360405161124f9291906132bd565b60405180910390a15050565b600c8054610b8590613e18565b60106020526000908152604090208054610b8590613e18565b3361128b83611088565b6001600160a01b0316146112b15760405162461bcd60e51b8152600401610aaf90613cd4565b662386f26fc100003410156112d85760405162461bcd60e51b8152600401610aaf90613902565b6000828152601060205260409081902090516002916112f6916131cb565b602060405180830381855afa158015611313573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906113369190612fc0565b60028260405161134691906131af565b602060405180830381855afa158015611363573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906113869190612fc0565b14156113a45760405162461bcd60e51b8152600401610aaf90613452565b600082815260106020908152604090912082516113c392840190612d27565b507fa45e025af0c21e1fbb00b2bfa282184451fbd1d18e538dd2562bebc44e0917a733838360405161124f939291906132d6565b60006001600160a01b03821661141f5760405162461bcd60e51b8152600401610aaf906137b2565b506001600160a01b031660009081526003602052604090205490565b61144361223e565b6001600160a01b03166114546118e7565b6001600160a01b03161461147a5760405162461bcd60e51b8152600401610aaf90613990565b61148460006124ce565b565b60126020526000908152604090205460ff1681565b6114a361223e565b6001600160a01b03166114b46118e7565b6001600160a01b0316146114da5760405162461bcd60e51b8152600401610aaf90613990565b6000811180156114ec57506014548111155b6115085760405162461bcd60e51b8152600401610aaf90613622565b806014546115169190613dd5565b601455610c588282612520565b6040516370a0823160e01b815260609060009030906370a082319061154c90869060040161326c565b60206040518083038186803b15801561156457600080fd5b505afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190612fc0565b9050806115be5760408051600080825260208201909252905b509150506109f1565b60008167ffffffffffffffff8111156115e757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611610578160200160208202803683370190505b50905060005b82811015611665576116288582610cb4565b82828151811061164857634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061165d81613e4d565b915050611616565b5091506109f19050565b50919050565b6040516370a0823160e01b815260609060009030906370a082319061169e90869060040161326c565b60206040518083038186803b1580156116b657600080fd5b505afa1580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee9190612fc0565b9050806117285760408051600080825260208201909252906115b5565b606081526020019060019003908161170b579050509150506109f1565b60008167ffffffffffffffff81111561175157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561178457816020015b606081526020019060019003908161176f5790505b50905060005b8281101561166557604051632f745c5960e01b81526010906000903090632f745c59906117bd908a9087906004016132bd565b60206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180d9190612fc0565b8152602001908152602001600020805461182690613e18565b80601f016020809104026020016040519081016040528092919081815260200182805461185290613e18565b801561189f5780601f106118745761010080835404028352916020019161189f565b820191906000526020600020905b81548152906001019060200180831161188257829003601f168201915b50505050508282815181106118c457634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806118da90613e4d565b91505061178a565b605081565b600a546001600160a01b031690565b600e54610100900460ff1661191d5760405162461bcd60e51b8152600401610aaf90613bbe565b60008111801561192e5750600a8111155b61194a5760405162461bcd60e51b8152600401610aaf90613b0c565b61138881611956610c67565b6119609190613d8a565b111561197e5760405162461bcd60e51b8152600401610aaf90613d16565b6119908167011c37937e080000613db6565b3410156119af5760405162461bcd60e51b8152600401610aaf90613902565b6119b881612469565b7f1f89f147a58d1673945cf416187db98efc8208408c011b91887acd59fd8523c333826040516119e99291906132bd565b60405180910390a150565b606060018054610a0590613e18565b60155481565b600b8054610b8590613e18565b611a1e61223e565b6001600160a01b0316826001600160a01b03161415611a4f5760405162461bcd60e51b8152600401610aaf9061369d565b8060056000611a5c61223e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611aa061223e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ad891906133aa565b60405180910390a35050565b6000803384604051602001611afa92919061317f565b604051602081830303815290604052805190602001209050611b1f83600f5483612565565b949350505050565b611b2f61223e565b6001600160a01b0316611b406118e7565b6001600160a01b031614611b665760405162461bcd60e51b8152600401610aaf90613990565b600e5460ff1615611b895760405162461bcd60e51b8152600401610aaf90613b8e565b8051610c5890600b906020840190612d27565b6040516331a9108f60e11b815233903090636352211e90611bc19086906004016133b5565b60206040518083038186803b158015611bd957600080fd5b505afa158015611bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c119190612e53565b6001600160a01b031614611c375760405162461bcd60e51b8152600401610aaf90613cd4565b662386f26fc10000341015611c5e5760405162461bcd60e51b8152600401610aaf90613902565b600082815260116020526040908190209051600291611c7c916131cb565b602060405180830381855afa158015611c99573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611cbc9190612fc0565b600282604051611ccc91906131af565b602060405180830381855afa158015611ce9573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611d0c9190612fc0565b1415611d2a5760405162461bcd60e51b8152600401610aaf90613720565b60008281526011602090815260409091208251611d4992840190612d27565b507f5885beb44c1c92815db9549bda45031b6b5a6b0490b353b7864b8be3ccb881b133838360405161124f939291906132d6565b611d8e611d8861223e565b836122b0565b611daa5760405162461bcd60e51b8152600401610aaf90613c00565b611db684848484612620565b50505050565b60145481565b611dca61223e565b6001600160a01b0316611ddb6118e7565b6001600160a01b031614611e015760405162461bcd60e51b8152600401610aaf90613990565b600e805460ff191660011790556040517ff67803ad52be3f7acbff52a8602870fd96783425ff14d3bf473cd9f995df264890610da090600b906133d1565b600a81565b611e4c61223e565b6001600160a01b0316611e5d6118e7565b6001600160a01b031614611e835760405162461bcd60e51b8152600401610aaf90613990565b601380546001600160a01b0319166001600160a01b0383161790556040517f4662d2dd75dea44a29182d07d4f1a93028619cf8f8f9629e190dfd0d7ba27e96906119e990839061326c565b6060611ed982612221565b611ef55760405162461bcd60e51b8152600401610aaf90613a0e565b6000611eff61245a565b90506000815111611f1f5760405180602001604052806000815250611f4a565b80611f2984612653565b604051602001611f3a92919061323a565b6040516020818303038152906040525b9392505050565b61138881565b6060306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9257600080fd5b505afa158015611fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fca9190612fc0565b8210611fe85760405162461bcd60e51b8152600401610aaf90613ad5565b600b8054610ee390613e18565b600d8054610b8590613e18565b66b1a2bc2ec5000081565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600e54610100900460ff1681565b61205161223e565b6001600160a01b03166120626118e7565b6001600160a01b0316146120885760405162461bcd60e51b8152600401610aaf90613990565b600e805460ff62010000808304821615810262ff00001990931692909217928390556040517f6e3cbed9f4f7973106014bef20c1bf1510381f09ecabd6966ef1242aafafd15f93610da0939004909116906133aa565b6060306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561211957600080fd5b505afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190612fc0565b821061216f5760405162461bcd60e51b8152600401610aaf90613ad5565b60008281526011602052604090208054610ee390613e18565b61219061223e565b6001600160a01b03166121a16118e7565b6001600160a01b0316146121c75760405162461bcd60e51b8152600401610aaf90613990565b6001600160a01b0381166121ed5760405162461bcd60e51b8152600401610aaf90613526565b610fcc816124ce565b600f5481565b60006001600160e01b0319821663780e9d6360e01b14806109ee57506109ee8261276e565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061227782611088565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122bb82612221565b6122d75760405162461bcd60e51b8152600401610aaf906136d4565b60006122e283611088565b9050806001600160a01b0316846001600160a01b0316148061231d5750836001600160a01b031661231284610a88565b6001600160a01b0316145b80611b1f5750611b1f818561200d565b826001600160a01b031661234082611088565b6001600160a01b0316146123665760405162461bcd60e51b8152600401610aaf906139c5565b6001600160a01b03821661238c5760405162461bcd60e51b8152600401610aaf90613659565b6123978383836127ae565b6123a2600082612242565b6001600160a01b03831660009081526003602052604081208054600192906123cb908490613dd5565b90915550506001600160a01b03821660009081526003602052604081208054600192906123f9908490613d8a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060600d8054610a0590613e18565b60006050612478606434613da2565b6124829190613db6565b905061248d816127b9565b7f3f627395537a084d4e98fa7069e363917d6429096bfef49e877b88da4e5cf08a816040516124bc91906133b5565b60405180910390a1610c583383612520565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b81811015610b67576000612535610c67565b9050611388612542610c67565b101561255257612552848261283a565b508061255d81613e4d565b915050612523565b600081815b855181101561261557600086828151811061259557634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116125d65782816040516020016125b99291906131a1565b604051602081830303815290604052805190602001209250612602565b80836040516020016125e99291906131a1565b6040516020818303038152906040528051906020012092505b508061260d81613e4d565b91505061256a565b509092149392505050565b61262b84848461232d565b61263784848484612854565b611db65760405162461bcd60e51b8152600401610aaf906134d4565b60608161267857506040805180820190915260018152600360fc1b60208201526109f1565b8160005b81156126a2578061268c81613e4d565b915061269b9050600a83613da2565b915061267c565b60008167ffffffffffffffff8111156126cb57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126f5576020820181803683370190505b5090505b8415611b1f5761270a600183613dd5565b9150612717600a86613e68565b612722906030613d8a565b60f81b81838151811061274557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612767600a86613da2565b94506126f9565b60006001600160e01b031982166380ac58cd60e01b148061279f57506001600160e01b03198216635b5e139f60e01b145b806109ee57506109ee8261296f565b610b67838383612988565b6013546040516000916001600160a01b03169083906127d790613269565b60006040518083038185875af1925050503d8060008114612814576040519150601f19603f3d011682016040523d82523d6000602084013e612819565b606091505b5050905080610c585760405162461bcd60e51b8152600401610aaf90613c9d565b610c58828260405180602001604052806000815250612a11565b6000612868846001600160a01b0316612a44565b1561296457836001600160a01b031663150b7a0261288461223e565b8786866040518563ffffffff1660e01b81526004016128a69493929190613280565b602060405180830381600087803b1580156128c057600080fd5b505af19250505080156128f0575060408051601f3d908101601f191682019092526128ed91810190612ff4565b60015b61294a573d80801561291e576040519150601f19603f3d011682016040523d82523d6000602084013e612923565b606091505b5080516129425760405162461bcd60e51b8152600401610aaf906134d4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b1f565b506001949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b612993838383610b67565b6001600160a01b0383166129af576129aa81612a4a565b6129d2565b816001600160a01b0316836001600160a01b0316146129d2576129d28382612a8e565b6001600160a01b0382166129ee576129e981612b2b565b610b67565b826001600160a01b0316826001600160a01b031614610b6757610b678282612c04565b612a1b8383612c48565b612a286000848484612854565b610b675760405162461bcd60e51b8152600401610aaf906134d4565b3b151590565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612a9b846113f7565b612aa59190613dd5565b600083815260076020526040902054909150808214612af8576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612b3d90600190613dd5565b60008381526009602052604081205460088054939450909284908110612b7357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612ba257634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612be857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612c0f836113f7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612c6e5760405162461bcd60e51b8152600401610aaf906138cd565b612c7781612221565b15612c945760405162461bcd60e51b8152600401610aaf9061356c565b612ca0600083836127ae565b6001600160a01b0382166000908152600360205260408120805460019290612cc9908490613d8a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612d3390613e18565b90600052602060002090601f016020900481019282612d555760008555612d9b565b82601f10612d6e57805160ff1916838001178555612d9b565b82800160010185558215612d9b579182015b82811115612d9b578251825591602001919060010190612d80565b50612da7929150612dab565b5090565b5b80821115612da75760008155600101612dac565b600067ffffffffffffffff831115612dda57612dda613ea8565b612ded601f8401601f1916602001613d60565b9050828152838383011115612e0157600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e28578081fd5b611f4a83833560208501612dc0565b600060208284031215612e48578081fd5b8135611f4a81613ebe565b600060208284031215612e64578081fd5b8151611f4a81613ebe565b60008060408385031215612e81578081fd5b8235612e8c81613ebe565b91506020830135612e9c81613ebe565b809150509250929050565b600080600060608486031215612ebb578081fd5b8335612ec681613ebe565b92506020840135612ed681613ebe565b929592945050506040919091013590565b60008060008060808587031215612efc578081fd5b8435612f0781613ebe565b93506020850135612f1781613ebe565b925060408501359150606085013567ffffffffffffffff811115612f39578182fd5b8501601f81018713612f49578182fd5b612f5887823560208401612dc0565b91505092959194509250565b60008060408385031215612f76578182fd5b8235612f8181613ebe565b915060208301358015158114612e9c578182fd5b60008060408385031215612fa7578182fd5b8235612fb281613ebe565b946020939093013593505050565b600060208284031215612fd1578081fd5b5051919050565b600060208284031215612fe9578081fd5b8135611f4a81613ed3565b600060208284031215613005578081fd5b8151611f4a81613ed3565b600060208284031215613021578081fd5b813567ffffffffffffffff811115613037578182fd5b611b1f84828501612e18565b600060208284031215613054578081fd5b5035919050565b6000806040838503121561306d578182fd5b8235915060208084013567ffffffffffffffff8082111561308c578384fd5b818601915086601f83011261309f578384fd5b8135818111156130b1576130b1613ea8565b83810291506130c1848301613d60565b8181528481019084860184860187018b10156130db578788fd5b8795505b838610156130fd5780358352600195909501949186019186016130df565b508096505050505050509250929050565b60008060408385031215613120578182fd5b82359150602083013567ffffffffffffffff81111561313d578182fd5b61314985828601612e18565b9150509250929050565b6000815180845261316b816020860160208601613dec565b601f01601f19169290920160200192915050565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b918252602082015260400190565b600082516131c1818460208701613dec565b9190910192915050565b60008083546131d981613e18565b600182811680156131f157600181146132025761322e565b60ff1984168752828701945061322e565b8786526020808720875b858110156132255781548a82015290840190820161320c565b50505082870194505b50929695505050505050565b6000835161324c818460208801613dec565b835190830190613260818360208801613dec565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132b390830184613153565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b0385168252836020830152606060408301526132fd6060830184613153565b95945050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561335957603f19888603018452613347858351613153565b9450928501929085019060010161332b565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561339e57835183529284019291840191600101613382565b50909695505050505050565b901515815260200190565b90815260200190565b600060208252611f4a6020830184613153565b600060208083528184546133e481613e18565b80848701526040600180841660008114613405576001811461341957613444565b60ff19851689840152606089019550613444565b898852868820885b8581101561343c5781548b8201860152908301908801613421565b8a0184019650505b509398975050505050505050565b6020808252601f908201527f4e6577206e616d652069732073616d652061732063757272656e74206f6e6500604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526028908201527f50726573616c65206d7573742062652061637469766520746f20726573657276604082015267652043726f6f6b7360c01b606082015260800190565b60208082526019908201527f596f752068617665206e6f2070726573616c6520636c61696d00000000000000604082015260600190565b6020808252601e908201527f547279696e6720746f20636c61696d20696c6c6567616c20616d6f756e740000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4e6577207363656e652069732073616d652061732063757272656e74206f6e65604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526024908201527f416c6c2070726573616c652043726f6f6b732068617665206265656e20636c616040820152631a5b595960e21b606082015260800190565b60208082526024908201527f596f75206e65656420746f20636c61696d206d6f7265207468616e20302043726040820152636f6f6b7360e01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526022908201527f45746865722076616c75652073656e74206973206e6f742073756666696369656040820152611b9d60f21b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526018908201527f596f75206861766520616c726561647920636c61696d65640000000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601b908201527f43686f6f736520612063726f6f6b2077697468696e2072616e67650000000000604082015260600190565b6020808252602b908201527f596f752063616e206f6e6c79206d696e742031302063726f6f6b73207065722060408201526a3a3930b739b0b1ba34b7b760a91b606082015260800190565b6020808252601e908201527f4e6f7420656e6f7567682070726573616c652043726f6f6b73206c6566740000604082015260600190565b602080825260169082015275131a58d95b9cd948185b1c9958591e481b1bd8dad95960521b604082015260600190565b60208082526022908201527f53616c65206d7573742062652061637469766520746f206d696e742043726f6f6040820152616b7360f01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526017908201527f4661696c656420746f20666f72776172642066756e6473000000000000000000604082015260600190565b60208082526022908201527f596f75722077616c6c657420646f65736e2774206f776e20746869732063726f6040820152616f6b60f01b606082015260800190565b6020808252602a908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015269206f662043726f6f6b7360b01b606082015260800190565b60405181810167ffffffffffffffff81118282101715613d8257613d82613ea8565b604052919050565b60008219821115613d9d57613d9d613e7c565b500190565b600082613db157613db1613e92565b500490565b6000816000190483118215151615613dd057613dd0613e7c565b500290565b600082821015613de757613de7613e7c565b500390565b60005b83811015613e07578181015183820152602001613def565b83811115611db65750506000910152565b600281046001821680613e2c57607f821691505b6020821081141561166f57634e487b7160e01b600052602260045260246000fd5b6000600019821415613e6157613e61613e7c565b5060010190565b600082613e7757613e77613e92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610fcc57600080fd5b6001600160e01b031981168114610fcc57600080fdfea2646970667358221220893c493c5c154e734617d6f17af6425a5b29a4e7de888fbae7ce041949bd882a64736f6c63430008000033f9b5a6c94120767bee0c143fc3342d974d577d3ebf3542daa9c1cffe681ef97700000000000000000000000054bc506b4eb3570522c062539b35e5b61853abec0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f7777772e63727970746f63726f6f6b732e696f2f6170692f

Deployed Bytecode

0x60806040526004361061038c5760003560e01c806373b2e80e116101dc578063b9ab969e11610102578063db8116b7116100a0578063f03255491161006f578063f032554914610979578063f093b9f01461098e578063f2fde38b146109ae578063f716aee9146109ce5761038c565b8063db8116b71461091a578063e6c0cb971461092f578063e985e9c514610944578063eb8d2444146109645761038c565b8063c720d250116100dc578063c720d250146108a5578063c87b56dd146108c5578063cd7ab12d146108e5578063d9b137b2146108fa5761038c565b8063b9ab969e14610866578063bf4702fc1461087b578063bf7b4a91146108905761038c565b806395d89b411161017a578063a79a2a2811610149578063a79a2a28146107f3578063b09904b514610813578063b0a896d814610833578063b88d4fde146108465761038c565b806395d89b411461079457806397b093d9146107a95780639c3e72bd146107be578063a22cb465146107d35761038c565b8063848d05cc116101b6578063848d05cc1461072a57806388d19f1b146107575780638da5cb5b1461076c57806392642744146107815761038c565b806373b2e80e146106bd5780637e00ce1b146106dd5780638462151c146106fd5761038c565b80633dbf4bd2116102c15780636352211e1161025f5780636eb9a8a21161022e5780636eb9a8a2146106555780636f6aed661461067557806370a0823114610688578063715018a6146106a85761038c565b80636352211e146105f85780636c0360eb146106185780636c08a64e1461062d5780636e8da4f1146106405761038c565b80634f6ccce71161029b5780634f6ccce7146105a357806355f804b3146105c35780635e83e709146105e35780635edf6127146104785761038c565b80633dbf4bd21461054357806342842e0e146105635780634dd2f20e146105835761038c565b806318160ddd1161032e5780632f745c59116103085780632f745c59146104e457806334918dfd146105045780633ccfd60b146105195780633d6a38441461052e5761038c565b806318160ddd1461049a5780631f0234d8146104af57806323b872dd146104c45761038c565b8063095ea7b31161036a578063095ea7b3146104165780630c1c885e14610438578063109695231461045857806315889383146104785761038c565b806301ffc9a71461039157806306fdde03146103c7578063081812fc146103e9575b600080fd5b34801561039d57600080fd5b506103b16103ac366004612fd8565b6109e3565b6040516103be91906133aa565b60405180910390f35b3480156103d357600080fd5b506103dc6109f6565b6040516103be91906133be565b3480156103f557600080fd5b50610409610404366004613043565b610a88565b6040516103be919061326c565b34801561042257600080fd5b50610436610431366004612f95565b610ad4565b005b34801561044457600080fd5b506103dc610453366004613043565b610b6c565b34801561046457600080fd5b50610436610473366004613010565b610c06565b34801561048457600080fd5b5061048d610c5c565b6040516103be91906133b5565b3480156104a657600080fd5b5061048d610c67565b3480156104bb57600080fd5b506103b1610c6d565b3480156104d057600080fd5b506104366104df366004612ea7565b610c7c565b3480156104f057600080fd5b5061048d6104ff366004612f95565b610cb4565b34801561051057600080fd5b50610436610d06565b34801561052557600080fd5b50610436610daa565b34801561053a57600080fd5b50610409610e2a565b34801561054f57600080fd5b506103dc61055e366004613043565b610e39565b34801561056f57600080fd5b5061043661057e366004612ea7565b610f68565b34801561058f57600080fd5b5061043661059e366004613043565b610f83565b3480156105af57600080fd5b5061048d6105be366004613043565b610fcf565b3480156105cf57600080fd5b506104366105de366004613010565b61102a565b3480156105ef57600080fd5b5061048d61107c565b34801561060457600080fd5b50610409610613366004613043565b611088565b34801561062457600080fd5b506103dc6110bd565b61043661063b36600461305b565b6110cc565b34801561064c57600080fd5b506103dc61125b565b34801561066157600080fd5b506103dc610670366004613043565b611268565b61043661068336600461310e565b611281565b34801561069457600080fd5b5061048d6106a3366004612e37565b6113f7565b3480156106b457600080fd5b5061043661143b565b3480156106c957600080fd5b506103b16106d8366004612e37565b611486565b3480156106e957600080fd5b506104366106f8366004612f95565b61149b565b34801561070957600080fd5b5061071d610718366004612e37565b611523565b6040516103be9190613366565b34801561073657600080fd5b5061074a610745366004612e37565b611675565b6040516103be9190613306565b34801561076357600080fd5b5061048d6118e2565b34801561077857600080fd5b506104096118e7565b61043661078f366004613043565b6118f6565b3480156107a057600080fd5b506103dc6119f4565b3480156107b557600080fd5b5061048d611a03565b3480156107ca57600080fd5b506103dc611a09565b3480156107df57600080fd5b506104366107ee366004612f64565b611a16565b3480156107ff57600080fd5b506103b161080e36600461305b565b611ae4565b34801561081f57600080fd5b5061043661082e366004613010565b611b27565b61043661084136600461310e565b611b9c565b34801561085257600080fd5b50610436610861366004612ee7565b611d7d565b34801561087257600080fd5b5061048d611dbc565b34801561088757600080fd5b50610436611dc2565b34801561089c57600080fd5b5061048d611e3f565b3480156108b157600080fd5b506104366108c0366004612e37565b611e44565b3480156108d157600080fd5b506103dc6108e0366004613043565b611ece565b3480156108f157600080fd5b5061048d611f51565b34801561090657600080fd5b506103dc610915366004613043565b611f57565b34801561092657600080fd5b506103dc611ff5565b34801561093b57600080fd5b5061048d612002565b34801561095057600080fd5b506103b161095f366004612e6f565b61200d565b34801561097057600080fd5b506103b161203b565b34801561098557600080fd5b50610436612049565b34801561099a57600080fd5b506103dc6109a9366004613043565b6120de565b3480156109ba57600080fd5b506104366109c9366004612e37565b612188565b3480156109da57600080fd5b5061048d6121f6565b60006109ee826121fc565b90505b919050565b606060008054610a0590613e18565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3190613e18565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b5050505050905090565b6000610a9382612221565b610ab85760405162461bcd60e51b8152600401610aaf90613944565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610adf82611088565b9050806001600160a01b0316836001600160a01b03161415610b135760405162461bcd60e51b8152600401610aaf90613a94565b806001600160a01b0316610b2561223e565b6001600160a01b03161480610b415750610b418161095f61223e565b610b5d5760405162461bcd60e51b8152600401610aaf90613755565b610b678383612242565b505050565b60116020526000908152604090208054610b8590613e18565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb190613e18565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b505050505081565b610c0e61223e565b6001600160a01b0316610c1f6118e7565b6001600160a01b031614610c455760405162461bcd60e51b8152600401610aaf90613990565b8051610c5890600c906020840190612d27565b5050565b662386f26fc1000081565b60085490565b600e5462010000900460ff1681565b610c8d610c8761223e565b826122b0565b610ca95760405162461bcd60e51b8152600401610aaf90613c00565b610b6783838361232d565b6000610cbf836113f7565b8210610cdd5760405162461bcd60e51b8152600401610aaf90613489565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d0e61223e565b6001600160a01b0316610d1f6118e7565b6001600160a01b031614610d455760405162461bcd60e51b8152600401610aaf90613990565b600e805461ff001981166101009182900460ff9081161583029190911762ff00001916928390556040517ffbb40851eb35224712cb4557f304642557d40cd3339d1bfaf7249d1cc4ba602693610da0939004909116906133aa565b60405180910390a1565b610db261223e565b6001600160a01b0316610dc36118e7565b6001600160a01b031614610de95760405162461bcd60e51b8152600401610aaf90613990565b47610df26118e7565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610c58573d6000803e3d6000fd5b6013546001600160a01b031681565b6060306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7457600080fd5b505afa158015610e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eac9190612fc0565b8210610eca5760405162461bcd60e51b8152600401610aaf90613ad5565b60008281526010602052604090208054610ee390613e18565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f90613e18565b8015610f5c5780601f10610f3157610100808354040283529160200191610f5c565b820191906000526020600020905b815481529060010190602001808311610f3f57829003601f168201915b50505050509050919050565b610b6783838360405180602001604052806000815250611d7d565b610f8b61223e565b6001600160a01b0316610f9c6118e7565b6001600160a01b031614610fc25760405162461bcd60e51b8152600401610aaf90613990565b610fcc338261149b565b50565b6000610fd9610c67565b8210610ff75760405162461bcd60e51b8152600401610aaf90613c51565b6008828154811061101857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b61103261223e565b6001600160a01b03166110436118e7565b6001600160a01b0316146110695760405162461bcd60e51b8152600401610aaf90613990565b8051610c5890600d906020840190612d27565b67011c37937e08000081565b6000818152600260205260408120546001600160a01b0316806109ee5760405162461bcd60e51b8152600401610aaf906137fc565b60606110c761245a565b905090565b600e5462010000900460ff166110f45760405162461bcd60e51b8152600401610aaf906135a3565b6110fe8282611ae4565b61111a5760405162461bcd60e51b8152600401610aaf906135eb565b3360009081526012602052604090205460ff161561114a5760405162461bcd60e51b8152600401610aaf90613a5d565b6000821161116a5760405162461bcd60e51b8152600401610aaf90613889565b60006015541161118c5760405162461bcd60e51b8152600401610aaf90613845565b60008260155461119c9190613dd5565b10156111ba5760405162461bcd60e51b8152600401610aaf90613b57565b6111cb66b1a2bc2ec5000083613db6565b3410156111ea5760405162461bcd60e51b8152600401610aaf90613902565b336000908152601260205260409020805460ff19166001179055601554611212908390613dd5565b60155561121e82612469565b7f8b40ac8053427a2f3a4193659def04afceb931b2c1456dd053a4b82259e91ece338360405161124f9291906132bd565b60405180910390a15050565b600c8054610b8590613e18565b60106020526000908152604090208054610b8590613e18565b3361128b83611088565b6001600160a01b0316146112b15760405162461bcd60e51b8152600401610aaf90613cd4565b662386f26fc100003410156112d85760405162461bcd60e51b8152600401610aaf90613902565b6000828152601060205260409081902090516002916112f6916131cb565b602060405180830381855afa158015611313573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906113369190612fc0565b60028260405161134691906131af565b602060405180830381855afa158015611363573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906113869190612fc0565b14156113a45760405162461bcd60e51b8152600401610aaf90613452565b600082815260106020908152604090912082516113c392840190612d27565b507fa45e025af0c21e1fbb00b2bfa282184451fbd1d18e538dd2562bebc44e0917a733838360405161124f939291906132d6565b60006001600160a01b03821661141f5760405162461bcd60e51b8152600401610aaf906137b2565b506001600160a01b031660009081526003602052604090205490565b61144361223e565b6001600160a01b03166114546118e7565b6001600160a01b03161461147a5760405162461bcd60e51b8152600401610aaf90613990565b61148460006124ce565b565b60126020526000908152604090205460ff1681565b6114a361223e565b6001600160a01b03166114b46118e7565b6001600160a01b0316146114da5760405162461bcd60e51b8152600401610aaf90613990565b6000811180156114ec57506014548111155b6115085760405162461bcd60e51b8152600401610aaf90613622565b806014546115169190613dd5565b601455610c588282612520565b6040516370a0823160e01b815260609060009030906370a082319061154c90869060040161326c565b60206040518083038186803b15801561156457600080fd5b505afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190612fc0565b9050806115be5760408051600080825260208201909252905b509150506109f1565b60008167ffffffffffffffff8111156115e757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611610578160200160208202803683370190505b50905060005b82811015611665576116288582610cb4565b82828151811061164857634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061165d81613e4d565b915050611616565b5091506109f19050565b50919050565b6040516370a0823160e01b815260609060009030906370a082319061169e90869060040161326c565b60206040518083038186803b1580156116b657600080fd5b505afa1580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee9190612fc0565b9050806117285760408051600080825260208201909252906115b5565b606081526020019060019003908161170b579050509150506109f1565b60008167ffffffffffffffff81111561175157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561178457816020015b606081526020019060019003908161176f5790505b50905060005b8281101561166557604051632f745c5960e01b81526010906000903090632f745c59906117bd908a9087906004016132bd565b60206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180d9190612fc0565b8152602001908152602001600020805461182690613e18565b80601f016020809104026020016040519081016040528092919081815260200182805461185290613e18565b801561189f5780601f106118745761010080835404028352916020019161189f565b820191906000526020600020905b81548152906001019060200180831161188257829003601f168201915b50505050508282815181106118c457634e487b7160e01b600052603260045260246000fd5b602002602001018190525080806118da90613e4d565b91505061178a565b605081565b600a546001600160a01b031690565b600e54610100900460ff1661191d5760405162461bcd60e51b8152600401610aaf90613bbe565b60008111801561192e5750600a8111155b61194a5760405162461bcd60e51b8152600401610aaf90613b0c565b61138881611956610c67565b6119609190613d8a565b111561197e5760405162461bcd60e51b8152600401610aaf90613d16565b6119908167011c37937e080000613db6565b3410156119af5760405162461bcd60e51b8152600401610aaf90613902565b6119b881612469565b7f1f89f147a58d1673945cf416187db98efc8208408c011b91887acd59fd8523c333826040516119e99291906132bd565b60405180910390a150565b606060018054610a0590613e18565b60155481565b600b8054610b8590613e18565b611a1e61223e565b6001600160a01b0316826001600160a01b03161415611a4f5760405162461bcd60e51b8152600401610aaf9061369d565b8060056000611a5c61223e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611aa061223e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ad891906133aa565b60405180910390a35050565b6000803384604051602001611afa92919061317f565b604051602081830303815290604052805190602001209050611b1f83600f5483612565565b949350505050565b611b2f61223e565b6001600160a01b0316611b406118e7565b6001600160a01b031614611b665760405162461bcd60e51b8152600401610aaf90613990565b600e5460ff1615611b895760405162461bcd60e51b8152600401610aaf90613b8e565b8051610c5890600b906020840190612d27565b6040516331a9108f60e11b815233903090636352211e90611bc19086906004016133b5565b60206040518083038186803b158015611bd957600080fd5b505afa158015611bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c119190612e53565b6001600160a01b031614611c375760405162461bcd60e51b8152600401610aaf90613cd4565b662386f26fc10000341015611c5e5760405162461bcd60e51b8152600401610aaf90613902565b600082815260116020526040908190209051600291611c7c916131cb565b602060405180830381855afa158015611c99573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611cbc9190612fc0565b600282604051611ccc91906131af565b602060405180830381855afa158015611ce9573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611d0c9190612fc0565b1415611d2a5760405162461bcd60e51b8152600401610aaf90613720565b60008281526011602090815260409091208251611d4992840190612d27565b507f5885beb44c1c92815db9549bda45031b6b5a6b0490b353b7864b8be3ccb881b133838360405161124f939291906132d6565b611d8e611d8861223e565b836122b0565b611daa5760405162461bcd60e51b8152600401610aaf90613c00565b611db684848484612620565b50505050565b60145481565b611dca61223e565b6001600160a01b0316611ddb6118e7565b6001600160a01b031614611e015760405162461bcd60e51b8152600401610aaf90613990565b600e805460ff191660011790556040517ff67803ad52be3f7acbff52a8602870fd96783425ff14d3bf473cd9f995df264890610da090600b906133d1565b600a81565b611e4c61223e565b6001600160a01b0316611e5d6118e7565b6001600160a01b031614611e835760405162461bcd60e51b8152600401610aaf90613990565b601380546001600160a01b0319166001600160a01b0383161790556040517f4662d2dd75dea44a29182d07d4f1a93028619cf8f8f9629e190dfd0d7ba27e96906119e990839061326c565b6060611ed982612221565b611ef55760405162461bcd60e51b8152600401610aaf90613a0e565b6000611eff61245a565b90506000815111611f1f5760405180602001604052806000815250611f4a565b80611f2984612653565b604051602001611f3a92919061323a565b6040516020818303038152906040525b9392505050565b61138881565b6060306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9257600080fd5b505afa158015611fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fca9190612fc0565b8210611fe85760405162461bcd60e51b8152600401610aaf90613ad5565b600b8054610ee390613e18565b600d8054610b8590613e18565b66b1a2bc2ec5000081565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600e54610100900460ff1681565b61205161223e565b6001600160a01b03166120626118e7565b6001600160a01b0316146120885760405162461bcd60e51b8152600401610aaf90613990565b600e805460ff62010000808304821615810262ff00001990931692909217928390556040517f6e3cbed9f4f7973106014bef20c1bf1510381f09ecabd6966ef1242aafafd15f93610da0939004909116906133aa565b6060306001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561211957600080fd5b505afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190612fc0565b821061216f5760405162461bcd60e51b8152600401610aaf90613ad5565b60008281526011602052604090208054610ee390613e18565b61219061223e565b6001600160a01b03166121a16118e7565b6001600160a01b0316146121c75760405162461bcd60e51b8152600401610aaf90613990565b6001600160a01b0381166121ed5760405162461bcd60e51b8152600401610aaf90613526565b610fcc816124ce565b600f5481565b60006001600160e01b0319821663780e9d6360e01b14806109ee57506109ee8261276e565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061227782611088565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122bb82612221565b6122d75760405162461bcd60e51b8152600401610aaf906136d4565b60006122e283611088565b9050806001600160a01b0316846001600160a01b0316148061231d5750836001600160a01b031661231284610a88565b6001600160a01b0316145b80611b1f5750611b1f818561200d565b826001600160a01b031661234082611088565b6001600160a01b0316146123665760405162461bcd60e51b8152600401610aaf906139c5565b6001600160a01b03821661238c5760405162461bcd60e51b8152600401610aaf90613659565b6123978383836127ae565b6123a2600082612242565b6001600160a01b03831660009081526003602052604081208054600192906123cb908490613dd5565b90915550506001600160a01b03821660009081526003602052604081208054600192906123f9908490613d8a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060600d8054610a0590613e18565b60006050612478606434613da2565b6124829190613db6565b905061248d816127b9565b7f3f627395537a084d4e98fa7069e363917d6429096bfef49e877b88da4e5cf08a816040516124bc91906133b5565b60405180910390a1610c583383612520565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b81811015610b67576000612535610c67565b9050611388612542610c67565b101561255257612552848261283a565b508061255d81613e4d565b915050612523565b600081815b855181101561261557600086828151811061259557634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116125d65782816040516020016125b99291906131a1565b604051602081830303815290604052805190602001209250612602565b80836040516020016125e99291906131a1565b6040516020818303038152906040528051906020012092505b508061260d81613e4d565b91505061256a565b509092149392505050565b61262b84848461232d565b61263784848484612854565b611db65760405162461bcd60e51b8152600401610aaf906134d4565b60608161267857506040805180820190915260018152600360fc1b60208201526109f1565b8160005b81156126a2578061268c81613e4d565b915061269b9050600a83613da2565b915061267c565b60008167ffffffffffffffff8111156126cb57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126f5576020820181803683370190505b5090505b8415611b1f5761270a600183613dd5565b9150612717600a86613e68565b612722906030613d8a565b60f81b81838151811061274557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612767600a86613da2565b94506126f9565b60006001600160e01b031982166380ac58cd60e01b148061279f57506001600160e01b03198216635b5e139f60e01b145b806109ee57506109ee8261296f565b610b67838383612988565b6013546040516000916001600160a01b03169083906127d790613269565b60006040518083038185875af1925050503d8060008114612814576040519150601f19603f3d011682016040523d82523d6000602084013e612819565b606091505b5050905080610c585760405162461bcd60e51b8152600401610aaf90613c9d565b610c58828260405180602001604052806000815250612a11565b6000612868846001600160a01b0316612a44565b1561296457836001600160a01b031663150b7a0261288461223e565b8786866040518563ffffffff1660e01b81526004016128a69493929190613280565b602060405180830381600087803b1580156128c057600080fd5b505af19250505080156128f0575060408051601f3d908101601f191682019092526128ed91810190612ff4565b60015b61294a573d80801561291e576040519150601f19603f3d011682016040523d82523d6000602084013e612923565b606091505b5080516129425760405162461bcd60e51b8152600401610aaf906134d4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b1f565b506001949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b612993838383610b67565b6001600160a01b0383166129af576129aa81612a4a565b6129d2565b816001600160a01b0316836001600160a01b0316146129d2576129d28382612a8e565b6001600160a01b0382166129ee576129e981612b2b565b610b67565b826001600160a01b0316826001600160a01b031614610b6757610b678282612c04565b612a1b8383612c48565b612a286000848484612854565b610b675760405162461bcd60e51b8152600401610aaf906134d4565b3b151590565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612a9b846113f7565b612aa59190613dd5565b600083815260076020526040902054909150808214612af8576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612b3d90600190613dd5565b60008381526009602052604081205460088054939450909284908110612b7357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612ba257634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612be857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612c0f836113f7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612c6e5760405162461bcd60e51b8152600401610aaf906138cd565b612c7781612221565b15612c945760405162461bcd60e51b8152600401610aaf9061356c565b612ca0600083836127ae565b6001600160a01b0382166000908152600360205260408120805460019290612cc9908490613d8a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612d3390613e18565b90600052602060002090601f016020900481019282612d555760008555612d9b565b82601f10612d6e57805160ff1916838001178555612d9b565b82800160010185558215612d9b579182015b82811115612d9b578251825591602001919060010190612d80565b50612da7929150612dab565b5090565b5b80821115612da75760008155600101612dac565b600067ffffffffffffffff831115612dda57612dda613ea8565b612ded601f8401601f1916602001613d60565b9050828152838383011115612e0157600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e28578081fd5b611f4a83833560208501612dc0565b600060208284031215612e48578081fd5b8135611f4a81613ebe565b600060208284031215612e64578081fd5b8151611f4a81613ebe565b60008060408385031215612e81578081fd5b8235612e8c81613ebe565b91506020830135612e9c81613ebe565b809150509250929050565b600080600060608486031215612ebb578081fd5b8335612ec681613ebe565b92506020840135612ed681613ebe565b929592945050506040919091013590565b60008060008060808587031215612efc578081fd5b8435612f0781613ebe565b93506020850135612f1781613ebe565b925060408501359150606085013567ffffffffffffffff811115612f39578182fd5b8501601f81018713612f49578182fd5b612f5887823560208401612dc0565b91505092959194509250565b60008060408385031215612f76578182fd5b8235612f8181613ebe565b915060208301358015158114612e9c578182fd5b60008060408385031215612fa7578182fd5b8235612fb281613ebe565b946020939093013593505050565b600060208284031215612fd1578081fd5b5051919050565b600060208284031215612fe9578081fd5b8135611f4a81613ed3565b600060208284031215613005578081fd5b8151611f4a81613ed3565b600060208284031215613021578081fd5b813567ffffffffffffffff811115613037578182fd5b611b1f84828501612e18565b600060208284031215613054578081fd5b5035919050565b6000806040838503121561306d578182fd5b8235915060208084013567ffffffffffffffff8082111561308c578384fd5b818601915086601f83011261309f578384fd5b8135818111156130b1576130b1613ea8565b83810291506130c1848301613d60565b8181528481019084860184860187018b10156130db578788fd5b8795505b838610156130fd5780358352600195909501949186019186016130df565b508096505050505050509250929050565b60008060408385031215613120578182fd5b82359150602083013567ffffffffffffffff81111561313d578182fd5b61314985828601612e18565b9150509250929050565b6000815180845261316b816020860160208601613dec565b601f01601f19169290920160200192915050565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b918252602082015260400190565b600082516131c1818460208701613dec565b9190910192915050565b60008083546131d981613e18565b600182811680156131f157600181146132025761322e565b60ff1984168752828701945061322e565b8786526020808720875b858110156132255781548a82015290840190820161320c565b50505082870194505b50929695505050505050565b6000835161324c818460208801613dec565b835190830190613260818360208801613dec565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132b390830184613153565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b0385168252836020830152606060408301526132fd6060830184613153565b95945050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561335957603f19888603018452613347858351613153565b9450928501929085019060010161332b565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561339e57835183529284019291840191600101613382565b50909695505050505050565b901515815260200190565b90815260200190565b600060208252611f4a6020830184613153565b600060208083528184546133e481613e18565b80848701526040600180841660008114613405576001811461341957613444565b60ff19851689840152606089019550613444565b898852868820885b8581101561343c5781548b8201860152908301908801613421565b8a0184019650505b509398975050505050505050565b6020808252601f908201527f4e6577206e616d652069732073616d652061732063757272656e74206f6e6500604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526028908201527f50726573616c65206d7573742062652061637469766520746f20726573657276604082015267652043726f6f6b7360c01b606082015260800190565b60208082526019908201527f596f752068617665206e6f2070726573616c6520636c61696d00000000000000604082015260600190565b6020808252601e908201527f547279696e6720746f20636c61696d20696c6c6567616c20616d6f756e740000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4e6577207363656e652069732073616d652061732063757272656e74206f6e65604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526024908201527f416c6c2070726573616c652043726f6f6b732068617665206265656e20636c616040820152631a5b595960e21b606082015260800190565b60208082526024908201527f596f75206e65656420746f20636c61696d206d6f7265207468616e20302043726040820152636f6f6b7360e01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526022908201527f45746865722076616c75652073656e74206973206e6f742073756666696369656040820152611b9d60f21b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526018908201527f596f75206861766520616c726561647920636c61696d65640000000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601b908201527f43686f6f736520612063726f6f6b2077697468696e2072616e67650000000000604082015260600190565b6020808252602b908201527f596f752063616e206f6e6c79206d696e742031302063726f6f6b73207065722060408201526a3a3930b739b0b1ba34b7b760a91b606082015260800190565b6020808252601e908201527f4e6f7420656e6f7567682070726573616c652043726f6f6b73206c6566740000604082015260600190565b602080825260169082015275131a58d95b9cd948185b1c9958591e481b1bd8dad95960521b604082015260600190565b60208082526022908201527f53616c65206d7573742062652061637469766520746f206d696e742043726f6f6040820152616b7360f01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526017908201527f4661696c656420746f20666f72776172642066756e6473000000000000000000604082015260600190565b60208082526022908201527f596f75722077616c6c657420646f65736e2774206f776e20746869732063726f6040820152616f6b60f01b606082015260800190565b6020808252602a908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015269206f662043726f6f6b7360b01b606082015260800190565b60405181810167ffffffffffffffff81118282101715613d8257613d82613ea8565b604052919050565b60008219821115613d9d57613d9d613e7c565b500190565b600082613db157613db1613e92565b500490565b6000816000190483118215151615613dd057613dd0613e7c565b500290565b600082821015613de757613de7613e7c565b500390565b60005b83811015613e07578181015183820152602001613def565b83811115611db65750506000910152565b600281046001821680613e2c57607f821691505b6020821081141561166f57634e487b7160e01b600052602260045260246000fd5b6000600019821415613e6157613e61613e7c565b5060010190565b600082613e7757613e77613e92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610fcc57600080fd5b6001600160e01b031981168114610fcc57600080fdfea2646970667358221220893c493c5c154e734617d6f17af6425a5b29a4e7de888fbae7ce041949bd882a64736f6c63430008000033

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

f9b5a6c94120767bee0c143fc3342d974d577d3ebf3542daa9c1cffe681ef97700000000000000000000000054bc506b4eb3570522c062539b35e5b61853abec0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f7777772e63727970746f63726f6f6b732e696f2f6170692f

-----Decoded View---------------
Arg [0] : _merkleTreeRoot (bytes32): 0xf9b5a6c94120767bee0c143fc3342d974d577d3ebf3542daa9c1cffe681ef977
Arg [1] : _daoVaultAddress (address): 0x54Bc506b4EB3570522c062539b35E5b61853AbEc
Arg [2] : _nftBaseURI (string): https://www.cryptocrooks.io/api/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : f9b5a6c94120767bee0c143fc3342d974d577d3ebf3542daa9c1cffe681ef977
Arg [1] : 00000000000000000000000054bc506b4eb3570522c062539b35e5b61853abec
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [4] : 68747470733a2f2f7777772e63727970746f63726f6f6b732e696f2f6170692f


Deployed Bytecode Sourcemap

45051:11283:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47537:212;;;;;;;;;;-1:-1:-1;47537:212:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21751:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23310:221::-;;;;;;;;;;-1:-1:-1;23310:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22833:411::-;;;;;;;;;;-1:-1:-1;22833:411:0;;;;;:::i;:::-;;:::i;:::-;;45632:42;;;;;;;;;;-1:-1:-1;45632:42:0;;;;;:::i;:::-;;:::i;49013:129::-;;;;;;;;;;-1:-1:-1;49013:129:0;;;;;:::i;:::-;;:::i;46529:64::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35502:113::-;;;;;;;;;;;;;:::i;45481:35::-;;;;;;;;;;;;;:::i;24200:339::-;;;;;;;;;;-1:-1:-1;24200:339:0;;;;;:::i;:::-;;:::i;35170:256::-;;;;;;;;;;-1:-1:-1;35170:256:0;;;;;:::i;:::-;;:::i;49454:181::-;;;;;;;;;;;;;:::i;49150:137::-;;;;;;;;;;;;;:::i;45841:92::-;;;;;;;;;;;;;:::i;55431:201::-;;;;;;;;;;-1:-1:-1;55431:201:0;;;;;:::i;:::-;;:::i;24610:185::-;;;;;;;;;;-1:-1:-1;24610:185:0;;;;;:::i;:::-;;:::i;52003:150::-;;;;;;;;;;-1:-1:-1;52003:150:0;;;;;:::i;:::-;;:::i;35692:233::-;;;;;;;;;;-1:-1:-1;35692:233:0;;;;;:::i;:::-;;:::i;48571:94::-;;;;;;;;;;-1:-1:-1;48571:94:0;;;;;:::i;:::-;;:::i;46363:54::-;;;;;;;;;;;;;:::i;21445:239::-;;;;;;;;;;-1:-1:-1;21445:239:0;;;;;:::i;:::-;;:::i;48463:96::-;;;;;;;;;;;;;:::i;52557:992::-;;;;;;:::i;:::-;;:::i;45203:36::-;;;;;;;;;;;;;:::i;45567:41::-;;;;;;;;;;-1:-1:-1;45567:41:0;;;;;:::i;:::-;;:::i;54184:498::-;;;;;;:::i;:::-;;:::i;21175:208::-;;;;;;;;;;-1:-1:-1;21175:208:0;;;;;:::i;:::-;;:::i;42665:94::-;;;;;;;;;;;;;:::i;45703:42::-;;;;;;;;;;-1:-1:-1;45703:42:0;;;;;:::i;:::-;;:::i;52161:321::-;;;;;;;;;;-1:-1:-1;52161:321:0;;;;;:::i;:::-;;:::i;49647:551::-;;;;;;;;;;-1:-1:-1;49647:551:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55768:563::-;;;;;;;;;;-1:-1:-1;55768:563:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46038:34::-;;;;;;;;;;;;;:::i;42014:87::-;;;;;;;;;;;;;:::i;53585:586::-;;;;;;:::i;:::-;;:::i;21920:104::-;;;;;;;;;;;;;:::i;46251:37::-;;;;;;;;;;;;;:::i;45137:57::-;;;;;;;;;;;;;:::i;23603:295::-;;;;;;;;;;-1:-1:-1;23603:295:0;;;;;:::i;:::-;;:::i;48133:265::-;;;;;;;;;;-1:-1:-1;48133:265:0;;;;;:::i;:::-;;:::i;50659:174::-;;;;;;;;;;-1:-1:-1;50659:174:0;;;;;:::i;:::-;;:::i;54691:513::-;;;;;;:::i;:::-;;:::i;24866:328::-;;;;;;;;;;-1:-1:-1;24866:328:0;;;;;:::i;:::-;;:::i;46160:30::-;;;;;;;;;;;;;:::i;50495:125::-;;;;;;;;;;;;;:::i;45989:42::-;;;;;;;;;;;;;:::i;48817:188::-;;;;;;;;;;-1:-1:-1;48817:188:0;;;;;:::i;:::-;;:::i;22095:334::-;;;;;;;;;;-1:-1:-1;22095:334:0;;;;;:::i;:::-;;:::i;45942:38::-;;;;;;;;;;;;;:::i;50249:180::-;;;;;;;;;;-1:-1:-1;50249:180:0;;;;;:::i;:::-;;:::i;45303:29::-;;;;;;;;;;;;;:::i;46446:61::-;;;;;;;;;;;;;:::i;23969:164::-;;;;;;;;;;-1:-1:-1;23969:164:0;;;;;:::i;:::-;;:::i;45442:32::-;;;;;;;;;;;;;:::i;49295:147::-;;;;;;;;;;;;;:::i;55216:202::-;;;;;;;;;;-1:-1:-1;55216:202:0;;;;;:::i;:::-;;:::i;42914:192::-;;;;;;;;;;-1:-1:-1;42914:192:0;;;;;:::i;:::-;;:::i;45529:29::-;;;;;;;;;;;;;:::i;47537:212::-;47676:4;47705:36;47729:11;47705:23;:36::i;:::-;47698:43;;47537:212;;;;:::o;21751:100::-;21805:13;21838:5;21831:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21751:100;:::o;23310:221::-;23386:7;23414:16;23422:7;23414;:16::i;:::-;23406:73;;;;-1:-1:-1;;;23406:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;23499:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23499:24:0;;23310:221::o;22833:411::-;22914:13;22930:23;22945:7;22930:14;:23::i;:::-;22914:39;;22978:5;-1:-1:-1;;;;;22972:11:0;:2;-1:-1:-1;;;;;22972:11:0;;;22964:57;;;;-1:-1:-1;;;22964:57:0;;;;;;;:::i;:::-;23072:5;-1:-1:-1;;;;;23056:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23056:21:0;;:62;;;;23081:37;23098:5;23105:12;:10;:12::i;23081:37::-;23034:168;;;;-1:-1:-1;;;23034:168:0;;;;;;;:::i;:::-;23215:21;23224:2;23228:7;23215:8;:21::i;:::-;22833:411;;;:::o;45632:42::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49013:129::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;49099:35;;::::1;::::0;:17:::1;::::0;:35:::1;::::0;::::1;::::0;::::1;:::i;:::-;;49013:129:::0;:::o;46529:64::-;46576:17;46529:64;:::o;35502:113::-;35590:10;:17;35502:113;:::o;45481:35::-;;;;;;;;;:::o;24200:339::-;24395:41;24414:12;:10;:12::i;:::-;24428:7;24395:18;:41::i;:::-;24387:103;;;;-1:-1:-1;;;24387:103:0;;;;;;;:::i;:::-;24503:28;24513:4;24519:2;24523:7;24503:9;:28::i;35170:256::-;35267:7;35303:23;35320:5;35303:16;:23::i;:::-;35295:5;:31;35287:87;;;;-1:-1:-1;;;35287:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;35392:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;35170:256::o;49454:181::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;49523:12:::1;::::0;;-1:-1:-1;;49507:28:0;::::1;49523:12;::::0;;;::::1;;::::0;;::::1;49522:13;49507:28:::0;::::1;::::0;;;::::1;-1:-1:-1::0;;49546:23:0::1;::::0;;;;49600:27:::1;::::0;::::1;::::0;::::1;::::0;49614:12;::::1;::::0;;::::1;::::0;49600:27:::1;:::i;:::-;;;;;;;;49454:181::o:0;49150:137::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;49213:21:::1;49253:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;49245:25:0::1;:34;49271:7;49245:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;45841:92:::0;;;-1:-1:-1;;;;;45841:92:0;;:::o;55431:201::-;55489:13;55535:4;-1:-1:-1;;;;;55535:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55524:8;:29;55515:71;;;;-1:-1:-1;;;55515:71:0;;;;;;;:::i;:::-;55604:20;;;;:10;:20;;;;;55597:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55431:201;;;:::o;24610:185::-;24748:39;24765:4;24771:2;24775:7;24748:39;;;;;;;;;;;;:16;:39::i;52003:150::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;52089:56:::1;52118:10;52130:14;52089:28;:56::i;:::-;52003:150:::0;:::o;35692:233::-;35767:7;35803:30;:28;:30::i;:::-;35795:5;:38;35787:95;;;;-1:-1:-1;;;35787:95:0;;;;;;;:::i;:::-;35900:10;35911:5;35900:17;;;;;;-1:-1:-1;;;35900:17:0;;;;;;;;;;;;;;;;;35893:24;;35692:233;;;:::o;48571:94::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;48640:17;;::::1;::::0;:10:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;46363:54::-:0;46400:17;46363:54;:::o;21445:239::-;21517:7;21553:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21553:16:0;21588:19;21580:73;;;;-1:-1:-1;;;21580:73:0;;;;;;;:::i;48463:96::-;48504:18;48541:10;:8;:10::i;:::-;48534:17;;48463:96;:::o;52557:992::-;52658:15;;;;;;;52650:68;;;;-1:-1:-1;;;52650:68:0;;;;;;;:::i;:::-;52797:23;52804:7;52813:6;52797;:23::i;:::-;52789:61;;;;-1:-1:-1;;;52789:61:0;;;;;;;:::i;:::-;52881:10;52870:22;;;;:10;:22;;;;;;;;52869:23;52861:60;;;;-1:-1:-1;;;52861:60:0;;;;;;;:::i;:::-;52952:1;52942:7;:11;52934:60;;;;-1:-1:-1;;;52934:60:0;;;;;;;:::i;:::-;53036:1;53014:19;;:23;53006:72;;;;-1:-1:-1;;;53006:72:0;;;;;;;:::i;:::-;53131:1;53120:7;53098:19;;:29;;;;:::i;:::-;:34;;53090:77;;;;-1:-1:-1;;;53090:77:0;;;;;;;:::i;:::-;53202:27;46490:17;53202:7;:27;:::i;:::-;53189:9;:40;;53181:87;;;;-1:-1:-1;;;53181:87:0;;;;;;;:::i;:::-;53293:10;53282:22;;;;:10;:22;;;;;:29;;-1:-1:-1;;53282:29:0;53307:4;53282:29;;;53345:19;;:29;;53367:7;;53345:29;:::i;:::-;53323:19;:51;53470:17;53479:7;53470:8;:17::i;:::-;53506:35;53521:10;53533:7;53506:35;;;;;;;:::i;:::-;;;;;;;;52557:992;;:::o;45203:36::-;;;;;;;:::i;45567:41::-;;;;;;;;;;;;;;;;:::i;54184:498::-;54300:10;54279:17;54287:8;54279:7;:17::i;:::-;-1:-1:-1;;;;;54279:31:0;;54271:78;;;;-1:-1:-1;;;54271:78:0;;;;;;;:::i;:::-;46576:17;54368:9;:33;;54360:80;;;;-1:-1:-1;;;54360:80:0;;;;;;;:::i;:::-;54496:20;;;;:10;:20;;;;;;;54483:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54459:20;54472:5;54459:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;54451:103;;;;-1:-1:-1;;;54451:103:0;;;;;;;:::i;:::-;54575:20;;;;:10;:20;;;;;;;;:28;;;;;;;;:::i;:::-;;54629:45;54646:10;54658:8;54668:5;54629:45;;;;;;;;:::i;21175:208::-;21247:7;-1:-1:-1;;;;;21275:19:0;;21267:74;;;;-1:-1:-1;;;21267:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21359:16:0;;;;;:9;:16;;;;;;;21175:208::o;42665:94::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;42730:21:::1;42748:1;42730:9;:21::i;:::-;42665:94::o:0;45703:42::-;;;;;;;;;;;;;;;:::o;52161:321::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;52299:1:::1;52282:14;:18;:52;;;;;52322:12;;52304:14;:30;;52282:52;52274:95;;;;-1:-1:-1::0;;;52274:95:0::1;;;;;;;:::i;:::-;52412:14;52397:12;;:29;;;;:::i;:::-;52382:12;:44:::0;52439:35:::1;52449:8:::0;52459:14;52439:9:::1;:35::i;49647:551::-:0;49759:22;;-1:-1:-1;;;49759:22:0;;49708:16;;49738:18;;49759:4;;:14;;:22;;49774:6;;49759:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49738:43;-1:-1:-1;49796:15:0;49792:399;;49873:16;;;49887:1;49873:16;;;;;;;;;;;;49866:23;;;;;49792:399;49922:23;49962:10;49948:25;;;;;;-1:-1:-1;;;49948:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49948:25:0;;49922:51;;49988:13;50016:136;50040:10;50032:5;:18;50016:136;;;50096:40;50122:6;50130:5;50096:25;:40::i;:::-;50080:6;50087:5;50080:13;;;;;;-1:-1:-1;;;50080:13:0;;;;;;;;;;;;;;;;;;:56;50052:7;;;;:::i;:::-;;;;50016:136;;;-1:-1:-1;50173:6:0;-1:-1:-1;50166:13:0;;-1:-1:-1;50166:13:0;49792:399;49647:551;;;;:::o;55768:563::-;55883:22;;-1:-1:-1;;;55883:22:0;;55833:15;;55862:18;;55883:4;;:14;;:22;;55898:6;;55883:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55862:43;-1:-1:-1;55920:15:0;55916:408;;55997:15;;;56010:1;55997:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55990:22;;;;;55916:408;56045:22;56083:10;56070:24;;;;;;-1:-1:-1;;;56070:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56045:49;;56109:13;56137:148;56161:10;56153:5;:18;56137:148;;;56228:39;;-1:-1:-1;;;56228:39:0;;56217:10;;:51;;56228:4;;:24;;:39;;56253:6;;56261:5;;56228:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56217:51;;;;;;;;;;;56201:67;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;56208:5;56201:13;;;;;;-1:-1:-1;;;56201:13:0;;;;;;;;;;;;;;:67;;;;56173:7;;;;;:::i;:::-;;;;56137:148;;46038:34;46070:2;46038:34;:::o;42014:87::-;42087:6;;-1:-1:-1;;;;;42087:6:0;42014:87;:::o;53585:586::-;53650:12;;;;;;;53642:59;;;;-1:-1:-1;;;53642:59:0;;;;;;;:::i;:::-;53730:1;53720:7;:11;:42;;;;;46029:2;53735:7;:27;;53720:42;53712:98;;;;-1:-1:-1;;;53712:98:0;;;;;;;:::i;:::-;45976:4;53845:7;53829:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:37;;53821:92;;;;-1:-1:-1;;;53821:92:0;;;;;;;:::i;:::-;53945:20;53958:7;46400:17;53945:20;:::i;:::-;53932:9;:33;;53924:80;;;;-1:-1:-1;;;53924:80:0;;;;;;;:::i;:::-;54100:17;54109:7;54100:8;:17::i;:::-;54135:28;54143:10;54155:7;54135:28;;;;;;;:::i;:::-;;;;;;;;53585:586;:::o;21920:104::-;21976:13;22009:7;22002:14;;;;;:::i;46251:37::-;;;;:::o;45137:57::-;;;;;;;:::i;23603:295::-;23718:12;:10;:12::i;:::-;-1:-1:-1;;;;;23706:24:0;:8;-1:-1:-1;;;;;23706:24:0;;;23698:62;;;;-1:-1:-1;;;23698:62:0;;;;;;;:::i;:::-;23818:8;23773:18;:32;23792:12;:10;:12::i;:::-;-1:-1:-1;;;;;23773:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23773:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23773:53:0;;;;;;;;;;;23857:12;:10;:12::i;:::-;-1:-1:-1;;;;;23842:48:0;;23881:8;23842:48;;;;;;:::i;:::-;;;;;;;;23603:295;;:::o;48133:265::-;48239:4;48261:12;48303:10;48315:7;48286:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48276:48;;;;;;48261:63;;48342:48;48361:6;48369:14;;48385:4;48342:18;:48::i;:::-;48335:55;48133:265;-1:-1:-1;;;;48133:265:0:o;50659:174::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;50742:13:::1;::::0;::::1;;:22;50734:57;;;;-1:-1:-1::0;;;50734:57:0::1;;;;;;;:::i;:::-;50802:23:::0;;::::1;::::0;:12:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;54691:513::-:0;54788:22;;-1:-1:-1;;;54788:22:0;;54814:10;;54788:4;;:12;;:22;;54801:8;;54788:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54788:36:0;;54780:83;;;;-1:-1:-1;;;54780:83:0;;;;;;;:::i;:::-;46660:17;54882:9;:34;;54874:81;;;;-1:-1:-1;;;54874:81:0;;;;;;;:::i;:::-;55012:21;;;;:11;:21;;;;;;;54999:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54974:21;54987:6;54974:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;54966:106;;;;-1:-1:-1;;;54966:106:0;;;;;;;:::i;:::-;55093:21;;;;:11;:21;;;;;;;;:30;;;;;;;;:::i;:::-;;55149:47;55167:10;55179:8;55189:6;55149:47;;;;;;;;:::i;24866:328::-;25041:41;25060:12;:10;:12::i;:::-;25074:7;25041:18;:41::i;:::-;25033:103;;;;-1:-1:-1;;;25033:103:0;;;;;;;:::i;:::-;25147:39;25161:4;25167:2;25171:7;25180:5;25147:13;:39::i;:::-;24866:328;;;;:::o;46160:30::-;;;;:::o;50495:125::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;50546:13:::1;:21:::0;;-1:-1:-1;;50546:21:0::1;50563:4;50546:21;::::0;;50583:29:::1;::::0;::::1;::::0;::::1;::::0;50599:12:::1;::::0;50583:29:::1;:::i;45989:42::-:0;46029:2;45989:42;:::o;48817:188::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;48907:15:::1;:34:::0;;-1:-1:-1;;;;;;48907:34:0::1;-1:-1:-1::0;;;;;48907:34:0;::::1;;::::0;;48957:40:::1;::::0;::::1;::::0;::::1;::::0;48907:34;;48957:40:::1;:::i;22095:334::-:0;22168:13;22202:16;22210:7;22202;:16::i;:::-;22194:76;;;;-1:-1:-1;;;22194:76:0;;;;;;;:::i;:::-;22283:21;22307:10;:8;:10::i;:::-;22283:34;;22359:1;22341:7;22335:21;:25;:86;;;;;;;;;;;;;;;;;22387:7;22396:18;:7;:16;:18::i;:::-;22370:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22335:86;22328:93;22095:334;-1:-1:-1;;;22095:334:0:o;45942:38::-;45976:4;45942:38;:::o;50249:180::-;50301:13;50341:4;-1:-1:-1;;;;;50341:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50335:3;:24;50327:64;;;;-1:-1:-1;;;50327:64:0;;;;;;;:::i;:::-;50409:12;50402:19;;;;;:::i;45303:29::-;;;;;;;:::i;46446:61::-;46490:17;46446:61;:::o;23969:164::-;-1:-1:-1;;;;;24090:25:0;;;24066:4;24090:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23969:164::o;45442:32::-;;;;;;;;;:::o;49295:147::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;49370:15:::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;49369:16;49351:34:::0;::::1;-1:-1:-1::0;;49351:34:0;;::::1;::::0;;;::::1;::::0;;;;49401:33:::1;::::0;::::1;::::0;::::1;::::0;49418:15;::::1;::::0;;::::1;::::0;49401:33:::1;:::i;55216:202::-:0;55275:13;55320:4;-1:-1:-1;;;;;55320:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55309:8;:29;55300:71;;;;-1:-1:-1;;;55300:71:0;;;;;;;:::i;:::-;55389:21;;;;:11;:21;;;;;55382:28;;;;;:::i;42914:192::-;42245:12;:10;:12::i;:::-;-1:-1:-1;;;;;42234:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42234:23:0;;42226:68;;;;-1:-1:-1;;;42226:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43003:22:0;::::1;42995:73;;;;-1:-1:-1::0;;;42995:73:0::1;;;;;;;:::i;:::-;43079:19;43089:8;43079:9;:19::i;45529:29::-:0;;;;:::o;34862:224::-;34964:4;-1:-1:-1;;;;;;34988:50:0;;-1:-1:-1;;;34988:50:0;;:90;;;35042:36;35066:11;35042:23;:36::i;26704:127::-;26769:4;26793:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26793:16:0;:30;;;26704:127::o;16208:98::-;16288:10;16208:98;:::o;30686:174::-;30761:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30761:29:0;-1:-1:-1;;;;;30761:29:0;;;;;;;;:24;;30815:23;30761:24;30815:14;:23::i;:::-;-1:-1:-1;;;;;30806:46:0;;;;;;;;;;;30686:174;;:::o;26998:348::-;27091:4;27116:16;27124:7;27116;:16::i;:::-;27108:73;;;;-1:-1:-1;;;27108:73:0;;;;;;;:::i;:::-;27192:13;27208:23;27223:7;27208:14;:23::i;:::-;27192:39;;27261:5;-1:-1:-1;;;;;27250:16:0;:7;-1:-1:-1;;;;;27250:16:0;;:51;;;;27294:7;-1:-1:-1;;;;;27270:31:0;:20;27282:7;27270:11;:20::i;:::-;-1:-1:-1;;;;;27270:31:0;;27250:51;:87;;;;27305:32;27322:5;27329:7;27305:16;:32::i;29990:578::-;30149:4;-1:-1:-1;;;;;30122:31:0;:23;30137:7;30122:14;:23::i;:::-;-1:-1:-1;;;;;30122:31:0;;30114:85;;;;-1:-1:-1;;;30114:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30218:16:0;;30210:65;;;;-1:-1:-1;;;30210:65:0;;;;;;;:::i;:::-;30288:39;30309:4;30315:2;30319:7;30288:20;:39::i;:::-;30392:29;30409:1;30413:7;30392:8;:29::i;:::-;-1:-1:-1;;;;;30434:15:0;;;;;;:9;:15;;;;;:20;;30453:1;;30434:15;:20;;30453:1;;30434:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30465:13:0;;;;;;:9;:13;;;;;:18;;30482:1;;30465:13;:18;;30482:1;;30465:18;:::i;:::-;;;;-1:-1:-1;;30494:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30494:21:0;-1:-1:-1;;;;;30494:21:0;;;;;;;;;30533:27;;30494:16;;30533:27;;;;;;;29990:578;;;:::o;48673:103::-;48725:13;48758:10;48751:17;;;;;:::i;51648:320::-;51700:18;46070:2;51722:15;51734:3;51722:9;:15;:::i;:::-;51721:28;;;;:::i;:::-;51700:49;;51792:25;51806:10;51792:13;:25::i;:::-;51887:26;51902:10;51887:26;;;;;;:::i;:::-;;;;;;;;51930:30;51940:10;51952:7;51930:9;:30::i;43114:173::-;43189:6;;;-1:-1:-1;;;;;43206:17:0;;;-1:-1:-1;;;;;;43206:17:0;;;;;;;43239:40;;43189:6;;;43206:17;43189:6;;43239:40;;43170:16;;43239:40;43114:173;;:::o;51265:286::-;51345:6;51340:204;51361:13;51357:1;:17;51340:204;;;51396:14;51413:13;:11;:13::i;:::-;51396:30;;45976:4;51445:13;:11;:13::i;:::-;:26;51441:92;;;51492:25;51502:3;51507:9;51492;:25::i;:::-;-1:-1:-1;51376:3:0;;;;:::i;:::-;;;;51340:204;;44139:830;44264:4;44304;44264;44321:525;44345:5;:12;44341:1;:16;44321:525;;;44379:20;44402:5;44408:1;44402:8;;;;;;-1:-1:-1;;;44402:8:0;;;;;;;;;;;;;;;44379:31;;44447:12;44431;:28;44427:408;;44601:12;44615;44584:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44574:55;;;;;;44559:70;;44427:408;;;44791:12;44805;44774:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44764:55;;;;;;44749:70;;44427:408;-1:-1:-1;44359:3:0;;;;:::i;:::-;;;;44321:525;;;-1:-1:-1;44941:20:0;;;;44139:830;-1:-1:-1;;;44139:830:0:o;26076:315::-;26233:28;26243:4;26249:2;26253:7;26233:9;:28::i;:::-;26280:48;26303:4;26309:2;26313:7;26322:5;26280:22;:48::i;:::-;26272:111;;;;-1:-1:-1;;;26272:111:0;;;;;;;:::i;16741:723::-;16797:13;17018:10;17014:53;;-1:-1:-1;17045:10:0;;;;;;;;;;;;-1:-1:-1;;;17045:10:0;;;;;;17014:53;17092:5;17077:12;17133:78;17140:9;;17133:78;;17166:8;;;;:::i;:::-;;-1:-1:-1;17189:10:0;;-1:-1:-1;17197:2:0;17189:10;;:::i;:::-;;;17133:78;;;17221:19;17253:6;17243:17;;;;;;-1:-1:-1;;;17243:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17243:17:0;;17221:39;;17271:154;17278:10;;17271:154;;17305:11;17315:1;17305:11;;:::i;:::-;;-1:-1:-1;17374:10:0;17382:2;17374:5;:10;:::i;:::-;17361:24;;:2;:24;:::i;:::-;17348:39;;17331:6;17338;17331:14;;;;;;-1:-1:-1;;;17331:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17331:56:0;;;;;;;;-1:-1:-1;17402:11:0;17411:2;17402:11;;:::i;:::-;;;17271:154;;20806:305;20908:4;-1:-1:-1;;;;;;20945:40:0;;-1:-1:-1;;;20945:40:0;;:105;;-1:-1:-1;;;;;;;21002:48:0;;-1:-1:-1;;;21002:48:0;20945:105;:158;;;;21067:36;21091:11;21067:23;:36::i;47757:204::-;47908:45;47935:4;47941:2;47945:7;47908:26;:45::i;50942:311::-;51151:15;;:40;;51134:12;;-1:-1:-1;;;;;51151:15:0;;51179:7;;51151:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51133:58;;;51210:7;51202:43;;;;-1:-1:-1;;;51202:43:0;;;;;;;:::i;27688:110::-;27764:26;27774:2;27778:7;27764:26;;;;;;;;;;;;:9;:26::i;31425:799::-;31580:4;31601:15;:2;-1:-1:-1;;;;;31601:13:0;;:15::i;:::-;31597:620;;;31653:2;-1:-1:-1;;;;;31637:36:0;;31674:12;:10;:12::i;:::-;31688:4;31694:7;31703:5;31637:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31637:72:0;;;;;;;;-1:-1:-1;;31637:72:0;;;;;;;;;;;;:::i;:::-;;;31633:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31879:13:0;;31875:272;;31922:60;;-1:-1:-1;;;31922:60:0;;;;;;;:::i;31875:272::-;32097:6;32091:13;32082:6;32078:2;32074:15;32067:38;31633:529;-1:-1:-1;;;;;;31760:51:0;-1:-1:-1;;;31760:51:0;;-1:-1:-1;31753:58:0;;31597:620;-1:-1:-1;32201:4:0;31425:799;;;;;;:::o;19304:157::-;-1:-1:-1;;;;;;19413:40:0;;-1:-1:-1;;;19413:40:0;19304:157;;;:::o;36538:589::-;36682:45;36709:4;36715:2;36719:7;36682:26;:45::i;:::-;-1:-1:-1;;;;;36744:18:0;;36740:187;;36779:40;36811:7;36779:31;:40::i;:::-;36740:187;;;36849:2;-1:-1:-1;;;;;36841:10:0;:4;-1:-1:-1;;;;;36841:10:0;;36837:90;;36868:47;36901:4;36907:7;36868:32;:47::i;:::-;-1:-1:-1;;;;;36941:16:0;;36937:183;;36974:45;37011:7;36974:36;:45::i;:::-;36937:183;;;37047:4;-1:-1:-1;;;;;37041:10:0;:2;-1:-1:-1;;;;;37041:10:0;;37037:83;;37068:40;37096:2;37100:7;37068:27;:40::i;28025:321::-;28155:18;28161:2;28165:7;28155:5;:18::i;:::-;28206:54;28237:1;28241:2;28245:7;28254:5;28206:22;:54::i;:::-;28184:154;;;;-1:-1:-1;;;28184:154:0;;;;;;;:::i;8244:387::-;8567:20;8615:8;;;8244:387::o;37850:164::-;37954:10;:17;;37927:24;;;;:15;:24;;;;;:44;;;37982:24;;;;;;;;;;;;37850:164::o;38641:988::-;38907:22;38957:1;38932:22;38949:4;38932:16;:22::i;:::-;:26;;;;:::i;:::-;38969:18;38990:26;;;:17;:26;;;;;;38907:51;;-1:-1:-1;39123:28:0;;;39119:328;;-1:-1:-1;;;;;39190:18:0;;39168:19;39190:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39241:30;;;;;;:44;;;39358:30;;:17;:30;;;;;:43;;;39119:328;-1:-1:-1;39543:26:0;;;;:17;:26;;;;;;;;39536:33;;;-1:-1:-1;;;;;39587:18:0;;;;;:12;:18;;;;;:34;;;;;;;39580:41;38641:988::o;39924:1079::-;40202:10;:17;40177:22;;40202:21;;40222:1;;40202:21;:::i;:::-;40234:18;40255:24;;;:15;:24;;;;;;40628:10;:26;;40177:46;;-1:-1:-1;40255:24:0;;40177:46;;40628:26;;;;-1:-1:-1;;;40628:26:0;;;;;;;;;;;;;;;;;40606:48;;40692:11;40667:10;40678;40667:22;;;;;;-1:-1:-1;;;40667:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40772:28;;;:15;:28;;;;;;;:41;;;40944:24;;;;;40937:31;40979:10;:16;;;;;-1:-1:-1;;;40979:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39924:1079;;;;:::o;37428:221::-;37513:14;37530:20;37547:2;37530:16;:20::i;:::-;-1:-1:-1;;;;;37561:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37606:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37428:221:0:o;28682:382::-;-1:-1:-1;;;;;28762:16:0;;28754:61;;;;-1:-1:-1;;;28754:61:0;;;;;;;:::i;:::-;28835:16;28843:7;28835;:16::i;:::-;28834:17;28826:58;;;;-1:-1:-1;;;28826:58:0;;;;;;;:::i;:::-;28897:45;28926:1;28930:2;28934:7;28897:20;:45::i;:::-;-1:-1:-1;;;;;28955:13:0;;;;;;:9;:13;;;;;:18;;28972:1;;28955:13;:18;;28972:1;;28955:18;:::i;:::-;;;;-1:-1:-1;;28984:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28984:21:0;-1:-1:-1;;;;;28984:21:0;;;;;;;;29023:33;;28984:16;;;29023:33;;28984:16;;29023:33;28682:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:409:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:233::-;;526:3;519:4;511:6;507:17;503:27;493:2;;548:5;541;534:20;493:2;574:81;651:3;642:6;629:20;622:4;614:6;610:17;574:81;:::i;666:259::-;;778:2;766:9;757:7;753:23;749:32;746:2;;;799:6;791;784:22;746:2;843:9;830:23;862:33;889:5;862:33;:::i;930:263::-;;1053:2;1041:9;1032:7;1028:23;1024:32;1021:2;;;1074:6;1066;1059:22;1021:2;1111:9;1105:16;1130:33;1157:5;1130:33;:::i;1470:402::-;;;1599:2;1587:9;1578:7;1574:23;1570:32;1567:2;;;1620:6;1612;1605:22;1567:2;1664:9;1651:23;1683:33;1710:5;1683:33;:::i;:::-;1735:5;-1:-1:-1;1792:2:1;1777:18;;1764:32;1805:35;1764:32;1805:35;:::i;:::-;1859:7;1849:17;;;1557:315;;;;;:::o;1877:470::-;;;;2023:2;2011:9;2002:7;1998:23;1994:32;1991:2;;;2044:6;2036;2029:22;1991:2;2088:9;2075:23;2107:33;2134:5;2107:33;:::i;:::-;2159:5;-1:-1:-1;2216:2:1;2201:18;;2188:32;2229:35;2188:32;2229:35;:::i;:::-;1981:366;;2283:7;;-1:-1:-1;;;2337:2:1;2322:18;;;;2309:32;;1981:366::o;2352:830::-;;;;;2524:3;2512:9;2503:7;2499:23;2495:33;2492:2;;;2546:6;2538;2531:22;2492:2;2590:9;2577:23;2609:33;2636:5;2609:33;:::i;:::-;2661:5;-1:-1:-1;2718:2:1;2703:18;;2690:32;2731:35;2690:32;2731:35;:::i;:::-;2785:7;-1:-1:-1;2839:2:1;2824:18;;2811:32;;-1:-1:-1;2894:2:1;2879:18;;2866:32;2921:18;2910:30;;2907:2;;;2958:6;2950;2943:22;2907:2;2986:22;;3039:4;3031:13;;3027:27;-1:-1:-1;3017:2:1;;3073:6;3065;3058:22;3017:2;3101:75;3168:7;3163:2;3150:16;3145:2;3141;3137:11;3101:75;:::i;:::-;3091:85;;;2482:700;;;;;;;:::o;3187:438::-;;;3313:2;3301:9;3292:7;3288:23;3284:32;3281:2;;;3334:6;3326;3319:22;3281:2;3378:9;3365:23;3397:33;3424:5;3397:33;:::i;:::-;3449:5;-1:-1:-1;3506:2:1;3491:18;;3478:32;3548:15;;3541:23;3529:36;;3519:2;;3584:6;3576;3569:22;3630:327;;;3759:2;3747:9;3738:7;3734:23;3730:32;3727:2;;;3780:6;3772;3765:22;3727:2;3824:9;3811:23;3843:33;3870:5;3843:33;:::i;:::-;3895:5;3947:2;3932:18;;;;3919:32;;-1:-1:-1;;;3717:240:1:o;3962:194::-;;4085:2;4073:9;4064:7;4060:23;4056:32;4053:2;;;4106:6;4098;4091:22;4053:2;-1:-1:-1;4134:16:1;;4043:113;-1:-1:-1;4043:113:1:o;4161:257::-;;4272:2;4260:9;4251:7;4247:23;4243:32;4240:2;;;4293:6;4285;4278:22;4240:2;4337:9;4324:23;4356:32;4382:5;4356:32;:::i;4423:261::-;;4545:2;4533:9;4524:7;4520:23;4516:32;4513:2;;;4566:6;4558;4551:22;4513:2;4603:9;4597:16;4622:32;4648:5;4622:32;:::i;4689:344::-;;4811:2;4799:9;4790:7;4786:23;4782:32;4779:2;;;4832:6;4824;4817:22;4779:2;4877:9;4864:23;4910:18;4902:6;4899:30;4896:2;;;4947:6;4939;4932:22;4896:2;4975:52;5019:7;5010:6;4999:9;4995:22;4975:52;:::i;5038:190::-;;5150:2;5138:9;5129:7;5125:23;5121:32;5118:2;;;5171:6;5163;5156:22;5118:2;-1:-1:-1;5199:23:1;;5108:120;-1:-1:-1;5108:120:1:o;5432:1070::-;;;5586:2;5574:9;5565:7;5561:23;5557:32;5554:2;;;5607:6;5599;5592:22;5554:2;5648:9;5635:23;5625:33;;5677:2;5730;5719:9;5715:18;5702:32;5753:18;5794:2;5786:6;5783:14;5780:2;;;5815:6;5807;5800:22;5780:2;5858:6;5847:9;5843:22;5833:32;;5903:7;5896:4;5892:2;5888:13;5884:27;5874:2;;5930:6;5922;5915:22;5874:2;5971;5958:16;5993:2;5989;5986:10;5983:2;;;5999:18;;:::i;:::-;6046:2;6042;6038:11;6028:21;;6069:27;6092:2;6088;6084:11;6069:27;:::i;:::-;6130:15;;;6161:12;;;;6193:11;;;6223;;;6219:20;;6216:33;-1:-1:-1;6213:2:1;;;6267:6;6259;6252:22;6213:2;6294:6;6285:15;;6309:163;6323:2;6320:1;6317:9;6309:163;;;6380:17;;6368:30;;6341:1;6334:9;;;;;6418:12;;;;6450;;6309:163;;;6313:3;6491:5;6481:15;;;;;;;;5544:958;;;;;:::o;6507:412::-;;;6646:2;6634:9;6625:7;6621:23;6617:32;6614:2;;;6667:6;6659;6652:22;6614:2;6708:9;6695:23;6685:33;;6769:2;6758:9;6754:18;6741:32;6796:18;6788:6;6785:30;6782:2;;;6833:6;6825;6818:22;6782:2;6861:52;6905:7;6896:6;6885:9;6881:22;6861:52;:::i;:::-;6851:62;;;6604:315;;;;;:::o;6924:259::-;;7005:5;6999:12;7032:6;7027:3;7020:19;7048:63;7104:6;7097:4;7092:3;7088:14;7081:4;7074:5;7070:16;7048:63;:::i;:::-;7165:2;7144:15;-1:-1:-1;;7140:29:1;7131:39;;;;7172:4;7127:50;;6975:208;-1:-1:-1;;6975:208:1:o;7188:294::-;7365:2;7361:15;;;;-1:-1:-1;;7357:53:1;7345:66;;7436:2;7427:12;;7420:28;7473:2;7464:12;;7335:147::o;7487:247::-;7644:19;;;7688:2;7679:12;;7672:28;7725:2;7716:12;;7634:100::o;7739:274::-;;7906:6;7900:13;7922:53;7968:6;7963:3;7956:4;7948:6;7944:17;7922:53;:::i;:::-;7991:16;;;;;7876:137;-1:-1:-1;;7876:137:1:o;8018:823::-;;8177:3;8212:6;8206:13;8242:36;8268:9;8242:36;:::i;:::-;8297:1;8314:18;;;8341:104;;;;8459:1;8454:362;;;;8307:509;;8341:104;-1:-1:-1;;8374:24:1;;8362:37;;8419:16;;;;-1:-1:-1;8341:104:1;;8454:362;8487:6;8482:3;8475:19;8517:4;8564:2;8559:3;8549:18;8589:3;8605:165;8619:6;8616:1;8613:13;8605:165;;;8697:14;;8684:11;;;8677:35;8740:16;;;;8634:10;;8605:165;;;8609:3;;;8799:6;8794:3;8790:16;8783:23;;8307:509;-1:-1:-1;8832:3:1;;8156:685;-1:-1:-1;;;;;;8156:685:1:o;8846:470::-;;9063:6;9057:13;9079:53;9125:6;9120:3;9113:4;9105:6;9101:17;9079:53;:::i;:::-;9195:13;;9154:16;;;;9217:57;9195:13;9154:16;9251:4;9239:17;;9217:57;:::i;:::-;9290:20;;9033:283;-1:-1:-1;;;;9033:283:1:o;9321:205::-;9521:3;9512:14::o;9531:203::-;-1:-1:-1;;;;;9695:32:1;;;;9677:51;;9665:2;9650:18;;9632:102::o;9963:490::-;-1:-1:-1;;;;;10232:15:1;;;10214:34;;10284:15;;10279:2;10264:18;;10257:43;10331:2;10316:18;;10309:34;;;10379:3;10374:2;10359:18;;10352:31;;;9963:490;;10400:47;;10427:19;;10419:6;10400:47;:::i;:::-;10392:55;10166:287;-1:-1:-1;;;;;;10166:287:1:o;10458:274::-;-1:-1:-1;;;;;10650:32:1;;;;10632:51;;10714:2;10699:18;;10692:34;10620:2;10605:18;;10587:145::o;10737:389::-;;10971:1;10967;10962:3;10958:11;10954:19;10946:6;10942:32;10931:9;10924:51;11011:6;11006:2;10995:9;10991:18;10984:34;11054:2;11049;11038:9;11034:18;11027:30;11074:46;11116:2;11105:9;11101:18;11093:6;11074:46;:::i;:::-;11066:54;10914:212;-1:-1:-1;;;;;10914:212:1:o;11131:808::-;;11322:2;11362;11351:9;11347:18;11392:2;11381:9;11374:21;11415:6;11450;11444:13;11481:6;11473;11466:22;11519:2;11508:9;11504:18;11497:25;;11582:2;11576;11568:6;11564:15;11553:9;11549:31;11545:40;11531:54;;11620:2;11612:6;11608:15;11641:4;11654:256;11668:6;11665:1;11662:13;11654:256;;;11761:2;11757:7;11745:9;11737:6;11733:22;11729:36;11724:3;11717:49;11789:41;11823:6;11814;11808:13;11789:41;:::i;:::-;11779:51;-1:-1:-1;11888:12:1;;;;11853:15;;;;11690:1;11683:9;11654:256;;;-1:-1:-1;11927:6:1;;11302:637;-1:-1:-1;;;;;;;11302:637:1:o;11944:635::-;12115:2;12167:21;;;12237:13;;12140:18;;;12259:22;;;11944:635;;12115:2;12338:15;;;;12312:2;12297:18;;;11944:635;12384:169;12398:6;12395:1;12392:13;12384:169;;;12459:13;;12447:26;;12528:15;;;;12493:12;;;;12420:1;12413:9;12384:169;;;-1:-1:-1;12570:3:1;;12095:484;-1:-1:-1;;;;;;12095:484:1:o;12584:187::-;12749:14;;12742:22;12724:41;;12712:2;12697:18;;12679:92::o;12776:177::-;12922:25;;;12910:2;12895:18;;12877:76::o;12958:221::-;;13107:2;13096:9;13089:21;13127:46;13169:2;13158:9;13154:18;13146:6;13127:46;:::i;13184:938::-;;13322:2;13351;13340:9;13333:21;13374:4;13410:6;13404:13;13440:36;13466:9;13440:36;:::i;:::-;13512:6;13507:2;13496:9;13492:18;13485:34;13538:2;13559:1;13591:2;13580:9;13576:18;13608:1;13603:121;;;;13738:1;13733:363;;;;13569:527;;13603:121;-1:-1:-1;;13651:24:1;;13631:18;;;13624:52;13711:2;13696:18;;;-1:-1:-1;13603:121:1;;13733:363;13767:6;13761:4;13754:20;13818:2;13812:4;13802:19;13843:4;13860:180;13874:6;13871:1;13868:13;13860:180;;;13967:14;;13943:17;;;13939:26;;13932:50;14010:16;;;;13889:10;;13860:180;;;14064:17;;14060:26;;;-1:-1:-1;;13569:527:1;-1:-1:-1;14113:3:1;;13302:820;-1:-1:-1;;;;;;;;13302:820:1:o;14127:355::-;14329:2;14311:21;;;14368:2;14348:18;;;14341:30;14407:33;14402:2;14387:18;;14380:61;14473:2;14458:18;;14301:181::o;14487:407::-;14689:2;14671:21;;;14728:2;14708:18;;;14701:30;14767:34;14762:2;14747:18;;14740:62;-1:-1:-1;;;14833:2:1;14818:18;;14811:41;14884:3;14869:19;;14661:233::o;14899:414::-;15101:2;15083:21;;;15140:2;15120:18;;;15113:30;15179:34;15174:2;15159:18;;15152:62;-1:-1:-1;;;15245:2:1;15230:18;;15223:48;15303:3;15288:19;;15073:240::o;15318:402::-;15520:2;15502:21;;;15559:2;15539:18;;;15532:30;15598:34;15593:2;15578:18;;15571:62;-1:-1:-1;;;15664:2:1;15649:18;;15642:36;15710:3;15695:19;;15492:228::o;15725:352::-;15927:2;15909:21;;;15966:2;15946:18;;;15939:30;16005;16000:2;15985:18;;15978:58;16068:2;16053:18;;15899:178::o;16082:404::-;16284:2;16266:21;;;16323:2;16303:18;;;16296:30;16362:34;16357:2;16342:18;;16335:62;-1:-1:-1;;;16428:2:1;16413:18;;16406:38;16476:3;16461:19;;16256:230::o;16491:349::-;16693:2;16675:21;;;16732:2;16712:18;;;16705:30;16771:27;16766:2;16751:18;;16744:55;16831:2;16816:18;;16665:175::o;16845:354::-;17047:2;17029:21;;;17086:2;17066:18;;;17059:30;17125:32;17120:2;17105:18;;17098:60;17190:2;17175:18;;17019:180::o;17204:400::-;17406:2;17388:21;;;17445:2;17425:18;;;17418:30;17484:34;17479:2;17464:18;;17457:62;-1:-1:-1;;;17550:2:1;17535:18;;17528:34;17594:3;17579:19;;17378:226::o;17609:349::-;17811:2;17793:21;;;17850:2;17830:18;;;17823:30;17889:27;17884:2;17869:18;;17862:55;17949:2;17934:18;;17783:175::o;17963:408::-;18165:2;18147:21;;;18204:2;18184:18;;;18177:30;18243:34;18238:2;18223:18;;18216:62;-1:-1:-1;;;18309:2:1;18294:18;;18287:42;18361:3;18346:19;;18137:234::o;18376:356::-;18578:2;18560:21;;;18597:18;;;18590:30;18656:34;18651:2;18636:18;;18629:62;18723:2;18708:18;;18550:182::o;18737:420::-;18939:2;18921:21;;;18978:2;18958:18;;;18951:30;19017:34;19012:2;18997:18;;18990:62;19088:26;19083:2;19068:18;;19061:54;19147:3;19132:19;;18911:246::o;19162:406::-;19364:2;19346:21;;;19403:2;19383:18;;;19376:30;19442:34;19437:2;19422:18;;19415:62;-1:-1:-1;;;19508:2:1;19493:18;;19486:40;19558:3;19543:19;;19336:232::o;19573:405::-;19775:2;19757:21;;;19814:2;19794:18;;;19787:30;19853:34;19848:2;19833:18;;19826:62;-1:-1:-1;;;19919:2:1;19904:18;;19897:39;19968:3;19953:19;;19747:231::o;19983:400::-;20185:2;20167:21;;;20224:2;20204:18;;;20197:30;20263:34;20258:2;20243:18;;20236:62;-1:-1:-1;;;20329:2:1;20314:18;;20307:34;20373:3;20358:19;;20157:226::o;20388:400::-;20590:2;20572:21;;;20629:2;20609:18;;;20602:30;20668:34;20663:2;20648:18;;20641:62;-1:-1:-1;;;20734:2:1;20719:18;;20712:34;20778:3;20763:19;;20562:226::o;20793:356::-;20995:2;20977:21;;;21014:18;;;21007:30;21073:34;21068:2;21053:18;;21046:62;21140:2;21125:18;;20967:182::o;21154:398::-;21356:2;21338:21;;;21395:2;21375:18;;;21368:30;21434:34;21429:2;21414:18;;21407:62;-1:-1:-1;;;21500:2:1;21485:18;;21478:32;21542:3;21527:19;;21328:224::o;21557:408::-;21759:2;21741:21;;;21798:2;21778:18;;;21771:30;21837:34;21832:2;21817:18;;21810:62;-1:-1:-1;;;21903:2:1;21888:18;;21881:42;21955:3;21940:19;;21731:234::o;21970:356::-;22172:2;22154:21;;;22191:18;;;22184:30;22250:34;22245:2;22230:18;;22223:62;22317:2;22302:18;;22144:182::o;22331:405::-;22533:2;22515:21;;;22572:2;22552:18;;;22545:30;22611:34;22606:2;22591:18;;22584:62;-1:-1:-1;;;22677:2:1;22662:18;;22655:39;22726:3;22711:19;;22505:231::o;22741:411::-;22943:2;22925:21;;;22982:2;22962:18;;;22955:30;23021:34;23016:2;23001:18;;22994:62;-1:-1:-1;;;23087:2:1;23072:18;;23065:45;23142:3;23127:19;;22915:237::o;23157:348::-;23359:2;23341:21;;;23398:2;23378:18;;;23371:30;23437:26;23432:2;23417:18;;23410:54;23496:2;23481:18;;23331:174::o;23510:397::-;23712:2;23694:21;;;23751:2;23731:18;;;23724:30;23790:34;23785:2;23770:18;;23763:62;-1:-1:-1;;;23856:2:1;23841:18;;23834:31;23897:3;23882:19;;23684:223::o;23912:351::-;24114:2;24096:21;;;24153:2;24133:18;;;24126:30;24192:29;24187:2;24172:18;;24165:57;24254:2;24239:18;;24086:177::o;24268:407::-;24470:2;24452:21;;;24509:2;24489:18;;;24482:30;24548:34;24543:2;24528:18;;24521:62;-1:-1:-1;;;24614:2:1;24599:18;;24592:41;24665:3;24650:19;;24442:233::o;24680:354::-;24882:2;24864:21;;;24921:2;24901:18;;;24894:30;24960:32;24955:2;24940:18;;24933:60;25025:2;25010:18;;24854:180::o;25039:346::-;25241:2;25223:21;;;25280:2;25260:18;;;25253:30;-1:-1:-1;;;25314:2:1;25299:18;;25292:52;25376:2;25361:18;;25213:172::o;25390:398::-;25592:2;25574:21;;;25631:2;25611:18;;;25604:30;25670:34;25665:2;25650:18;;25643:62;-1:-1:-1;;;25736:2:1;25721:18;;25714:32;25778:3;25763:19;;25564:224::o;25793:413::-;25995:2;25977:21;;;26034:2;26014:18;;;26007:30;26073:34;26068:2;26053:18;;26046:62;-1:-1:-1;;;26139:2:1;26124:18;;26117:47;26196:3;26181:19;;25967:239::o;26211:408::-;26413:2;26395:21;;;26452:2;26432:18;;;26425:30;26491:34;26486:2;26471:18;;26464:62;-1:-1:-1;;;26557:2:1;26542:18;;26535:42;26609:3;26594:19;;26385:234::o;26624:347::-;26826:2;26808:21;;;26865:2;26845:18;;;26838:30;26904:25;26899:2;26884:18;;26877:53;26962:2;26947:18;;26798:173::o;26976:398::-;27178:2;27160:21;;;27217:2;27197:18;;;27190:30;27256:34;27251:2;27236:18;;27229:62;-1:-1:-1;;;27322:2:1;27307:18;;27300:32;27364:3;27349:19;;27150:224::o;27379:406::-;27581:2;27563:21;;;27620:2;27600:18;;;27593:30;27659:34;27654:2;27639:18;;27632:62;-1:-1:-1;;;27725:2:1;27710:18;;27703:40;27775:3;27760:19;;27553:232::o;27972:251::-;28042:2;28036:9;28072:17;;;28119:18;28104:34;;28140:22;;;28101:62;28098:2;;;28166:18;;:::i;:::-;28202:2;28195:22;28016:207;;-1:-1:-1;28016:207:1:o;28228:128::-;;28299:1;28295:6;28292:1;28289:13;28286:2;;;28305:18;;:::i;:::-;-1:-1:-1;28341:9:1;;28276:80::o;28361:120::-;;28427:1;28417:2;;28432:18;;:::i;:::-;-1:-1:-1;28466:9:1;;28407:74::o;28486:168::-;;28592:1;28588;28584:6;28580:14;28577:1;28574:21;28569:1;28562:9;28555:17;28551:45;28548:2;;;28599:18;;:::i;:::-;-1:-1:-1;28639:9:1;;28538:116::o;28659:125::-;;28727:1;28724;28721:8;28718:2;;;28732:18;;:::i;:::-;-1:-1:-1;28769:9:1;;28708:76::o;28789:258::-;28861:1;28871:113;28885:6;28882:1;28879:13;28871:113;;;28961:11;;;28955:18;28942:11;;;28935:39;28907:2;28900:10;28871:113;;;29002:6;28999:1;28996:13;28993:2;;;-1:-1:-1;;29037:1:1;29019:16;;29012:27;28842:205::o;29052:380::-;29137:1;29127:12;;29184:1;29174:12;;;29195:2;;29249:4;29241:6;29237:17;29227:27;;29195:2;29302;29294:6;29291:14;29271:18;29268:38;29265:2;;;29348:10;29343:3;29339:20;29336:1;29329:31;29383:4;29380:1;29373:15;29411:4;29408:1;29401:15;29437:135;;-1:-1:-1;;29497:17:1;;29494:2;;;29517:18;;:::i;:::-;-1:-1:-1;29564:1:1;29553:13;;29484:88::o;29577:112::-;;29635:1;29625:2;;29640:18;;:::i;:::-;-1:-1:-1;29674:9:1;;29615:74::o;29694:127::-;29755:10;29750:3;29746:20;29743:1;29736:31;29786:4;29783:1;29776:15;29810:4;29807:1;29800:15;29826:127;29887:10;29882:3;29878:20;29875:1;29868:31;29918:4;29915:1;29908:15;29942:4;29939:1;29932:15;29958:127;30019:10;30014:3;30010:20;30007:1;30000:31;30050:4;30047:1;30040:15;30074:4;30071:1;30064:15;30090:133;-1:-1:-1;;;;;30167:31:1;;30157:42;;30147:2;;30213:1;30210;30203:12;30228:133;-1:-1:-1;;;;;;30304:32:1;;30294:43;;30284:2;;30351:1;30348;30341:12

Swarm Source

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