ETH Price: $2,416.73 (+0.01%)

Token

ColourCryptoPunks (CCP)
 

Overview

Max Total Supply

136 CCP

Holders

35

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 CCP
0xA5baF4B0c4b3F09A75dF1Ccd63742f60FE9a2c20
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ColourCryptoPunks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2022-02-09
*/

// SPDX-License-Identifier: MIT

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

//merkle start

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

//merkle end

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



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


pragma solidity ^0.8.0;


contract ColourCryptoPunks is Ownable, ERC721 {
    
    uint public tokenPrice = 0.07 ether;
    uint constant maxSupply = 10000;
    uint public presale_price = 0.05 ether;
    uint public totalSupply = 0;

    bool public Presale_status = true;
    bool public public_sale_status = false;
    bytes32 public whitelistMerkleRoot;
    
    mapping(address => bool) private presaleList;
    string public baseURI;
    uint public maxPerTransaction = 10;  //Max Limit for Sale
    uint public maxPerWalletPresale = 5; //Max Limit for Presale
    uint public maxPerWalletPublicsale = 10; //Max Limit for Publicsale
    uint public phase=2000;
         
    constructor() ERC721("ColourCryptoPunks", "CCP"){}

   function buy(uint _count) public payable{
         require(public_sale_status == true, "Sale is Paused.");
        require(_count > 0, "mint at least one token");
        require(_count <= maxPerTransaction, "max per transaction 20");
        require(totalSupply + _count <= maxSupply, "Not enough tokens left");
        require(totalSupply + _count<= phase, "Not enough tokens left in current phase");
        require(msg.value >= tokenPrice * _count, "incorrect ether amount");
        require(balanceOf(msg.sender) + _count<= maxPerWalletPublicsale, "10 tokens per wallet allowed in publicsale");
      
        for(uint i = 0; i < _count; i++)
            _safeMint(msg.sender, totalSupply + 1 + i);
        totalSupply += _count;
    }

    function adminMint(uint _count) public onlyOwner{
        require(_count > 0, "mint at least one token");
        require(totalSupply + _count <= maxSupply, "Not enough tokens left");
      
        for(uint i = 0; i < _count; i++)
            _safeMint(msg.sender, totalSupply + 1 + i);
        totalSupply += _count;
    }

   function buy_presale(uint _count, bytes32[] calldata merkleProof) public payable{ 
        require(Presale_status == true, "Sale is Paused.");
        //require(checkPresale() == true, "You are not in Presale List.");
        require(MerkleProof.verify(merkleProof,whitelistMerkleRoot,keccak256(abi.encodePacked(msg.sender))),"You are not in Presale List.");
        require(_count > 0, "mint at least one token");
        require(_count <= maxPerTransaction, "max per transaction 20");
        require(totalSupply + _count<= maxSupply, "Not enough tokens left");
        require(totalSupply + _count<= phase, "Not enough tokens left in current phase");
        require(msg.value >= presale_price, "incorrect ether amount");
        require(balanceOf(msg.sender) + _count<= maxPerWalletPresale, "5 tokens per wallet allowed in presale");
       
         for(uint i = 0; i < _count; i++)
            _safeMint(msg.sender, totalSupply + 1 + i);
        totalSupply += _count;
    }

    function sendGifts(address[] memory _wallets) public onlyOwner{
        require(_wallets.length > 0, "mint at least one token");
        require(_wallets.length <= maxPerTransaction, "max per transaction 20");
        require(totalSupply + _wallets.length <= maxSupply, "not enough tokens left");
        for(uint i = 0; i < _wallets.length; i++)
            _safeMint(_wallets[i], totalSupply + 1 + i);
        totalSupply += _wallets.length;
    }

     function setPhase(uint256 _newPhase) public onlyOwner() {
        phase = _newPhase;
    }
    
    function is_presale_active() public view returns(uint){
        require(Presale_status == true,"Sale not Started Yet.");
        return 1;
     }
      function is_sale_active() public view returns(uint){
      require(public_sale_status == true,"Sale not Started Yet.");
        return 1;
     }
     function checkPresale() public view returns(bool){
        return presaleList[msg.sender];
    }
    function setBaseUri(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }
     function pre_Sale_status(bool temp) external onlyOwner {
        Presale_status = temp;
    }
    function publicSale_status(bool temp) external onlyOwner {
        public_sale_status = temp;
    }
     function update_public_price(uint price) external onlyOwner {
        tokenPrice = price;
    }
       function update_preSale_price(uint price) external onlyOwner {
        presale_price = price;
    }
  
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

   function withdraw() external onlyOwner {
         uint _balance = address(this).balance;
        payable(owner()).transfer(_balance * 80 / 100);//owner
        payable(0xE728581ED94d5CE0aD490ef0866184C294A59203).transfer(_balance * 10 / 100); //shareholder1
        payable(0x3c7FA439322AA8c7c51F78446ebF23eec2b2eBDF).transfer(_balance * 5 / 100); //shareholder2
        payable(0x315DC3205aBb692999613FEF3586D192f6991860).transfer(_balance * 5 / 100); //dev
    }
    function setWhiteListMerkleRoot(bytes32 merkleRoot) public onlyOwner {
		whitelistMerkleRoot = merkleRoot;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"Presale_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"buy_presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"checkPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"is_presale_active","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"is_sale_active","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletPublicsale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"pre_Sale_status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presale_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"publicSale_status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"public_sale_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"sendGifts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPhase","type":"uint256"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhiteListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"update_preSale_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"update_public_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266f8b0a10e47000060075566b1a2bc2ec500006008556000600955600a805461ffff19166001178155600e8190556005600f556010556107d06011553480156200004d57600080fd5b5060405180604001604052806011815260200170436f6c6f757243727970746f50756e6b7360781b8152506040518060400160405280600381526020016204343560ec1b815250620000ae620000a8620000e260201b60201c565b620000e6565b8151620000c390600190602085019062000136565b508051620000d990600290602084019062000136565b50505062000219565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200014490620001dc565b90600052602060002090601f016020900481019282620001685760008555620001b3565b82601f106200018357805160ff1916838001178555620001b3565b82800160010185558215620001b3579182015b82811115620001b357825182559160200191906001019062000196565b50620001c1929150620001c5565b5090565b5b80821115620001c15760008155600101620001c6565b600181811c90821680620001f157607f821691505b602082108114156200021357634e487b7160e01b600052602260045260246000fd5b50919050565b61291980620002296000396000f3fe6080604052600436106102515760003560e01c80638da5cb5b11610139578063ba6dd6f0116100b6578063e08e65ea1161007a578063e08e65ea14610672578063e2a70eaf14610692578063e985e9c5146106b2578063ef5f1985146106fb578063f2fde38b1461071b578063f96254741461073b57600080fd5b8063ba6dd6f0146105f0578063c1f261231461060a578063c87b56dd1461062a578063cd7de4581461064a578063d96a094a1461065f57600080fd5b8063a0bcfc7f116100fd578063a0bcfc7f14610564578063a22cb46514610584578063aa98e0c6146105a4578063b1c9fe6e146105ba578063b88d4fde146105d057600080fd5b80638da5cb5b146104e757806395d89b411461050557806395ea5e671461051a578063969745e814610539578063996953fc1461054f57600080fd5b80633ccfd60b116101d257806363adc5a51161019657806363adc5a5146104475780636c0360eb1461046757806370a082311461047c578063715018a61461049c5780637c8255db146104b15780637ff9b596146104d157600080fd5b80633ccfd60b146103c65780634235f70b146103db57806342842e0e146103f15780634b980d67146104115780636352211e1461042757600080fd5b806318160ddd1161021957806318160ddd1461032c5780631cef37e414610350578063230a9b8d1461037057806323b872dd146103865780632cc82655146103a657600080fd5b806301ffc9a714610256578063026896631461028b57806306fdde03146102b0578063081812fc146102d2578063095ea7b31461030a575b600080fd5b34801561026257600080fd5b506102766102713660046123e9565b61074e565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b50336000908152600c602052604090205460ff16610276565b3480156102bc57600080fd5b506102c56107a0565b6040516102829190612583565b3480156102de57600080fd5b506102f26102ed3660046123d0565b610832565b6040516001600160a01b039091168152602001610282565b34801561031657600080fd5b5061032a6103253660046122d7565b6108cc565b005b34801561033857600080fd5b5061034260095481565b604051908152602001610282565b34801561035c57600080fd5b5061032a61036b3660046123b5565b6109e2565b34801561037c57600080fd5b50610342600f5481565b34801561039257600080fd5b5061032a6103a13660046121f5565b610a26565b3480156103b257600080fd5b5061032a6103c13660046123d0565b610a57565b3480156103d257600080fd5b5061032a610a86565b3480156103e757600080fd5b5061034260105481565b3480156103fd57600080fd5b5061032a61040c3660046121f5565b610c1a565b34801561041d57600080fd5b50610342600e5481565b34801561043357600080fd5b506102f26104423660046123d0565b610c35565b34801561045357600080fd5b5061032a6104623660046123d0565b610cac565b34801561047357600080fd5b506102c5610cdb565b34801561048857600080fd5b506103426104973660046121a7565b610d69565b3480156104a857600080fd5b5061032a610df0565b3480156104bd57600080fd5b5061032a6104cc366004612301565b610e26565b3480156104dd57600080fd5b5061034260075481565b3480156104f357600080fd5b506000546001600160a01b03166102f2565b34801561051157600080fd5b506102c5610f63565b34801561052657600080fd5b50600a5461027690610100900460ff1681565b34801561054557600080fd5b5061034260085481565b34801561055b57600080fd5b50610342610f72565b34801561057057600080fd5b5061032a61057f366004612423565b610fca565b34801561059057600080fd5b5061032a61059f3660046122ad565b611007565b3480156105b057600080fd5b50610342600b5481565b3480156105c657600080fd5b5061034260115481565b3480156105dc57600080fd5b5061032a6105eb366004612231565b6110cc565b3480156105fc57600080fd5b50600a546102769060ff1681565b34801561061657600080fd5b5061032a6106253660046123d0565b611104565b34801561063657600080fd5b506102c56106453660046123d0565b6111c1565b34801561065657600080fd5b5061034261129c565b61032a61066d3660046123d0565b6112f4565b34801561067e57600080fd5b5061032a61068d3660046123d0565b6114e2565b34801561069e57600080fd5b5061032a6106ad3660046123d0565b611511565b3480156106be57600080fd5b506102766106cd3660046121c2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561070757600080fd5b5061032a6107163660046123b5565b611540565b34801561072757600080fd5b5061032a6107363660046121a7565b61157d565b61032a61074936600461246c565b611618565b60006001600160e01b031982166380ac58cd60e01b148061077f57506001600160e01b03198216635b5e139f60e01b145b8061079a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546107af9061280b565b80601f01602080910402602001604051908101604052809291908181526020018280546107db9061280b565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166108b05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006108d782610c35565b9050806001600160a01b0316836001600160a01b031614156109455760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108a7565b336001600160a01b0382161480610961575061096181336106cd565b6109d35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108a7565b6109dd83836118cf565b505050565b6000546001600160a01b03163314610a0c5760405162461bcd60e51b81526004016108a790612618565b600a80549115156101000261ff0019909216919091179055565b610a30338261193d565b610a4c5760405162461bcd60e51b81526004016108a79061264d565b6109dd838383611a34565b6000546001600160a01b03163314610a815760405162461bcd60e51b81526004016108a790612618565b601155565b6000546001600160a01b03163314610ab05760405162461bcd60e51b81526004016108a790612618565b47610ac36000546001600160a01b031690565b6001600160a01b03166108fc6064610adc8460506127a9565b610ae69190612795565b6040518115909202916000818181858888f19350505050158015610b0e573d6000803e3d6000fd5b5073e728581ed94d5ce0ad490ef0866184c294a592036108fc6064610b3484600a6127a9565b610b3e9190612795565b6040518115909202916000818181858888f19350505050158015610b66573d6000803e3d6000fd5b50733c7fa439322aa8c7c51f78446ebf23eec2b2ebdf6108fc6064610b8c8460056127a9565b610b969190612795565b6040518115909202916000818181858888f19350505050158015610bbe573d6000803e3d6000fd5b5073315dc3205abb692999613fef3586d192f69918606108fc6064610be48460056127a9565b610bee9190612795565b6040518115909202916000818181858888f19350505050158015610c16573d6000803e3d6000fd5b5050565b6109dd838383604051806020016040528060008152506110cc565b6000818152600360205260408120546001600160a01b03168061079a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108a7565b6000546001600160a01b03163314610cd65760405162461bcd60e51b81526004016108a790612618565b600855565b600d8054610ce89061280b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d149061280b565b8015610d615780601f10610d3657610100808354040283529160200191610d61565b820191906000526020600020905b815481529060010190602001808311610d4457829003601f168201915b505050505081565b60006001600160a01b038216610dd45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108a7565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610e1a5760405162461bcd60e51b81526004016108a790612618565b610e246000611bd4565b565b6000546001600160a01b03163314610e505760405162461bcd60e51b81526004016108a790612618565b6000815111610e715760405162461bcd60e51b81526004016108a79061269e565b600e5481511115610e945760405162461bcd60e51b81526004016108a7906126d5565b6127108151600954610ea6919061277d565b1115610eed5760405162461bcd60e51b81526020600482015260166024820152751b9bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016108a7565b60005b8151811015610f4757610f35828281518110610f0e57610f0e6128a1565b6020026020010151826009546001610f26919061277d565b610f30919061277d565b611c24565b80610f3f81612846565b915050610ef0565b50805160096000828254610f5b919061277d565b909155505050565b6060600280546107af9061280b565b600a5460009060ff161515600114610fc45760405162461bcd60e51b815260206004820152601560248201527429b0b632903737ba1029ba30b93a32b2102cb2ba1760591b60448201526064016108a7565b50600190565b6000546001600160a01b03163314610ff45760405162461bcd60e51b81526004016108a790612618565b8051610c1690600d90602084019061208a565b6001600160a01b0382163314156110605760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108a7565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6110d6338361193d565b6110f25760405162461bcd60e51b81526004016108a79061264d565b6110fe84848484611c3e565b50505050565b6000546001600160a01b0316331461112e5760405162461bcd60e51b81526004016108a790612618565b6000811161114e5760405162461bcd60e51b81526004016108a79061269e565b6127108160095461115f919061277d565b111561117d5760405162461bcd60e51b81526004016108a7906125e8565b60005b818110156111ae5761119c33826009546001610f26919061277d565b806111a681612846565b915050611180565b508060096000828254610f5b919061277d565b6000818152600360205260409020546060906001600160a01b03166112405760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108a7565b600061124a611c71565b9050600081511161126a5760405180602001604052806000815250611295565b8061127484611c80565b604051602001611285929190612517565b6040516020818303038152906040525b9392505050565b600a5460009060ff610100909104161515600114610fc45760405162461bcd60e51b815260206004820152601560248201527429b0b632903737ba1029ba30b93a32b2102cb2ba1760591b60448201526064016108a7565b600a5460ff6101009091041615156001146113435760405162461bcd60e51b815260206004820152600f60248201526e29b0b6329034b9902830bab9b2b21760891b60448201526064016108a7565b600081116113635760405162461bcd60e51b81526004016108a79061269e565b600e548111156113855760405162461bcd60e51b81526004016108a7906126d5565b61271081600954611396919061277d565b11156113b45760405162461bcd60e51b81526004016108a7906125e8565b601154816009546113c5919061277d565b11156113e35760405162461bcd60e51b81526004016108a790612705565b806007546113f191906127a9565b3410156114395760405162461bcd60e51b81526020600482015260166024820152751a5b98dbdc9c9958dd08195d1a195c88185b5bdd5b9d60521b60448201526064016108a7565b6010548161144633610d69565b611450919061277d565b11156114b15760405162461bcd60e51b815260206004820152602a60248201527f313020746f6b656e73207065722077616c6c657420616c6c6f77656420696e206044820152697075626c696373616c6560b01b60648201526084016108a7565b60005b818110156111ae576114d033826009546001610f26919061277d565b806114da81612846565b9150506114b4565b6000546001600160a01b0316331461150c5760405162461bcd60e51b81526004016108a790612618565b600b55565b6000546001600160a01b0316331461153b5760405162461bcd60e51b81526004016108a790612618565b600755565b6000546001600160a01b0316331461156a5760405162461bcd60e51b81526004016108a790612618565b600a805460ff1916911515919091179055565b6000546001600160a01b031633146115a75760405162461bcd60e51b81526004016108a790612618565b6001600160a01b03811661160c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a7565b61161581611bd4565b50565b600a5460ff1615156001146116615760405162461bcd60e51b815260206004820152600f60248201526e29b0b6329034b9902830bab9b2b21760891b60448201526064016108a7565b6116d682828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120611d7e565b6117225760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f7420696e2050726573616c65204c6973742e0000000060448201526064016108a7565b600083116117425760405162461bcd60e51b81526004016108a79061269e565b600e548311156117645760405162461bcd60e51b81526004016108a7906126d5565b61271083600954611775919061277d565b11156117935760405162461bcd60e51b81526004016108a7906125e8565b601154836009546117a4919061277d565b11156117c25760405162461bcd60e51b81526004016108a790612705565b60085434101561180d5760405162461bcd60e51b81526020600482015260166024820152751a5b98dbdc9c9958dd08195d1a195c88185b5bdd5b9d60521b60448201526064016108a7565b600f548361181a33610d69565b611824919061277d565b11156118815760405162461bcd60e51b815260206004820152602660248201527f3520746f6b656e73207065722077616c6c657420616c6c6f77656420696e2070604482015265726573616c6560d01b60648201526084016108a7565b60005b838110156118b2576118a033826009546001610f26919061277d565b806118aa81612846565b915050611884565b5082600960008282546118c5919061277d565b9091555050505050565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061190482610c35565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166119b65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108a7565b60006119c183610c35565b9050806001600160a01b0316846001600160a01b031614806119fc5750836001600160a01b03166119f184610832565b6001600160a01b0316145b80611a2c57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a4782610c35565b6001600160a01b031614611aaf5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108a7565b6001600160a01b038216611b115760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108a7565b611b1c6000826118cf565b6001600160a01b0383166000908152600460205260408120805460019290611b459084906127c8565b90915550506001600160a01b0382166000908152600460205260408120805460019290611b7390849061277d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610c16828260405180602001604052806000815250611d94565b611c49848484611a34565b611c5584848484611dc7565b6110fe5760405162461bcd60e51b81526004016108a790612596565b6060600d80546107af9061280b565b606081611ca45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cce5780611cb881612846565b9150611cc79050600a83612795565b9150611ca8565b60008167ffffffffffffffff811115611ce957611ce96128b7565b6040519080825280601f01601f191660200182016040528015611d13576020820181803683370190505b5090505b8415611a2c57611d286001836127c8565b9150611d35600a86612861565b611d4090603061277d565b60f81b818381518110611d5557611d556128a1565b60200101906001600160f81b031916908160001a905350611d77600a86612795565b9450611d17565b600082611d8b8584611ed4565b14949350505050565b611d9e8383611f48565b611dab6000848484611dc7565b6109dd5760405162461bcd60e51b81526004016108a790612596565b60006001600160a01b0384163b15611ec957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e0b903390899088908890600401612546565b602060405180830381600087803b158015611e2557600080fd5b505af1925050508015611e55575060408051601f3d908101601f19168201909252611e5291810190612406565b60015b611eaf573d808015611e83576040519150601f19603f3d011682016040523d82523d6000602084013e611e88565b606091505b508051611ea75760405162461bcd60e51b81526004016108a790612596565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a2c565b506001949350505050565b600081815b8451811015611f40576000858281518110611ef657611ef66128a1565b60200260200101519050808311611f1c5760008381526020829052604090209250611f2d565b600081815260208490526040902092505b5080611f3881612846565b915050611ed9565b509392505050565b6001600160a01b038216611f9e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108a7565b6000818152600360205260409020546001600160a01b0316156120035760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108a7565b6001600160a01b038216600090815260046020526040812080546001929061202c90849061277d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546120969061280b565b90600052602060002090601f0160209004810192826120b857600085556120fe565b82601f106120d157805160ff19168380011785556120fe565b828001600101855582156120fe579182015b828111156120fe5782518255916020019190600101906120e3565b5061210a92915061210e565b5090565b5b8082111561210a576000815560010161210f565b600067ffffffffffffffff83111561213d5761213d6128b7565b612150601f8401601f191660200161274c565b905082815283838301111561216457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461219257600080fd5b919050565b8035801515811461219257600080fd5b6000602082840312156121b957600080fd5b6112958261217b565b600080604083850312156121d557600080fd5b6121de8361217b565b91506121ec6020840161217b565b90509250929050565b60008060006060848603121561220a57600080fd5b6122138461217b565b92506122216020850161217b565b9150604084013590509250925092565b6000806000806080858703121561224757600080fd5b6122508561217b565b935061225e6020860161217b565b925060408501359150606085013567ffffffffffffffff81111561228157600080fd5b8501601f8101871361229257600080fd5b6122a187823560208401612123565b91505092959194509250565b600080604083850312156122c057600080fd5b6122c98361217b565b91506121ec60208401612197565b600080604083850312156122ea57600080fd5b6122f38361217b565b946020939093013593505050565b6000602080838503121561231457600080fd5b823567ffffffffffffffff8082111561232c57600080fd5b818501915085601f83011261234057600080fd5b813581811115612352576123526128b7565b8060051b915061236384830161274c565b8181528481019084860184860187018a101561237e57600080fd5b600095505b838610156123a8576123948161217b565b835260019590950194918601918601612383565b5098975050505050505050565b6000602082840312156123c757600080fd5b61129582612197565b6000602082840312156123e257600080fd5b5035919050565b6000602082840312156123fb57600080fd5b8135611295816128cd565b60006020828403121561241857600080fd5b8151611295816128cd565b60006020828403121561243557600080fd5b813567ffffffffffffffff81111561244c57600080fd5b8201601f8101841361245d57600080fd5b611a2c84823560208401612123565b60008060006040848603121561248157600080fd5b83359250602084013567ffffffffffffffff808211156124a057600080fd5b818601915086601f8301126124b457600080fd5b8135818111156124c357600080fd5b8760208260051b85010111156124d857600080fd5b6020830194508093505050509250925092565b600081518084526125038160208601602086016127df565b601f01601f19169290920160200192915050565b600083516125298184602088016127df565b83519083019061253d8183602088016127df565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612579908301846124eb565b9695505050505050565b60208152600061129560208301846124eb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260169082015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526017908201527f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000604082015260600190565b60208082526016908201527506d617820706572207472616e73616374696f6e2032360541b604082015260600190565b60208082526027908201527f4e6f7420656e6f75676820746f6b656e73206c65667420696e2063757272656e6040820152667420706861736560c81b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612775576127756128b7565b604052919050565b6000821982111561279057612790612875565b500190565b6000826127a4576127a461288b565b500490565b60008160001904831182151516156127c3576127c3612875565b500290565b6000828210156127da576127da612875565b500390565b60005b838110156127fa5781810151838201526020016127e2565b838111156110fe5750506000910152565b600181811c9082168061281f57607f821691505b6020821081141561284057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561285a5761285a612875565b5060010190565b6000826128705761287061288b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461161557600080fdfea264697066735822122026430f12c5acce6b615396048ae5a23b263666296b9bb502d0b0ef880d60cc2a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102515760003560e01c80638da5cb5b11610139578063ba6dd6f0116100b6578063e08e65ea1161007a578063e08e65ea14610672578063e2a70eaf14610692578063e985e9c5146106b2578063ef5f1985146106fb578063f2fde38b1461071b578063f96254741461073b57600080fd5b8063ba6dd6f0146105f0578063c1f261231461060a578063c87b56dd1461062a578063cd7de4581461064a578063d96a094a1461065f57600080fd5b8063a0bcfc7f116100fd578063a0bcfc7f14610564578063a22cb46514610584578063aa98e0c6146105a4578063b1c9fe6e146105ba578063b88d4fde146105d057600080fd5b80638da5cb5b146104e757806395d89b411461050557806395ea5e671461051a578063969745e814610539578063996953fc1461054f57600080fd5b80633ccfd60b116101d257806363adc5a51161019657806363adc5a5146104475780636c0360eb1461046757806370a082311461047c578063715018a61461049c5780637c8255db146104b15780637ff9b596146104d157600080fd5b80633ccfd60b146103c65780634235f70b146103db57806342842e0e146103f15780634b980d67146104115780636352211e1461042757600080fd5b806318160ddd1161021957806318160ddd1461032c5780631cef37e414610350578063230a9b8d1461037057806323b872dd146103865780632cc82655146103a657600080fd5b806301ffc9a714610256578063026896631461028b57806306fdde03146102b0578063081812fc146102d2578063095ea7b31461030a575b600080fd5b34801561026257600080fd5b506102766102713660046123e9565b61074e565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b50336000908152600c602052604090205460ff16610276565b3480156102bc57600080fd5b506102c56107a0565b6040516102829190612583565b3480156102de57600080fd5b506102f26102ed3660046123d0565b610832565b6040516001600160a01b039091168152602001610282565b34801561031657600080fd5b5061032a6103253660046122d7565b6108cc565b005b34801561033857600080fd5b5061034260095481565b604051908152602001610282565b34801561035c57600080fd5b5061032a61036b3660046123b5565b6109e2565b34801561037c57600080fd5b50610342600f5481565b34801561039257600080fd5b5061032a6103a13660046121f5565b610a26565b3480156103b257600080fd5b5061032a6103c13660046123d0565b610a57565b3480156103d257600080fd5b5061032a610a86565b3480156103e757600080fd5b5061034260105481565b3480156103fd57600080fd5b5061032a61040c3660046121f5565b610c1a565b34801561041d57600080fd5b50610342600e5481565b34801561043357600080fd5b506102f26104423660046123d0565b610c35565b34801561045357600080fd5b5061032a6104623660046123d0565b610cac565b34801561047357600080fd5b506102c5610cdb565b34801561048857600080fd5b506103426104973660046121a7565b610d69565b3480156104a857600080fd5b5061032a610df0565b3480156104bd57600080fd5b5061032a6104cc366004612301565b610e26565b3480156104dd57600080fd5b5061034260075481565b3480156104f357600080fd5b506000546001600160a01b03166102f2565b34801561051157600080fd5b506102c5610f63565b34801561052657600080fd5b50600a5461027690610100900460ff1681565b34801561054557600080fd5b5061034260085481565b34801561055b57600080fd5b50610342610f72565b34801561057057600080fd5b5061032a61057f366004612423565b610fca565b34801561059057600080fd5b5061032a61059f3660046122ad565b611007565b3480156105b057600080fd5b50610342600b5481565b3480156105c657600080fd5b5061034260115481565b3480156105dc57600080fd5b5061032a6105eb366004612231565b6110cc565b3480156105fc57600080fd5b50600a546102769060ff1681565b34801561061657600080fd5b5061032a6106253660046123d0565b611104565b34801561063657600080fd5b506102c56106453660046123d0565b6111c1565b34801561065657600080fd5b5061034261129c565b61032a61066d3660046123d0565b6112f4565b34801561067e57600080fd5b5061032a61068d3660046123d0565b6114e2565b34801561069e57600080fd5b5061032a6106ad3660046123d0565b611511565b3480156106be57600080fd5b506102766106cd3660046121c2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561070757600080fd5b5061032a6107163660046123b5565b611540565b34801561072757600080fd5b5061032a6107363660046121a7565b61157d565b61032a61074936600461246c565b611618565b60006001600160e01b031982166380ac58cd60e01b148061077f57506001600160e01b03198216635b5e139f60e01b145b8061079a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546107af9061280b565b80601f01602080910402602001604051908101604052809291908181526020018280546107db9061280b565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166108b05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006108d782610c35565b9050806001600160a01b0316836001600160a01b031614156109455760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108a7565b336001600160a01b0382161480610961575061096181336106cd565b6109d35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108a7565b6109dd83836118cf565b505050565b6000546001600160a01b03163314610a0c5760405162461bcd60e51b81526004016108a790612618565b600a80549115156101000261ff0019909216919091179055565b610a30338261193d565b610a4c5760405162461bcd60e51b81526004016108a79061264d565b6109dd838383611a34565b6000546001600160a01b03163314610a815760405162461bcd60e51b81526004016108a790612618565b601155565b6000546001600160a01b03163314610ab05760405162461bcd60e51b81526004016108a790612618565b47610ac36000546001600160a01b031690565b6001600160a01b03166108fc6064610adc8460506127a9565b610ae69190612795565b6040518115909202916000818181858888f19350505050158015610b0e573d6000803e3d6000fd5b5073e728581ed94d5ce0ad490ef0866184c294a592036108fc6064610b3484600a6127a9565b610b3e9190612795565b6040518115909202916000818181858888f19350505050158015610b66573d6000803e3d6000fd5b50733c7fa439322aa8c7c51f78446ebf23eec2b2ebdf6108fc6064610b8c8460056127a9565b610b969190612795565b6040518115909202916000818181858888f19350505050158015610bbe573d6000803e3d6000fd5b5073315dc3205abb692999613fef3586d192f69918606108fc6064610be48460056127a9565b610bee9190612795565b6040518115909202916000818181858888f19350505050158015610c16573d6000803e3d6000fd5b5050565b6109dd838383604051806020016040528060008152506110cc565b6000818152600360205260408120546001600160a01b03168061079a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108a7565b6000546001600160a01b03163314610cd65760405162461bcd60e51b81526004016108a790612618565b600855565b600d8054610ce89061280b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d149061280b565b8015610d615780601f10610d3657610100808354040283529160200191610d61565b820191906000526020600020905b815481529060010190602001808311610d4457829003601f168201915b505050505081565b60006001600160a01b038216610dd45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108a7565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610e1a5760405162461bcd60e51b81526004016108a790612618565b610e246000611bd4565b565b6000546001600160a01b03163314610e505760405162461bcd60e51b81526004016108a790612618565b6000815111610e715760405162461bcd60e51b81526004016108a79061269e565b600e5481511115610e945760405162461bcd60e51b81526004016108a7906126d5565b6127108151600954610ea6919061277d565b1115610eed5760405162461bcd60e51b81526020600482015260166024820152751b9bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016108a7565b60005b8151811015610f4757610f35828281518110610f0e57610f0e6128a1565b6020026020010151826009546001610f26919061277d565b610f30919061277d565b611c24565b80610f3f81612846565b915050610ef0565b50805160096000828254610f5b919061277d565b909155505050565b6060600280546107af9061280b565b600a5460009060ff161515600114610fc45760405162461bcd60e51b815260206004820152601560248201527429b0b632903737ba1029ba30b93a32b2102cb2ba1760591b60448201526064016108a7565b50600190565b6000546001600160a01b03163314610ff45760405162461bcd60e51b81526004016108a790612618565b8051610c1690600d90602084019061208a565b6001600160a01b0382163314156110605760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108a7565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6110d6338361193d565b6110f25760405162461bcd60e51b81526004016108a79061264d565b6110fe84848484611c3e565b50505050565b6000546001600160a01b0316331461112e5760405162461bcd60e51b81526004016108a790612618565b6000811161114e5760405162461bcd60e51b81526004016108a79061269e565b6127108160095461115f919061277d565b111561117d5760405162461bcd60e51b81526004016108a7906125e8565b60005b818110156111ae5761119c33826009546001610f26919061277d565b806111a681612846565b915050611180565b508060096000828254610f5b919061277d565b6000818152600360205260409020546060906001600160a01b03166112405760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108a7565b600061124a611c71565b9050600081511161126a5760405180602001604052806000815250611295565b8061127484611c80565b604051602001611285929190612517565b6040516020818303038152906040525b9392505050565b600a5460009060ff610100909104161515600114610fc45760405162461bcd60e51b815260206004820152601560248201527429b0b632903737ba1029ba30b93a32b2102cb2ba1760591b60448201526064016108a7565b600a5460ff6101009091041615156001146113435760405162461bcd60e51b815260206004820152600f60248201526e29b0b6329034b9902830bab9b2b21760891b60448201526064016108a7565b600081116113635760405162461bcd60e51b81526004016108a79061269e565b600e548111156113855760405162461bcd60e51b81526004016108a7906126d5565b61271081600954611396919061277d565b11156113b45760405162461bcd60e51b81526004016108a7906125e8565b601154816009546113c5919061277d565b11156113e35760405162461bcd60e51b81526004016108a790612705565b806007546113f191906127a9565b3410156114395760405162461bcd60e51b81526020600482015260166024820152751a5b98dbdc9c9958dd08195d1a195c88185b5bdd5b9d60521b60448201526064016108a7565b6010548161144633610d69565b611450919061277d565b11156114b15760405162461bcd60e51b815260206004820152602a60248201527f313020746f6b656e73207065722077616c6c657420616c6c6f77656420696e206044820152697075626c696373616c6560b01b60648201526084016108a7565b60005b818110156111ae576114d033826009546001610f26919061277d565b806114da81612846565b9150506114b4565b6000546001600160a01b0316331461150c5760405162461bcd60e51b81526004016108a790612618565b600b55565b6000546001600160a01b0316331461153b5760405162461bcd60e51b81526004016108a790612618565b600755565b6000546001600160a01b0316331461156a5760405162461bcd60e51b81526004016108a790612618565b600a805460ff1916911515919091179055565b6000546001600160a01b031633146115a75760405162461bcd60e51b81526004016108a790612618565b6001600160a01b03811661160c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a7565b61161581611bd4565b50565b600a5460ff1615156001146116615760405162461bcd60e51b815260206004820152600f60248201526e29b0b6329034b9902830bab9b2b21760891b60448201526064016108a7565b6116d682828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120611d7e565b6117225760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f7420696e2050726573616c65204c6973742e0000000060448201526064016108a7565b600083116117425760405162461bcd60e51b81526004016108a79061269e565b600e548311156117645760405162461bcd60e51b81526004016108a7906126d5565b61271083600954611775919061277d565b11156117935760405162461bcd60e51b81526004016108a7906125e8565b601154836009546117a4919061277d565b11156117c25760405162461bcd60e51b81526004016108a790612705565b60085434101561180d5760405162461bcd60e51b81526020600482015260166024820152751a5b98dbdc9c9958dd08195d1a195c88185b5bdd5b9d60521b60448201526064016108a7565b600f548361181a33610d69565b611824919061277d565b11156118815760405162461bcd60e51b815260206004820152602660248201527f3520746f6b656e73207065722077616c6c657420616c6c6f77656420696e2070604482015265726573616c6560d01b60648201526084016108a7565b60005b838110156118b2576118a033826009546001610f26919061277d565b806118aa81612846565b915050611884565b5082600960008282546118c5919061277d565b9091555050505050565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061190482610c35565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166119b65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108a7565b60006119c183610c35565b9050806001600160a01b0316846001600160a01b031614806119fc5750836001600160a01b03166119f184610832565b6001600160a01b0316145b80611a2c57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a4782610c35565b6001600160a01b031614611aaf5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108a7565b6001600160a01b038216611b115760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108a7565b611b1c6000826118cf565b6001600160a01b0383166000908152600460205260408120805460019290611b459084906127c8565b90915550506001600160a01b0382166000908152600460205260408120805460019290611b7390849061277d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610c16828260405180602001604052806000815250611d94565b611c49848484611a34565b611c5584848484611dc7565b6110fe5760405162461bcd60e51b81526004016108a790612596565b6060600d80546107af9061280b565b606081611ca45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cce5780611cb881612846565b9150611cc79050600a83612795565b9150611ca8565b60008167ffffffffffffffff811115611ce957611ce96128b7565b6040519080825280601f01601f191660200182016040528015611d13576020820181803683370190505b5090505b8415611a2c57611d286001836127c8565b9150611d35600a86612861565b611d4090603061277d565b60f81b818381518110611d5557611d556128a1565b60200101906001600160f81b031916908160001a905350611d77600a86612795565b9450611d17565b600082611d8b8584611ed4565b14949350505050565b611d9e8383611f48565b611dab6000848484611dc7565b6109dd5760405162461bcd60e51b81526004016108a790612596565b60006001600160a01b0384163b15611ec957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e0b903390899088908890600401612546565b602060405180830381600087803b158015611e2557600080fd5b505af1925050508015611e55575060408051601f3d908101601f19168201909252611e5291810190612406565b60015b611eaf573d808015611e83576040519150601f19603f3d011682016040523d82523d6000602084013e611e88565b606091505b508051611ea75760405162461bcd60e51b81526004016108a790612596565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a2c565b506001949350505050565b600081815b8451811015611f40576000858281518110611ef657611ef66128a1565b60200260200101519050808311611f1c5760008381526020829052604090209250611f2d565b600081815260208490526040902092505b5080611f3881612846565b915050611ed9565b509392505050565b6001600160a01b038216611f9e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108a7565b6000818152600360205260409020546001600160a01b0316156120035760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108a7565b6001600160a01b038216600090815260046020526040812080546001929061202c90849061277d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546120969061280b565b90600052602060002090601f0160209004810192826120b857600085556120fe565b82601f106120d157805160ff19168380011785556120fe565b828001600101855582156120fe579182015b828111156120fe5782518255916020019190600101906120e3565b5061210a92915061210e565b5090565b5b8082111561210a576000815560010161210f565b600067ffffffffffffffff83111561213d5761213d6128b7565b612150601f8401601f191660200161274c565b905082815283838301111561216457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461219257600080fd5b919050565b8035801515811461219257600080fd5b6000602082840312156121b957600080fd5b6112958261217b565b600080604083850312156121d557600080fd5b6121de8361217b565b91506121ec6020840161217b565b90509250929050565b60008060006060848603121561220a57600080fd5b6122138461217b565b92506122216020850161217b565b9150604084013590509250925092565b6000806000806080858703121561224757600080fd5b6122508561217b565b935061225e6020860161217b565b925060408501359150606085013567ffffffffffffffff81111561228157600080fd5b8501601f8101871361229257600080fd5b6122a187823560208401612123565b91505092959194509250565b600080604083850312156122c057600080fd5b6122c98361217b565b91506121ec60208401612197565b600080604083850312156122ea57600080fd5b6122f38361217b565b946020939093013593505050565b6000602080838503121561231457600080fd5b823567ffffffffffffffff8082111561232c57600080fd5b818501915085601f83011261234057600080fd5b813581811115612352576123526128b7565b8060051b915061236384830161274c565b8181528481019084860184860187018a101561237e57600080fd5b600095505b838610156123a8576123948161217b565b835260019590950194918601918601612383565b5098975050505050505050565b6000602082840312156123c757600080fd5b61129582612197565b6000602082840312156123e257600080fd5b5035919050565b6000602082840312156123fb57600080fd5b8135611295816128cd565b60006020828403121561241857600080fd5b8151611295816128cd565b60006020828403121561243557600080fd5b813567ffffffffffffffff81111561244c57600080fd5b8201601f8101841361245d57600080fd5b611a2c84823560208401612123565b60008060006040848603121561248157600080fd5b83359250602084013567ffffffffffffffff808211156124a057600080fd5b818601915086601f8301126124b457600080fd5b8135818111156124c357600080fd5b8760208260051b85010111156124d857600080fd5b6020830194508093505050509250925092565b600081518084526125038160208601602086016127df565b601f01601f19169290920160200192915050565b600083516125298184602088016127df565b83519083019061253d8183602088016127df565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612579908301846124eb565b9695505050505050565b60208152600061129560208301846124eb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260169082015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526017908201527f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000604082015260600190565b60208082526016908201527506d617820706572207472616e73616374696f6e2032360541b604082015260600190565b60208082526027908201527f4e6f7420656e6f75676820746f6b656e73206c65667420696e2063757272656e6040820152667420706861736560c81b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612775576127756128b7565b604052919050565b6000821982111561279057612790612875565b500190565b6000826127a4576127a461288b565b500490565b60008160001904831182151516156127c3576127c3612875565b500290565b6000828210156127da576127da612875565b500390565b60005b838110156127fa5781810151838201526020016127e2565b838111156110fe5750506000910152565b600181811c9082168061281f57607f821691505b6020821081141561284057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561285a5761285a612875565b5060010190565b6000826128705761287061288b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461161557600080fdfea264697066735822122026430f12c5acce6b615396048ae5a23b263666296b9bb502d0b0ef880d60cc2a64736f6c63430008070033

Deployed Bytecode Sourcemap

37130:5043:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24976:305;;;;;;;;;;-1:-1:-1;24976:305:0;;;;;:::i;:::-;;:::i;:::-;;;7753:14:1;;7746:22;7728:41;;7716:2;7701:18;24976:305:0;;;;;;;;40839:98;;;;;;;;;;-1:-1:-1;40918:10:0;40883:4;40906:23;;;:11;:23;;;;;;;;40839:98;;25921:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27480:221::-;;;;;;;;;;-1:-1:-1;27480:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7051:32:1;;;7033:51;;7021:2;7006:18;27480:221:0;6887:203:1;27003:411:0;;;;;;;;;;-1:-1:-1;27003:411:0;;;;;:::i;:::-;;:::i;:::-;;37314:27;;;;;;;;;;;;;;;;;;;7926:25:1;;;7914:2;7899:18;37314:27:0;7780:177:1;41143:101:0;;;;;;;;;;-1:-1:-1;41143:101:0;;;;;:::i;:::-;;:::i;37624:35::-;;;;;;;;;;;;;;;;28370:339;;;;;;;;;;-1:-1:-1;28370:339:0;;;;;:::i;:::-;;:::i;40425:92::-;;;;;;;;;;-1:-1:-1;40425:92:0;;;;;:::i;:::-;;:::i;41583:470::-;;;;;;;;;;;;;:::i;37690:39::-;;;;;;;;;;;;;;;;28780:185;;;;;;;;;;-1:-1:-1;28780:185:0;;;;;:::i;:::-;;:::i;37561:34::-;;;;;;;;;;;;;;;;25615:239;;;;;;;;;;-1:-1:-1;25615:239:0;;;;;:::i;:::-;;:::i;41357:101::-;;;;;;;;;;-1:-1:-1;41357:101:0;;;;;:::i;:::-;;:::i;37533:21::-;;;;;;;;;;;;;:::i;25345:208::-;;;;;;;;;;-1:-1:-1;25345:208:0;;;;;:::i;:::-;;:::i;14184:94::-;;;;;;;;;;;;;:::i;39960:456::-;;;;;;;;;;-1:-1:-1;39960:456:0;;;;;:::i;:::-;;:::i;37189:35::-;;;;;;;;;;;;;;;;13533:87;;;;;;;;;;-1:-1:-1;13579:7:0;13606:6;-1:-1:-1;;;;;13606:6:0;13533:87;;26090:104;;;;;;;;;;;;;:::i;37390:38::-;;;;;;;;;;-1:-1:-1;37390:38:0;;;;;;;;;;;37269;;;;;;;;;;;;;;;;40529:148;;;;;;;;;;;;;:::i;40943:92::-;;;;;;;;;;-1:-1:-1;40943:92:0;;;;;:::i;:::-;;:::i;27773:295::-;;;;;;;;;;-1:-1:-1;27773:295:0;;;;;:::i;:::-;;:::i;37435:34::-;;;;;;;;;;;;;;;;37763:22;;;;;;;;;;;;;;;;29036:328;;;;;;;;;;-1:-1:-1;29036:328:0;;;;;:::i;:::-;;:::i;37350:33::-;;;;;;;;;;-1:-1:-1;37350:33:0;;;;;;;;38620:331;;;;;;;;;;-1:-1:-1;38620:331:0;;;;;:::i;:::-;;:::i;26265:334::-;;;;;;;;;;-1:-1:-1;26265:334:0;;;;;:::i;:::-;;:::i;40685:147::-;;;;;;;;;;;;;:::i;37860:752::-;;;;;;:::i;:::-;;:::i;42059:111::-;;;;;;;;;;-1:-1:-1;42059:111:0;;;;;:::i;:::-;;:::i;41251:97::-;;;;;;;;;;-1:-1:-1;41251:97:0;;;;;:::i;:::-;;:::i;28139:164::-;;;;;;;;;;-1:-1:-1;28139:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28260:25:0;;;28236:4;28260:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28139:164;41042:95;;;;;;;;;;-1:-1:-1;41042:95:0;;;;;:::i;:::-;;:::i;14433:192::-;;;;;;;;;;-1:-1:-1;14433:192:0;;;;;:::i;:::-;;:::i;38958:994::-;;;;;;:::i;:::-;;:::i;24976:305::-;25078:4;-1:-1:-1;;;;;;25115:40:0;;-1:-1:-1;;;25115:40:0;;:105;;-1:-1:-1;;;;;;;25172:48:0;;-1:-1:-1;;;25172:48:0;25115:105;:158;;;-1:-1:-1;;;;;;;;;;18280:40:0;;;25237:36;25095:178;24976:305;-1:-1:-1;;24976:305:0:o;25921:100::-;25975:13;26008:5;26001:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25921:100;:::o;27480:221::-;27556:7;30963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30963:16:0;27576:73;;;;-1:-1:-1;;;27576:73:0;;13463:2:1;27576:73:0;;;13445:21:1;13502:2;13482:18;;;13475:30;13541:34;13521:18;;;13514:62;-1:-1:-1;;;13592:18:1;;;13585:42;13644:19;;27576:73:0;;;;;;;;;-1:-1:-1;27669:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27669:24:0;;27480:221::o;27003:411::-;27084:13;27100:23;27115:7;27100:14;:23::i;:::-;27084:39;;27148:5;-1:-1:-1;;;;;27142:11:0;:2;-1:-1:-1;;;;;27142:11:0;;;27134:57;;;;-1:-1:-1;;;27134:57:0;;15413:2:1;27134:57:0;;;15395:21:1;15452:2;15432:18;;;15425:30;15491:34;15471:18;;;15464:62;-1:-1:-1;;;15542:18:1;;;15535:31;15583:19;;27134:57:0;15211:397:1;27134:57:0;753:10;-1:-1:-1;;;;;27226:21:0;;;;:62;;-1:-1:-1;27251:37:0;27268:5;753:10;28139:164;:::i;27251:37::-;27204:168;;;;-1:-1:-1;;;27204:168:0;;11094:2:1;27204:168:0;;;11076:21:1;11133:2;11113:18;;;11106:30;11172:34;11152:18;;;11145:62;11243:26;11223:18;;;11216:54;11287:19;;27204:168:0;10892:420:1;27204:168:0;27385:21;27394:2;27398:7;27385:8;:21::i;:::-;27073:341;27003:411;;:::o;41143:101::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;41211:18:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;41211:25:0;;::::1;::::0;;;::::1;::::0;;41143:101::o;28370:339::-;28565:41;753:10;28598:7;28565:18;:41::i;:::-;28557:103;;;;-1:-1:-1;;;28557:103:0;;;;;;;:::i;:::-;28673:28;28683:4;28689:2;28693:7;28673:9;:28::i;40425:92::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;40492:5:::1;:17:::0;40425:92::o;41583:470::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;41650:21:::1;41690:7;13579::::0;13606:6;-1:-1:-1;;;;;13606:6:0;;13533:87;41690:7:::1;-1:-1:-1::0;;;;;41682:25:0::1;:46;41724:3;41708:13;:8:::0;41719:2:::1;41708:13;:::i;:::-;:19;;;;:::i;:::-;41682:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;41754:42:0::1;41746:81;41823:3;41807:13;:8:::0;41818:2:::1;41807:13;:::i;:::-;:19;;;;:::i;:::-;41746:81;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;41861:42:0::1;41853:80;41929:3;41914:12;:8:::0;41925:1:::1;41914:12;:::i;:::-;:18;;;;:::i;:::-;41853:80;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;41967:42:0::1;41959:80;42035:3;42020:12;:8:::0;42031:1:::1;42020:12;:::i;:::-;:18;;;;:::i;:::-;41959:80;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41622:431;41583:470::o:0;28780:185::-;28918:39;28935:4;28941:2;28945:7;28918:39;;;;;;;;;;;;:16;:39::i;25615:239::-;25687:7;25723:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25723:16:0;25758:19;25750:73;;;;-1:-1:-1;;;25750:73:0;;11930:2:1;25750:73:0;;;11912:21:1;11969:2;11949:18;;;11942:30;12008:34;11988:18;;;11981:62;-1:-1:-1;;;12059:18:1;;;12052:39;12108:19;;25750:73:0;11728:405:1;41357:101:0;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;41429:13:::1;:21:::0;41357:101::o;37533:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25345:208::-;25417:7;-1:-1:-1;;;;;25445:19:0;;25437:74;;;;-1:-1:-1;;;25437:74:0;;11519:2:1;25437:74:0;;;11501:21:1;11558:2;11538:18;;;11531:30;11597:34;11577:18;;;11570:62;-1:-1:-1;;;11648:18:1;;;11641:40;11698:19;;25437:74:0;11317:406:1;25437:74:0;-1:-1:-1;;;;;;25529:16:0;;;;;:9;:16;;;;;;;25345:208::o;14184:94::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;14249:21:::1;14267:1;14249:9;:21::i;:::-;14184:94::o:0;39960:456::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;40059:1:::1;40041:8;:15;:19;40033:55;;;;-1:-1:-1::0;;;40033:55:0::1;;;;;;;:::i;:::-;40126:17;;40107:8;:15;:36;;40099:71;;;;-1:-1:-1::0;;;40099:71:0::1;;;;;;;:::i;:::-;37257:5;40203:8;:15;40189:11;;:29;;;;:::i;:::-;:42;;40181:77;;;::::0;-1:-1:-1;;;40181:77:0;;17701:2:1;40181:77:0::1;::::0;::::1;17683:21:1::0;17740:2;17720:18;;;17713:30;-1:-1:-1;;;17759:18:1;;;17752:52;17821:18;;40181:77:0::1;17499:346:1::0;40181:77:0::1;40273:6;40269:98;40289:8;:15;40285:1;:19;40269:98;;;40324:43;40334:8;40343:1;40334:11;;;;;;;;:::i;:::-;;;;;;;40365:1;40347:11;;40361:1;40347:15;;;;:::i;:::-;:19;;;;:::i;:::-;40324:9;:43::i;:::-;40306:3:::0;::::1;::::0;::::1;:::i;:::-;;;;40269:98;;;;40393:8;:15;40378:11;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;39960:456:0:o;26090:104::-;26146:13;26179:7;26172:14;;;;;:::i;40529:148::-;40602:14;;40578:4;;40602:14;;:22;;:14;:22;40594:55;;;;-1:-1:-1;;;40594:55:0;;14237:2:1;40594:55:0;;;14219:21:1;14276:2;14256:18;;;14249:30;-1:-1:-1;;;14295:18:1;;;14288:51;14356:18;;40594:55:0;14035:345:1;40594:55:0;-1:-1:-1;40667:1:0;;40529:148::o;40943:92::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;41013:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;27773:295::-:0;-1:-1:-1;;;;;27876:24:0;;753:10;27876:24;;27868:62;;;;-1:-1:-1;;;27868:62:0;;9976:2:1;27868:62:0;;;9958:21:1;10015:2;9995:18;;;9988:30;10054:27;10034:18;;;10027:55;10099:18;;27868:62:0;9774:349:1;27868:62:0;753:10;27943:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27943:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27943:53:0;;;;;;;;;;28012:48;;7728:41:1;;;27943:42:0;;753:10;28012:48;;7701:18:1;28012:48:0;;;;;;;27773:295;;:::o;29036:328::-;29211:41;753:10;29244:7;29211:18;:41::i;:::-;29203:103;;;;-1:-1:-1;;;29203:103:0;;;;;;;:::i;:::-;29317:39;29331:4;29337:2;29341:7;29350:5;29317:13;:39::i;:::-;29036:328;;;;:::o;38620:331::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;38696:1:::1;38687:6;:10;38679:46;;;;-1:-1:-1::0;;;38679:46:0::1;;;;;;;:::i;:::-;37257:5;38758:6;38744:11;;:20;;;;:::i;:::-;:33;;38736:68;;;;-1:-1:-1::0;;;38736:68:0::1;;;;;;;:::i;:::-;38827:6;38823:88;38843:6;38839:1;:10;38823:88;;;38869:42;38879:10;38909:1;38891:11;;38905:1;38891:15;;;;:::i;38869:42::-;38851:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38823:88;;;;38937:6;38922:11;;:21;;;;;;;:::i;26265:334::-:0;30939:4;30963:16;;;:7;:16;;;;;;26338:13;;-1:-1:-1;;;;;30963:16:0;26364:76;;;;-1:-1:-1;;;26364:76:0;;14997:2:1;26364:76:0;;;14979:21:1;15036:2;15016:18;;;15009:30;15075:34;15055:18;;;15048:62;-1:-1:-1;;;15126:18:1;;;15119:45;15181:19;;26364:76:0;14795:411:1;26364:76:0;26453:21;26477:10;:8;:10::i;:::-;26453:34;;26529:1;26511:7;26505:21;:25;:86;;;;;;;;;;;;;;;;;26557:7;26566:18;:7;:16;:18::i;:::-;26540:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26505:86;26498:93;26265:334;-1:-1:-1;;;26265:334:0:o;40685:147::-;40753:18;;40731:4;;40753:18;;;;;;:26;;:18;:26;40745:59;;;;-1:-1:-1;;;40745:59:0;;14237:2:1;40745:59:0;;;14219:21:1;14276:2;14256:18;;;14249:30;-1:-1:-1;;;14295:18:1;;;14288:51;14356:18;;40745:59:0;14035:345:1;37860:752:0;37920:18;;;;;;;;:26;;:18;:26;37912:54;;;;-1:-1:-1;;;37912:54:0;;18459:2:1;37912:54:0;;;18441:21:1;18498:2;18478:18;;;18471:30;-1:-1:-1;;;18517:18:1;;;18510:45;18572:18;;37912:54:0;18257:339:1;37912:54:0;37994:1;37985:6;:10;37977:46;;;;-1:-1:-1;;;37977:46:0;;;;;;;:::i;:::-;38052:17;;38042:6;:27;;38034:62;;;;-1:-1:-1;;;38034:62:0;;;;;;;:::i;:::-;37257:5;38129:6;38115:11;;:20;;;;:::i;:::-;:33;;38107:68;;;;-1:-1:-1;;;38107:68:0;;;;;;;:::i;:::-;38217:5;;38208:6;38194:11;;:20;;;;:::i;:::-;:28;;38186:80;;;;-1:-1:-1;;;38186:80:0;;;;;;;:::i;:::-;38311:6;38298:10;;:19;;;;:::i;:::-;38285:9;:32;;38277:67;;;;-1:-1:-1;;;38277:67:0;;10743:2:1;38277:67:0;;;10725:21:1;10782:2;10762:18;;;10755:30;-1:-1:-1;;;10801:18:1;;;10794:52;10863:18;;38277:67:0;10541:346:1;38277:67:0;38396:22;;38387:6;38363:21;38373:10;38363:9;:21::i;:::-;:30;;;;:::i;:::-;:55;;38355:110;;;;-1:-1:-1;;;38355:110:0;;12340:2:1;38355:110:0;;;12322:21:1;12379:2;12359:18;;;12352:30;12418:34;12398:18;;;12391:62;-1:-1:-1;;;12469:18:1;;;12462:40;12519:19;;38355:110:0;12138:406:1;38355:110:0;38488:6;38484:88;38504:6;38500:1;:10;38484:88;;;38530:42;38540:10;38570:1;38552:11;;38566:1;38552:15;;;;:::i;38530:42::-;38512:3;;;;:::i;:::-;;;;38484:88;;42059:111;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;42133:19:::1;:32:::0;42059:111::o;41251:97::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;41322:10:::1;:18:::0;41251:97::o;41042:95::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;41108:14:::1;:21:::0;;-1:-1:-1;;41108:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41042:95::o;14433:192::-;13579:7;13606:6;-1:-1:-1;;;;;13606:6:0;753:10;13753:23;13745:68;;;;-1:-1:-1;;;13745:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14522:22:0;::::1;14514:73;;;::::0;-1:-1:-1;;;14514:73:0;;8807:2:1;14514:73:0::1;::::0;::::1;8789:21:1::0;8846:2;8826:18;;;8819:30;8885:34;8865:18;;;8858:62;-1:-1:-1;;;8936:18:1;;;8929:36;8982:19;;14514:73:0::1;8605:402:1::0;14514:73:0::1;14598:19;14608:8;14598:9;:19::i;:::-;14433:192:::0;:::o;38958:994::-;39058:14;;;;:22;;:14;:22;39050:50;;;;-1:-1:-1;;;39050:50:0;;18459:2:1;39050:50:0;;;18441:21:1;18498:2;18478:18;;;18471:30;-1:-1:-1;;;18517:18:1;;;18510:45;18572:18;;39050:50:0;18257:339:1;39050:50:0;39195:91;39214:11;;39195:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39226:19:0;;39256:28;;-1:-1:-1;;39273:10:0;6327:2:1;6323:15;6319:53;39256:28:0;;;6307:66:1;39226:19:0;;-1:-1:-1;6389:12:1;;;-1:-1:-1;39256:28:0;;;;;;;;;;;;39246:39;;;;;;39195:18;:91::i;:::-;39187:131;;;;-1:-1:-1;;;39187:131:0;;17344:2:1;39187:131:0;;;17326:21:1;17383:2;17363:18;;;17356:30;17422;17402:18;;;17395:58;17470:18;;39187:131:0;17142:352:1;39187:131:0;39346:1;39337:6;:10;39329:46;;;;-1:-1:-1;;;39329:46:0;;;;;;;:::i;:::-;39404:17;;39394:6;:27;;39386:62;;;;-1:-1:-1;;;39386:62:0;;;;;;;:::i;:::-;37257:5;39481:6;39467:11;;:20;;;;:::i;:::-;:32;;39459:67;;;;-1:-1:-1;;;39459:67:0;;;;;;;:::i;:::-;39568:5;;39559:6;39545:11;;:20;;;;:::i;:::-;:28;;39537:80;;;;-1:-1:-1;;;39537:80:0;;;;;;;:::i;:::-;39649:13;;39636:9;:26;;39628:61;;;;-1:-1:-1;;;39628:61:0;;10743:2:1;39628:61:0;;;10725:21:1;10782:2;10762:18;;;10755:30;-1:-1:-1;;;10801:18:1;;;10794:52;10863:18;;39628:61:0;10541:346:1;39628:61:0;39741:19;;39732:6;39708:21;39718:10;39708:9;:21::i;:::-;:30;;;;:::i;:::-;:52;;39700:103;;;;-1:-1:-1;;;39700:103:0;;18052:2:1;39700:103:0;;;18034:21:1;18091:2;18071:18;;;18064:30;18130:34;18110:18;;;18103:62;-1:-1:-1;;;18181:18:1;;;18174:36;18227:19;;39700:103:0;17850:402:1;39700:103:0;39828:6;39824:88;39844:6;39840:1;:10;39824:88;;;39870:42;39880:10;39910:1;39892:11;;39906:1;39892:15;;;;:::i;39870:42::-;39852:3;;;;:::i;:::-;;;;39824:88;;;;39938:6;39923:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;38958:994:0:o;34856:174::-;34931:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34931:29:0;-1:-1:-1;;;;;34931:29:0;;;;;;;;:24;;34985:23;34931:24;34985:14;:23::i;:::-;-1:-1:-1;;;;;34976:46:0;;;;;;;;;;;34856:174;;:::o;31168:348::-;31261:4;30963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30963:16:0;31278:73;;;;-1:-1:-1;;;31278:73:0;;10330:2:1;31278:73:0;;;10312:21:1;10369:2;10349:18;;;10342:30;10408:34;10388:18;;;10381:62;-1:-1:-1;;;10459:18:1;;;10452:42;10511:19;;31278:73:0;10128:408:1;31278:73:0;31362:13;31378:23;31393:7;31378:14;:23::i;:::-;31362:39;;31431:5;-1:-1:-1;;;;;31420:16:0;:7;-1:-1:-1;;;;;31420:16:0;;:51;;;;31464:7;-1:-1:-1;;;;;31440:31:0;:20;31452:7;31440:11;:20::i;:::-;-1:-1:-1;;;;;31440:31:0;;31420:51;:87;;;-1:-1:-1;;;;;;28260:25:0;;;28236:4;28260:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31475:32;31412:96;31168:348;-1:-1:-1;;;;31168:348:0:o;34160:578::-;34319:4;-1:-1:-1;;;;;34292:31:0;:23;34307:7;34292:14;:23::i;:::-;-1:-1:-1;;;;;34292:31:0;;34284:85;;;;-1:-1:-1;;;34284:85:0;;14587:2:1;34284:85:0;;;14569:21:1;14626:2;14606:18;;;14599:30;14665:34;14645:18;;;14638:62;-1:-1:-1;;;14716:18:1;;;14709:39;14765:19;;34284:85:0;14385:405:1;34284:85:0;-1:-1:-1;;;;;34388:16:0;;34380:65;;;;-1:-1:-1;;;34380:65:0;;9571:2:1;34380:65:0;;;9553:21:1;9610:2;9590:18;;;9583:30;9649:34;9629:18;;;9622:62;-1:-1:-1;;;9700:18:1;;;9693:34;9744:19;;34380:65:0;9369:400:1;34380:65:0;34562:29;34579:1;34583:7;34562:8;:29::i;:::-;-1:-1:-1;;;;;34604:15:0;;;;;;:9;:15;;;;;:20;;34623:1;;34604:15;:20;;34623:1;;34604:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34635:13:0;;;;;;:9;:13;;;;;:18;;34652:1;;34635:13;:18;;34652:1;;34635:18;:::i;:::-;;;;-1:-1:-1;;34664:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34664:21:0;-1:-1:-1;;;;;34664:21:0;;;;;;;;;34703:27;;34664:16;;34703:27;;;;;;;34160:578;;;:::o;14633:173::-;14689:16;14708:6;;-1:-1:-1;;;;;14725:17:0;;;-1:-1:-1;;;;;;14725:17:0;;;;;;14758:40;;14708:6;;;;;;;14758:40;;14689:16;14758:40;14678:128;14633:173;:::o;31858:110::-;31934:26;31944:2;31948:7;31934:26;;;;;;;;;;;;:9;:26::i;30246:315::-;30403:28;30413:4;30419:2;30423:7;30403:9;:28::i;:::-;30450:48;30473:4;30479:2;30483:7;30492:5;30450:22;:48::i;:::-;30442:111;;;;-1:-1:-1;;;30442:111:0;;;;;;;:::i;41468:108::-;41528:13;41561:7;41554:14;;;;;:::i;1138:723::-;1194:13;1415:10;1411:53;;-1:-1:-1;;1442:10:0;;;;;;;;;;;;-1:-1:-1;;;1442:10:0;;;;;1138:723::o;1411:53::-;1489:5;1474:12;1530:78;1537:9;;1530:78;;1563:8;;;;:::i;:::-;;-1:-1:-1;1586:10:0;;-1:-1:-1;1594:2:0;1586:10;;:::i;:::-;;;1530:78;;;1618:19;1650:6;1640:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1640:17:0;;1618:39;;1668:154;1675:10;;1668:154;;1702:11;1712:1;1702:11;;:::i;:::-;;-1:-1:-1;1771:10:0;1779:2;1771:5;:10;:::i;:::-;1758:24;;:2;:24;:::i;:::-;1745:39;;1728:6;1735;1728:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1728:56:0;;;;;;;;-1:-1:-1;1799:11:0;1808:2;1799:11;;:::i;:::-;;;1668:154;;15963:190;16088:4;16141;16112:25;16125:5;16132:4;16112:12;:25::i;:::-;:33;;15963:190;-1:-1:-1;;;;15963:190:0:o;32195:321::-;32325:18;32331:2;32335:7;32325:5;:18::i;:::-;32376:54;32407:1;32411:2;32415:7;32424:5;32376:22;:54::i;:::-;32354:154;;;;-1:-1:-1;;;32354:154:0;;;;;;;:::i;35595:799::-;35750:4;-1:-1:-1;;;;;35771:13:0;;3926:20;3974:8;35767:620;;35807:72;;-1:-1:-1;;;35807:72:0;;-1:-1:-1;;;;;35807:36:0;;;;;:72;;753:10;;35858:4;;35864:7;;35873:5;;35807:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35807:72:0;;;;;;;;-1:-1:-1;;35807:72:0;;;;;;;;;;;;:::i;:::-;;;35803:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36049:13:0;;36045:272;;36092:60;;-1:-1:-1;;;36092:60:0;;;;;;;:::i;36045:272::-;36267:6;36261:13;36252:6;36248:2;36244:15;36237:38;35803:529;-1:-1:-1;;;;;;35930:51:0;-1:-1:-1;;;35930:51:0;;-1:-1:-1;35923:58:0;;35767:620;-1:-1:-1;36371:4:0;35595:799;;;;;;:::o;16514:675::-;16597:7;16640:4;16597:7;16655:497;16679:5;:12;16675:1;:16;16655:497;;;16713:20;16736:5;16742:1;16736:8;;;;;;;;:::i;:::-;;;;;;;16713:31;;16779:12;16763;:28;16759:382;;17265:13;17315:15;;;17351:4;17344:15;;;17398:4;17382:21;;16891:57;;16759:382;;;17265:13;17315:15;;;17351:4;17344:15;;;17398:4;17382:21;;17068:57;;16759:382;-1:-1:-1;16693:3:0;;;;:::i;:::-;;;;16655:497;;;-1:-1:-1;17169:12:0;16514:675;-1:-1:-1;;;16514:675:0:o;32852:382::-;-1:-1:-1;;;;;32932:16:0;;32924:61;;;;-1:-1:-1;;;32924:61:0;;13102:2:1;32924:61:0;;;13084:21:1;;;13121:18;;;13114:30;13180:34;13160:18;;;13153:62;13232:18;;32924:61:0;12900:356:1;32924:61:0;30939:4;30963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30963:16:0;:30;32996:58;;;;-1:-1:-1;;;32996:58:0;;9214:2:1;32996:58:0;;;9196:21:1;9253:2;9233:18;;;9226:30;9292;9272:18;;;9265:58;9340:18;;32996:58:0;9012:352:1;32996:58:0;-1:-1:-1;;;;;33125:13:0;;;;;;:9;:13;;;;;:18;;33142:1;;33125:13;:18;;33142:1;;33125:18;:::i;:::-;;;;-1:-1:-1;;33154:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33154:21:0;-1:-1:-1;;;;;33154:21:0;;;;;;;;33193:33;;33154:16;;;33193:33;;33154:16;;33193:33;32852:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:160::-;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;1984:18;1976:6;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:963::-;2830:6;2861:2;2904;2892:9;2883:7;2879:23;2875:32;2872:52;;;2920:1;2917;2910:12;2872:52;2960:9;2947:23;2989:18;3030:2;3022:6;3019:14;3016:34;;;3046:1;3043;3036:12;3016:34;3084:6;3073:9;3069:22;3059:32;;3129:7;3122:4;3118:2;3114:13;3110:27;3100:55;;3151:1;3148;3141:12;3100:55;3187:2;3174:16;3209:2;3205;3202:10;3199:36;;;3215:18;;:::i;:::-;3261:2;3258:1;3254:10;3244:20;;3284:28;3308:2;3304;3300:11;3284:28;:::i;:::-;3346:15;;;3377:12;;;;3409:11;;;3439;;;3435:20;;3432:33;-1:-1:-1;3429:53:1;;;3478:1;3475;3468:12;3429:53;3500:1;3491:10;;3510:169;3524:2;3521:1;3518:9;3510:169;;;3581:23;3600:3;3581:23;:::i;:::-;3569:36;;3542:1;3535:9;;;;;3625:12;;;;3657;;3510:169;;;-1:-1:-1;3698:5:1;2746:963;-1:-1:-1;;;;;;;;2746:963:1:o;3714:180::-;3770:6;3823:2;3811:9;3802:7;3798:23;3794:32;3791:52;;;3839:1;3836;3829:12;3791:52;3862:26;3878:9;3862:26;:::i;3899:180::-;3958:6;4011:2;3999:9;3990:7;3986:23;3982:32;3979:52;;;4027:1;4024;4017:12;3979:52;-1:-1:-1;4050:23:1;;3899:180;-1:-1:-1;3899:180:1:o;4084:245::-;4142:6;4195:2;4183:9;4174:7;4170:23;4166:32;4163:52;;;4211:1;4208;4201:12;4163:52;4250:9;4237:23;4269:30;4293:5;4269:30;:::i;4334:249::-;4403:6;4456:2;4444:9;4435:7;4431:23;4427:32;4424:52;;;4472:1;4469;4462:12;4424:52;4504:9;4498:16;4523:30;4547:5;4523:30;:::i;4588:450::-;4657:6;4710:2;4698:9;4689:7;4685:23;4681:32;4678:52;;;4726:1;4723;4716:12;4678:52;4766:9;4753:23;4799:18;4791:6;4788:30;4785:50;;;4831:1;4828;4821:12;4785:50;4854:22;;4907:4;4899:13;;4895:27;-1:-1:-1;4885:55:1;;4936:1;4933;4926:12;4885:55;4959:73;5024:7;5019:2;5006:16;5001:2;4997;4993:11;4959:73;:::i;5228:683::-;5323:6;5331;5339;5392:2;5380:9;5371:7;5367:23;5363:32;5360:52;;;5408:1;5405;5398:12;5360:52;5444:9;5431:23;5421:33;;5505:2;5494:9;5490:18;5477:32;5528:18;5569:2;5561:6;5558:14;5555:34;;;5585:1;5582;5575:12;5555:34;5623:6;5612:9;5608:22;5598:32;;5668:7;5661:4;5657:2;5653:13;5649:27;5639:55;;5690:1;5687;5680:12;5639:55;5730:2;5717:16;5756:2;5748:6;5745:14;5742:34;;;5772:1;5769;5762:12;5742:34;5825:7;5820:2;5810:6;5807:1;5803:14;5799:2;5795:23;5791:32;5788:45;5785:65;;;5846:1;5843;5836:12;5785:65;5877:2;5873;5869:11;5859:21;;5899:6;5889:16;;;;;5228:683;;;;;:::o;5916:257::-;5957:3;5995:5;5989:12;6022:6;6017:3;6010:19;6038:63;6094:6;6087:4;6082:3;6078:14;6071:4;6064:5;6060:16;6038:63;:::i;:::-;6155:2;6134:15;-1:-1:-1;;6130:29:1;6121:39;;;;6162:4;6117:50;;5916:257;-1:-1:-1;;5916:257:1:o;6412:470::-;6591:3;6629:6;6623:13;6645:53;6691:6;6686:3;6679:4;6671:6;6667:17;6645:53;:::i;:::-;6761:13;;6720:16;;;;6783:57;6761:13;6720:16;6817:4;6805:17;;6783:57;:::i;:::-;6856:20;;6412:470;-1:-1:-1;;;;6412:470:1:o;7095:488::-;-1:-1:-1;;;;;7364:15:1;;;7346:34;;7416:15;;7411:2;7396:18;;7389:43;7463:2;7448:18;;7441:34;;;7511:3;7506:2;7491:18;;7484:31;;;7289:4;;7532:45;;7557:19;;7549:6;7532:45;:::i;:::-;7524:53;7095:488;-1:-1:-1;;;;;;7095:488:1:o;7962:219::-;8111:2;8100:9;8093:21;8074:4;8131:44;8171:2;8160:9;8156:18;8148:6;8131:44;:::i;8186:414::-;8388:2;8370:21;;;8427:2;8407:18;;;8400:30;8466:34;8461:2;8446:18;;8439:62;-1:-1:-1;;;8532:2:1;8517:18;;8510:48;8590:3;8575:19;;8186:414::o;12549:346::-;12751:2;12733:21;;;12790:2;12770:18;;;12763:30;-1:-1:-1;;;12824:2:1;12809:18;;12802:52;12886:2;12871:18;;12549:346::o;13674:356::-;13876:2;13858:21;;;13895:18;;;13888:30;13954:34;13949:2;13934:18;;13927:62;14021:2;14006:18;;13674:356::o;15613:413::-;15815:2;15797:21;;;15854:2;15834:18;;;15827:30;15893:34;15888:2;15873:18;;15866:62;-1:-1:-1;;;15959:2:1;15944:18;;15937:47;16016:3;16001:19;;15613:413::o;16031:347::-;16233:2;16215:21;;;16272:2;16252:18;;;16245:30;16311:25;16306:2;16291:18;;16284:53;16369:2;16354:18;;16031:347::o;16383:346::-;16585:2;16567:21;;;16624:2;16604:18;;;16597:30;-1:-1:-1;;;16658:2:1;16643:18;;16636:52;16720:2;16705:18;;16383:346::o;16734:403::-;16936:2;16918:21;;;16975:2;16955:18;;;16948:30;17014:34;17009:2;16994:18;;16987:62;-1:-1:-1;;;17080:2:1;17065:18;;17058:37;17127:3;17112:19;;16734:403::o;18783:275::-;18854:2;18848:9;18919:2;18900:13;;-1:-1:-1;;18896:27:1;18884:40;;18954:18;18939:34;;18975:22;;;18936:62;18933:88;;;19001:18;;:::i;:::-;19037:2;19030:22;18783:275;;-1:-1:-1;18783:275:1:o;19063:128::-;19103:3;19134:1;19130:6;19127:1;19124:13;19121:39;;;19140:18;;:::i;:::-;-1:-1:-1;19176:9:1;;19063:128::o;19196:120::-;19236:1;19262;19252:35;;19267:18;;:::i;:::-;-1:-1:-1;19301:9:1;;19196:120::o;19321:168::-;19361:7;19427:1;19423;19419:6;19415:14;19412:1;19409:21;19404:1;19397:9;19390:17;19386:45;19383:71;;;19434:18;;:::i;:::-;-1:-1:-1;19474:9:1;;19321:168::o;19494:125::-;19534:4;19562:1;19559;19556:8;19553:34;;;19567:18;;:::i;:::-;-1:-1:-1;19604:9:1;;19494:125::o;19624:258::-;19696:1;19706:113;19720:6;19717:1;19714:13;19706:113;;;19796:11;;;19790:18;19777:11;;;19770:39;19742:2;19735:10;19706:113;;;19837:6;19834:1;19831:13;19828:48;;;-1:-1:-1;;19872:1:1;19854:16;;19847:27;19624:258::o;19887:380::-;19966:1;19962:12;;;;20009;;;20030:61;;20084:4;20076:6;20072:17;20062:27;;20030:61;20137:2;20129:6;20126:14;20106:18;20103:38;20100:161;;;20183:10;20178:3;20174:20;20171:1;20164:31;20218:4;20215:1;20208:15;20246:4;20243:1;20236:15;20100:161;;19887:380;;;:::o;20272:135::-;20311:3;-1:-1:-1;;20332:17:1;;20329:43;;;20352:18;;:::i;:::-;-1:-1:-1;20399:1:1;20388:13;;20272:135::o;20412:112::-;20444:1;20470;20460:35;;20475:18;;:::i;:::-;-1:-1:-1;20509:9:1;;20412:112::o;20529:127::-;20590:10;20585:3;20581:20;20578:1;20571:31;20621:4;20618:1;20611:15;20645:4;20642:1;20635:15;20661:127;20722:10;20717:3;20713:20;20710:1;20703:31;20753:4;20750:1;20743:15;20777:4;20774:1;20767:15;20793:127;20854:10;20849:3;20845:20;20842:1;20835:31;20885:4;20882:1;20875:15;20909:4;20906:1;20899:15;20925:127;20986:10;20981:3;20977:20;20974:1;20967:31;21017:4;21014:1;21007:15;21041:4;21038:1;21031:15;21057:131;-1:-1:-1;;;;;;21131:32:1;;21121:43;;21111:71;;21178:1;21175;21168:12

Swarm Source

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