ETH Price: $2,526.12 (-2.69%)

Token

WetWaifus (WET)
 

Overview

Max Total Supply

79 WET

Holders

45

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
taliskye.eth
Balance
3 WET
0x4a3e6E66f8C32bC05A50879f872B1177A1573CDF
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:
WetWaifus

Compiler Version
v0.8.5+commit.a4f2e591

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File contracts/MerkleProof.sol



pragma solidity ^0.8.5;

/**
 * @dev These functions deal with verification of Merkle trees (hash trees),
 */
contract MerkleProof is Ownable {
    // merkle tree root used to validate the provided address and assigned proof
    bytes32 public root;

    bool public canChangeMerkleRoot = true;

    /**
     * @dev Disable changes for merkle root
     */
    function disableMerkleRootChanges() external onlyOwner {
        require(canChangeMerkleRoot, "MerkleRoot changes are disabled");
        canChangeMerkleRoot = false;
    }

    /**
     * @dev Set the merkle tree root hash
     * @param _root hash to save
     */
    function setMerkleRoot(bytes32 _root) external onlyOwner {
        require(canChangeMerkleRoot, "The MerkleRoot can't be changed anymore");
        require(_root.length > 0, "Root is empty");
        root = _root;
    }

    /**
     * @dev Modifier to check if the sender can mint tokens
     * @param proof hashes to validate
     */
    modifier canMintEarly(bytes32[] memory proof) {
        require(isProofValid(proof), "the proof for this sender is not valid");
        _;
    }

    /**
     * @dev Check if the sender can mint tokens
     * @param proof hashes to validate
     */
    function isProofValid(bytes32[] memory proof) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return verify(leaf, proof);
    }

    /**
     * @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 leaf, bytes32[] memory proof)
        internal
        view
        returns (bool)
    {
        bytes32 computedHash = leaf;

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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



pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


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



pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

/**
 * @dev Storage based implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165Storage is ERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


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



pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File contracts/Fields.sol



pragma solidity >=0.8.5;

contract Fields {
    // emits BaseURIChanged event when the baseUri changes
    event BaseURIChanged(
        address indexed _owner,
        string initialBaseURI,
        string finalBaseURI
    );

    // maximum number of tokens that can be minted
    uint256 public constant MAX_TOKENS = 8008;
    // maximum number of tokens that can be early minted
    uint256 public constant MAX_EARLY_TOKENS = 25;
    // maximum number of tokens that can be early minted in the first day after minting has tarted
    uint256 public constant MAX_EARLY_TOKENS_FIRST_DAY = 10;
    // maximum number of tokens that can be minted in a single transaction
    uint256 public constant MAX_TOKENS_PER_PURCHASE = 25;
    // maximum number of blind tokens that can be minted in a single transaction
    uint256 public constant MAX_BLIND_TOKENS = 5;

    // the price to mint a token
    uint256 public constant MINT_PRICE = 20000000000000000; // 0.02 Ether

    // receiver address to ge the funds
    address[] public receiverAddresses;
    // receiver percentage of total funds
    uint256[] public receiverPercentages;
    // current balance to withdraw from contract by a specific address
    uint256[] internal currentTeamBalance;
    // mapping from address to index of receiverAddresses array
    mapping(address => uint8) internal addressToIndex;

    uint8 public MAX_TOKENS_BEFORE_BEFORE_WITHDRAW = 50;
    uint8 public currentMaxTokensBeforeWithdraw = 0;

    uint16 percentCommunity = 769; // 1% of sales
    uint16 percentCharity = 3077; // 4% of sales
    uint16 percentMarketing = 3077; // 4% of sales
    uint16 percentReserve = 3077; // 4% of sales

    uint256 internal oneHundred = 100;

    mapping(uint8 => uint256) comunityTotalBalanceEarned;
    mapping(uint8 => uint256) communityBalanceSpent;

    // flag that signals if blind minting is started
    bool public blindMintingStarted = false;
    // maximum number of time that the blind minting is open
    uint256 public blindMintingTime = 5 hours;
    // save the number of tokens blind minters have minted
    mapping(address => uint256) public blindMintedTokensByOwner;

    // ealry miting one day time
    uint256 public EARLY_MINT_TIME_ONE_DAY = 1 days;
    // maximum ealry minting time
    uint256 public MAX_EALRY_MINTING_TIME = 3 days;

    // Reserved tokens for Team/Giveaways/Prises etc
    uint256 public reservedTokens = 200;
    // Already minted reserved tokens
    uint256 public mintedReservedTokens = 0;

    // minting start time
    uint256 public mintingStartTime;
    // flag for verifying if minting was started or not
    bool public isMintingStarted = false;

    // allow early adopters to mint tokens. Once disabled can't be enabled back
    bool public earlyMinting = true;
    // save the number of tokens early minters have minted
    mapping(address => uint256) public earlyMintedTokensByOwner;

    // flag to signal if the owner can change the baseURI
    bool public canChangeBaseURI = true;
    // the baseURI for token metadata
    string public baseURI = "";

    // flag to signal if the owner can change the provenance
    bool public canChangeProvenance = true;
    // provenance proof for hashed images
    string public provenance = "";

    // nonce to be used on generating the random token id
    uint256 internal nonce = 0;
    uint256[MAX_TOKENS] internal indices;

    // maximum number of tokens with trap
    uint256 public MAX_TRAPPED_TOKENS = 500;
    // list of token ids with traps
    uint256[] public tokenIdsWithTrap;
    // mapping tokenIds to trap flag
    mapping(uint256 => bool) public hasTrap;
    // previous random number used to compute the next one
    uint256 internal previousRandomNumber;
    // trap description
    string public trapMessage = "";
    // flag to signal if the owner can change trap message
    bool public canChangeTrapMessage = true;
}


// File contracts/Utils.sol



pragma solidity >=0.8.5;












abstract contract Utils is
    Fields,
    MerkleProof,
    ERC165Storage,
    ERC721Pausable,
    ERC721Enumerable,
    ReentrancyGuard
{
    /*
     * accepts ether sent with no txData
     */
    receive() external payable {}

    /*
     * refuses ether sent with txData that does not match any function signature in the contract
     */
    fallback() external {}

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function pause() public onlyOwner {
        super._pause();
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function unpause() public onlyOwner {
        super._unpause();
    }

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

    /**
     * @dev Send an amount of value to a specific address
     * @param to_ address that will receive the value
     * @param value to be sent to the address
     */
    function sendValueTo(address to_, uint256 value) internal {
        address payable to = payable(to_);
        (bool success, ) = to.call{value: value}("");
        require(success, "Transfer failed.");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     * @param from address from which to transfer the token
     * @param to address to which to transfer the token
     * @param tokenId to transfer
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        super.safeTransferFrom(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-transferFrom}.
     * @param from address from which to transfer the token
     * @param to address to which to transfer the token
     * @param tokenId to transfer
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        super.transferFrom(from, to, tokenId);
    }

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721Pausable, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Get the ETH balance of the current contract
     */
    function getBalance() public view returns (uint256) {
        return address(this).balance;
    }

    /**
     * @dev Get the remaining contract balance
     */
    function getRemainingContractBalance() public view returns (uint256) {
        uint256 balance = address(this).balance;
        uint256 teamBalance = 0;
        for (uint8 i = 0; i < currentTeamBalance.length; i++) {
            teamBalance += currentTeamBalance[i];
        }
        if (balance > teamBalance) {
            return balance - teamBalance;
        }
        return 0;
    }

    /**
     * @dev Withdraw remaining contract balance to owner
     */
    function withdrawRemainingContractBalance() public onlyOwner {
        uint256 remainingBalance = getRemainingContractBalance();
        require(
            remainingBalance > 0,
            "There is no contract balance to withdraw"
        );
        sendValueTo(owner(), remainingBalance);
    }

    /**
     * @dev baseURI for computing {tokenURI}. Empty by default, can be overwritten
     * in child contracts.
     */
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    /**
     * @dev Disable changes for provenance
     */
    function disableProvenanceChange() external onlyOwner {
        require(canChangeProvenance, "Provenance changes are disabled");
        canChangeProvenance = false;
    }

    /**
     * @dev Set the NFT IPFS hash proof for tokens metadata
     * @param provenance_ string to save
     */
    function setProvenance(string memory provenance_) public onlyOwner {
        require(canChangeProvenance, "Provenance can't be changed anymore");
        require(bytes(provenance_).length > 0, "provenance is empty");
        provenance = provenance_;
    }

    /**
     * @dev Get the list of tokens for a specific owner
     * @param _owner address to retrieve token ids for
     */
    function tokensByOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    /**
     * @dev Disable changes for baseURI
     */
    function disableBaseURIChanges() external onlyOwner {
        require(canChangeBaseURI, "BaseURI changes are disabled");
        canChangeBaseURI = false;
    }

    /**
     * @dev Set the baseURI to a given uri
     * @param baseURI_ string to save
     */
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        require(canChangeBaseURI, "The baseURI can't be changed anymore");
        require(!blindMintingStarted, "Blind minting is started");
        require(bytes(baseURI_).length > 0, "baseURI is empty");
        emit BaseURIChanged(msg.sender, baseURI, baseURI_);
        baseURI = baseURI_;
    }

    /**
     * Get a random number used to check if a token has a trap
     */
    function getTrapRandom(uint256 id) internal returns (uint256) {
        uint256 number = uint256(
            keccak256(
                abi.encodePacked(
                    id,
                    previousRandomNumber,
                    nonce,
                    msg.sender,
                    block.difficulty,
                    block.timestamp
                )
            )
        ) % MAX_TOKENS;
        previousRandomNumber = number;
        return number;
    }

    /**
     * Credits to LarvaLabs Meebits contract
     */
    function randomIndex() internal returns (uint256) {
        uint256 totalSize = MAX_TOKENS - totalSupply();
        uint256 index = uint256(
            keccak256(
                abi.encodePacked(
                    nonce,
                    msg.sender,
                    block.difficulty,
                    block.timestamp
                )
            )
        ) % totalSize;
        uint256 value = 0;

        if (indices[index] != 0) {
            value = indices[index];
        } else {
            value = index;
        }
        // Move last value to selected position
        if (indices[totalSize - 1] == 0) {
            // Array position not initialized, so use position
            indices[index] = totalSize - 1;
        } else {
            // Array position holds a value so use that
            indices[index] = indices[totalSize - 1];
        }
        nonce++;
        // Don't allow a zero index, start counting at 1
        return value + 1;
    }
}


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



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File contracts/WetWaifus.sol



pragma solidity >=0.8.5;

contract WetWaifus is Utils {
    using SafeMath for uint256;

    constructor(
        string memory name_,
        string memory symbol_,
        address[] memory receiverAddresses_,
        uint256[] memory receiverPercentages_
    ) ERC721(name_, symbol_) {
        require(
            receiverAddresses.length == receiverPercentages.length,
            "Addresses and percentage lengths are not the same"
        );

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(type(IERC721).interfaceId);
        _registerInterface(type(IERC721Metadata).interfaceId);
        _registerInterface(type(IERC721Enumerable).interfaceId);

        receiverAddresses = receiverAddresses_;
        receiverPercentages = receiverPercentages_;

        currentTeamBalance = new uint256[](receiverAddresses.length);

        for (uint8 i = 0; i < receiverAddresses.length; i++) {
            addressToIndex[receiverAddresses[i]] = i + 1;
        }
    }

    /**
     * @dev Return the community address
     */
    function getCommuntiyAddress() public view returns (address) {
        return receiverAddresses[receiverAddresses.length - 1];
    }

    /**
     * @dev Get the current balance of a calling team member
     */
    function getCurrentTeamMemberBalanceToWithdraw()
        public
        view
        returns (uint256)
    {
        uint8 index = addressToIndex[msg.sender];
        require(index > 0, "The sender doesn't have balance");
        return currentTeamBalance[index - 1];
    }

    /**
     * @dev Withdraw the entire balance of calling team member
     */
    function withdrawBalance() public {
        require(
            msg.sender != getCommuntiyAddress(),
            "Can't withdraw community balance from this function"
        );
        uint8 index = addressToIndex[msg.sender];
        require(index > 0, "The sender is not allowed to check the balance");
        index -= 1;
        uint256 value = currentTeamBalance[index];
        require(value > 0, "No balance to withdraw");
        currentTeamBalance[index] = 0;
        sendValueTo(msg.sender, value);
    }

    /**
     * @dev Change the address of the calling team member
     * @param newAddress to witch to update to
     */
    function changeAddress(address newAddress) public {
        uint8 index = addressToIndex[msg.sender];
        require(index > 0, "The sender is not allowed to change the address");
        addressToIndex[msg.sender] = 0;
        addressToIndex[newAddress] = index;
        receiverAddresses[index - 1] = newAddress;
    }

    /**
     * @dev Get the total balance collected for the community wallet
     */
    function getTotalEarnedCommunityWalletBalance()
        public
        view
        returns (uint256)
    {
        return comunityTotalBalanceEarned[0];
    }

    /**
     * @dev Get the remaining balance for the community wallet
     */
    function getCommunityWalletBalance() public view returns (uint256) {
        return
            getTotalEarnedCommunityWalletBalance() - communityBalanceSpent[0];
    }

    /**
     * @dev Get the total balance collected for the charity
     */
    function getTotalEarnedCharityBalance() public view returns (uint256) {
        return comunityTotalBalanceEarned[1];
    }

    /**
     * @dev Get the remaining balance for the charity
     */
    function geCharityBalance() public view returns (uint256) {
        return getTotalEarnedCharityBalance() - communityBalanceSpent[1];
    }

    /**
     * @dev Get the total balance collected for marketing
     */
    function getTotalEarnedMarketingBalance() public view returns (uint256) {
        return comunityTotalBalanceEarned[2];
    }

    /**
     * @dev Get the remaining balance for marketing
     */
    function geMarketingBalance() public view returns (uint256) {
        return getTotalEarnedMarketingBalance() - communityBalanceSpent[2];
    }

    /**
     * @dev Get the total balance collected for the reserve
     */
    function getTotalEarnedReserveBalance() public view returns (uint256) {
        return comunityTotalBalanceEarned[3];
    }

    /**
     * @dev Get the remaining balance for reserve
     */
    function geReserveBalance() public view returns (uint256) {
        return getTotalEarnedReserveBalance() - communityBalanceSpent[3];
    }

    /**
     * @dev Check if the sender matches the community address
     */
    modifier checkIfIsCommunityAddress() {
        require(
            msg.sender == getCommuntiyAddress(),
            "The sender is not the community address"
        );
        _;
    }

    /**
     * @dev Withdraw the all the community wallet funds
     */
    function withdrawCommunityWallet() public checkIfIsCommunityAddress {
        withdrawCommunityWalletTo(msg.sender, 0);
    }

    /**
     * @dev Withdraw the community balance to a given address
     * @param to is the address to witch to send the funds
     * @param balance are the funds that has to be sent to the address
     */
    function withdrawCommunityWalletTo(address to, uint256 balance)
        public
        checkIfIsCommunityAddress
    {
        _withdrawFromCommunityTo(0, percentCommunity, to, balance);
    }

    /**
     * @dev Withdraw all the the charirty funds
     */
    function withdrawCharity() public checkIfIsCommunityAddress {
        withdrawCharityTo(msg.sender, 0);
    }

    /**
     * @dev Withdraw the charity funds to a given address
     * @param to is the address to witch to send the funds
     * @param balance are the funds that has to be sent to the address
     */
    function withdrawCharityTo(address to, uint256 balance)
        public
        checkIfIsCommunityAddress
    {
        _withdrawFromCommunityTo(1, percentCharity, to, balance);
    }

    /**
     * @dev Withdraw all the marketing funfs
     */
    function withdrawMarketing() public checkIfIsCommunityAddress {
        withdrawMarketingTo(msg.sender, 0);
    }

    /**
     * @dev Withdraw the marketing balance to a given address
     * @param to is the address to witch to send the funds
     * @param balance are the funds that has to be sent to the address
     */
    function withdrawMarketingTo(address to, uint256 balance)
        public
        checkIfIsCommunityAddress
    {
        _withdrawFromCommunityTo(2, percentMarketing, to, balance);
    }

    /**
     * @dev Withdraw all the reserve funds
     */
    function withdrawReserve() public checkIfIsCommunityAddress {
        withdrawReserveTo(msg.sender, 0);
    }

    /**
     * @dev Withdraw the reserve balance to a given address
     * @param to is the address to witch to send the funds
     * @param balance are the funds that has to be sent to the address
     */
    function withdrawReserveTo(address to, uint256 balance)
        public
        checkIfIsCommunityAddress
    {
        _withdrawFromCommunityTo(3, percentReserve, to, balance);
    }

    /**
     * @dev Withdraw the specidifed balance to a given address
     * @param walletIndex is the index for community/charity/marketing/reserve
     * @param percent is the maximum balance to withdraw
     * @param to is the address to witch to send the funds
     * @param balance are the funds that has to be sent to the address
     */
    function _withdrawFromCommunityTo(
        uint8 walletIndex,
        uint16 percent,
        address to,
        uint256 balance
    ) private {
        uint8 index = addressToIndex[msg.sender];
        index -= 1;
        uint256 value = currentTeamBalance[index];
        require(value > 0, "No balance to withdraw");
        uint256 availableBalance = (value * percent) / oneHundred**2;
        if (balance > 0) {
            require(availableBalance >= balance, "Too much to witdraw");
            currentTeamBalance[index] -= balance;
            communityBalanceSpent[walletIndex] += balance;
            sendValueTo(to, balance);
        } else {
            currentTeamBalance[index] -= availableBalance;
            communityBalanceSpent[walletIndex] += availableBalance;
            sendValueTo(to, availableBalance);
        }
    }

    /**
     * @dev Enable minting of tokens
     */
    function startMinting() public onlyOwner {
        require(!isMintingStarted, "Minting is already started");
        mintingStartTime = block.timestamp;
        isMintingStarted = true;
        blindMintingStarted = true;
    }

    /**
     * @dev Disable changes for trap message
     */
    function disableTrapMessageChanges() external onlyOwner {
        require(canChangeTrapMessage, "The trap message changes are disabled");
        canChangeTrapMessage = false;
    }

    /**
     * @dev Set the trap message
     * @param trapMessage_ string to save
     */
    function changeTrapMessage(string memory trapMessage_) public onlyOwner {
        require(
            canChangeTrapMessage,
            "The trap message can't be changed anymore"
        );
        require(bytes(trapMessage_).length > 0, "trap message is empty");
        trapMessage = trapMessage_;
    }

    /**
     * @dev Disable blind minting
     */
    function disableBlindMinting() external onlyOwner {
        require(isMintingStarted, "Minting hasn't started yet");
        require(blindMintingStarted, "Blind minting already disabled");
        blindMintingStarted = false;
        mintingStartTime = block.timestamp;
    }

    /**
     * @dev Disable early minting
     */
    function disableEarlyMinting() external onlyOwner {
        require(earlyMinting, "Early minting already disabled");
        earlyMinting = false;
    }

    /**
     * @dev Mint tokens for community wallet
     */
    function mintToCommunityWallet(uint8 _count) external {
        // TODO add onlyOwner
        require(
            _count > 0 && _count <= reservedTokens,
            "Too many reserved tokens to mint at once"
        );
        require(
            _count + mintedReservedTokens <= reservedTokens,
            "Too many reserved tokens to mint"
        );
        mintedReservedTokens += _count;
        mintNTokensFor(getCommuntiyAddress(), _count);
    }

    /**
     * @dev Mint blind tokens
     * @param _count the number of tokens to be minted
     */
    function blindMint(uint8 _count) public payable nonReentrant {
        require(isMintingStarted, "Minting hasn't started yet");
        require(blindMintingStarted, "Blind minting is not started");
        require(
            block.timestamp - mintingStartTime <= blindMintingTime,
            "Blind minting has passed"
        );
        require(_count <= MAX_BLIND_TOKENS, "To many blind tokens to mint");
        require(
            _count + blindMintedTokensByOwner[msg.sender] <= MAX_BLIND_TOKENS,
            "Too many blind tokens to mint in total"
        );
        blindMintedTokensByOwner[msg.sender] += _count;
        _mint(_count);
    }

    /**
     * @dev Mint tokens early
     * @param _count the number of tokens to be minted
     * @param proof to validate if the sender can mint the tokens early
     */
    function earlyMint(uint8 _count, bytes32[] memory proof)
        public
        payable
        nonReentrant
        canMintEarly(proof)
    {
        require(isMintingStarted, "Minting hasn't started yet");
        require(!blindMintingStarted, "Blind minting is started");
        require(
            block.timestamp - mintingStartTime <= MAX_EALRY_MINTING_TIME,
            "Early minting has passed"
        );
        require(
            earlyMinting,
            "The early minting is disabled. Use the mint function"
        );
        if (block.timestamp - mintingStartTime <= EARLY_MINT_TIME_ONE_DAY) {
            require(
                _count <= MAX_EARLY_TOKENS_FIRST_DAY,
                "To many tokens to be minted early in the first day"
            );
            require(
                _count + earlyMintedTokensByOwner[msg.sender] <=
                    MAX_EARLY_TOKENS_FIRST_DAY,
                "Too many early tokens to mint in total"
            );
        } else {
            require(
                _count <= MAX_EARLY_TOKENS,
                "Too many early tokens to mint"
            );
            require(
                _count + earlyMintedTokensByOwner[msg.sender] <=
                    MAX_EARLY_TOKENS,
                "Too many early tokens to mint in total"
            );
        }
        earlyMintedTokensByOwner[msg.sender] += _count;
        _mint(_count);
    }

    /**
     * @dev Mint new tokens
     * @param _count the number of tokens to be minted
     */
    function mint(uint8 _count) public payable nonReentrant {
        require(isMintingStarted, "Minting hasn't started yet");
        require(!blindMintingStarted, "Blind minting is started");
        require(
            !earlyMinting,
            "The early minting is enabled. Use earlyMint function"
        );
        _mint(_count);
    }

    /**
     * Check if the token can have the trap
     */
    function checkAndSaveTrap(uint256 id) internal {
        if (tokenIdsWithTrap.length == MAX_TRAPPED_TOKENS) {
            return;
        }
        uint256 number = getTrapRandom(id);
        if (number < MAX_TRAPPED_TOKENS) {
            hasTrap[id] = true;
            tokenIdsWithTrap.push(id);
        }
    }

    /**
     * @dev Mint n tokens for an address
     * @param to address to mint tokens for
     * @param n number of tokens to mint
     */
    function mintNTokensFor(address to, uint8 n) internal {
        for (uint8 i = 0; i < n; i++) {
            _mintToken(to);
        }
    }

    /**
     * @dev Mint token for an address
     * @param to address to mint token for
     */
    function _mintToken(address to) internal {
        uint256 id = randomIndex();
        checkAndSaveTrap(id);
        _safeMint(to, id);
    }

    /**
     * @dev Mint new tokens
     * @param _count the number of tokens to be minted
     */
    function _mint(uint8 _count) internal {
        require(!paused(), "Minting is paused");
        uint256 totalSupply = totalSupply();

        require(
            _count <= MAX_TOKENS_PER_PURCHASE,
            "Exceeds maximum tokens per transaction"
        );
        require(
            totalSupply + _count <= MAX_TOKENS - reservedTokens,
            "Exceeds maximum tokens available to mint"
        );
        require(
            msg.value == MINT_PRICE.mul(_count),
            "Mint value is not the expected one"
        );

        for (uint256 i = 0; i < _count; i++) {
            _mintToken(msg.sender);
        }

        distributePayout(_count);
    }

    /**
     * @dev Distribute the mint value to team and community
     * @param _count the number of tokens that were minted
     */
    function distributePayout(uint8 _count) internal {
        uint256 value = msg.value;
        uint8 n = uint8(receiverAddresses.length);
        if (
            currentMaxTokensBeforeWithdraw + _count <=
            MAX_TOKENS_BEFORE_BEFORE_WITHDRAW
        ) {
            currentMaxTokensBeforeWithdraw += _count;
            for (uint8 i = 0; i < n; i++) {
                uint256 newBalance = (value * receiverPercentages[i]) /
                    oneHundred;
                currentTeamBalance[i] += newBalance;
                if (i == n - 1) {
                    _assignCommunityBalance(newBalance);
                }
            }
            return;
        }

        currentMaxTokensBeforeWithdraw = 0;
        // the community funds are not sent automatically
        for (uint8 i = 0; i < receiverAddresses.length; i++) {
            uint256 valueToSend = (value * receiverPercentages[i]) / oneHundred;
            if (i == n - 1) {
                _assignCommunityBalance(valueToSend);
            } else {
                valueToSend += currentTeamBalance[i];
                currentTeamBalance[i] = 0;
                sendValueTo(receiverAddresses[i], valueToSend);
            }
        }
    }

    /**
     * @dev Distribute the community percent to communityWallet/charity/marketing/reserve
     * @param newBalance to distribute
     */
    function _assignCommunityBalance(uint256 newBalance) private {
        comunityTotalBalanceEarned[0] +=
            (newBalance * percentCommunity) /
            oneHundred**2;
        comunityTotalBalanceEarned[2] +=
            (newBalance * percentCharity) /
            oneHundred**2;
        comunityTotalBalanceEarned[1] +=
            (newBalance * percentMarketing) /
            oneHundred**2;
        comunityTotalBalanceEarned[3] +=
            (newBalance * percentReserve) /
            oneHundred**2;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address[]","name":"receiverAddresses_","type":"address[]"},{"internalType":"uint256[]","name":"receiverPercentages_","type":"uint256[]"}],"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":"_owner","type":"address"},{"indexed":false,"internalType":"string","name":"initialBaseURI","type":"string"},{"indexed":false,"internalType":"string","name":"finalBaseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"EARLY_MINT_TIME_ONE_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BLIND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EALRY_MINTING_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EARLY_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EARLY_TOKENS_FIRST_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_BEFORE_BEFORE_WITHDRAW","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TRAPPED_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"blindMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blindMintedTokensByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blindMintingStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blindMintingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canChangeBaseURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canChangeMerkleRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canChangeProvenance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canChangeTrapMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"changeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"trapMessage_","type":"string"}],"name":"changeTrapMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentMaxTokensBeforeWithdraw","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableBaseURIChanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableBlindMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableEarlyMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableMerkleRootChanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableProvenanceChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTrapMessageChanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_count","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"earlyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"earlyMintedTokensByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"geCharityBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"geMarketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"geReserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCommunityWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCommuntiyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTeamMemberBalanceToWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalEarnedCharityBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalEarnedCommunityWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalEarnedMarketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalEarnedReserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hasTrap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintingStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isProofValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"mintToCommunityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedReservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingStartTime","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"receiverAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"receiverPercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance_","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdsWithTrap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trapMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawCharity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"withdrawCharityTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawCommunityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"withdrawCommunityWalletTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"withdrawMarketingTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRemainingContractBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"withdrawReserveTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60048054690c050c050c05030100326001600160501b031990911617905560646005556008805460ff1990811690915561465060095562015180600b556203f480600c5560c8600d556000600e8190556010805461ffff19166101001790556012805490921660011790915560a06040819052608082905262000086916013919062000422565b506014805460ff19166001179055604080516020810191829052600090819052620000b49160159162000422565b50600060168190556101f4611f5f55604080516020810191829052829052620000e291611f63919062000422565b50611f648054600160ff199182168117909255611f66805490911690911790553480156200010f57600080fd5b5060405162005d2438038062005d2483398101604081905262000132916200066c565b83836200013f3362000345565b81516200015590611f6890602085019062000422565b5080516200016c90611f6990602084019062000422565b5050611f6e805460ff19169055506001611f738190555460005414620001f35760405162461bcd60e51b815260206004820152603160248201527f41646472657373657320616e642070657263656e74616765206c656e6774687360448201527020617265206e6f74207468652073616d6560781b60648201526084015b60405180910390fd5b620002056380ac58cd60e01b620003a0565b62000217635b5e139f60e01b620003a0565b6200022963780e9d6360e01b620003a0565b81516200023e906000906020850190620004b1565b5080516200025490600190602084019062000509565b506000546001600160401b03811115620002725762000272620008a8565b6040519080825280602002602001820160405280156200029c578160200160208202803683370190505b508051620002b39160029160209091019062000509565b5060005b60005460ff821610156200033a57620002d2816001620007f4565b60036000808460ff1681548110620002ee57620002ee62000892565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191660ff9290921691909117905580620003318162000859565b915050620002b7565b5050505050620008be565b611f6480546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b03198082161415620003fc5760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e74657266616365206964000000006044820152606401620001ea565b6001600160e01b0319166000908152611f6760205260409020805460ff19166001179055565b82805462000430906200081c565b90600052602060002090601f0160209004810192826200045457600085556200049f565b82601f106200046f57805160ff19168380011785556200049f565b828001600101855582156200049f579182015b828111156200049f57825182559160200191906001019062000482565b50620004ad92915062000546565b5090565b8280548282559060005260206000209081019282156200049f579160200282015b828111156200049f57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620004d2565b8280548282559060005260206000209081019282156200049f57916020028201828111156200049f57825182559160200191906001019062000482565b5b80821115620004ad576000815560010162000547565b600082601f8301126200056f57600080fd5b81516020620005886200058283620007ce565b6200079b565b80838252828201915082860187848660051b8901011115620005a957600080fd5b60005b85811015620005ca57815184529284019290840190600101620005ac565b5090979650505050505050565b600082601f830112620005e957600080fd5b81516001600160401b03811115620006055762000605620008a8565b60206200061b601f8301601f191682016200079b565b82815285828487010111156200063057600080fd5b60005b838110156200065057858101830151828201840152820162000633565b83811115620006625760008385840101525b5095945050505050565b600080600080608085870312156200068357600080fd5b84516001600160401b03808211156200069b57600080fd5b620006a988838901620005d7565b9550602091508187015181811115620006c157600080fd5b620006cf89828a01620005d7565b955050604087015181811115620006e557600080fd5b8701601f81018913620006f757600080fd5b8051620007086200058282620007ce565b8082825285820191508584018c878560051b87010111156200072957600080fd5b600094505b83851015620007645780516001600160a01b03811681146200074f57600080fd5b8352600194909401939186019186016200072e565b5060608b01519097509450505050808211156200078057600080fd5b506200078f878288016200055d565b91505092959194509250565b604051601f8201601f191681016001600160401b0381118282101715620007c657620007c6620008a8565b604052919050565b60006001600160401b03821115620007ea57620007ea620008a8565b5060051b60200190565b600060ff821660ff84168060ff038211156200081457620008146200087c565b019392505050565b600181811c908216806200083157607f821691505b602082108114156200085357634e487b7160e01b600052602260045260246000fd5b50919050565b600060ff821660ff8114156200087357620008736200087c565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61545680620008ce6000396000f3fe6080604052600436106105115760003560e01c80636c0360eb11610297578063ace1fab111610165578063d399ba8b116100cc578063eb74cc7d11610085578063eb74cc7d14610f38578063ebf0c71714610f4e578063f2fde38b14610f65578063f47c84c514610f85578063fe64d6ff14610f9b578063ffe630b514610fbb57610518565b8063d399ba8b14610e52578063d8c03be914610e67578063dfef5f6914610e87578063e1d08eea14610e9d578063e788348a14610eb0578063e985e9c514610eee57610518565b8063c1faac531161011e578063c1faac5314610daf578063c4bf61be14610dce578063c7f5fee614610de3578063c87b56dd14610df8578063c907759f14610e18578063d01b2f1114610e3857610518565b8063ace1fab114610d1e578063b0b1d1c514610d33578063b2659fe014610d4a578063b88d4fde14610d5f578063bd218e7414610d7f578063c002d23d14610d9457610518565b806393e0ef75116102095780639f490da0116101c25780639f490da014610c81578063a07de77514610c96578063a22cb46514610cb5578063a769b78614610cd5578063a84894b814610cea578063ab61391b14610d0457610518565b806393e0ef751461073757806395d89b4114610bde5780639a65ea2614610bf35780639cc2b39c14610c085780639ea5505514610c235780639ee8465814610c5057610518565b8063771e647a1161025b578063771e647a14610b115780637cb6475914610b275780637e24793014610b47578063819995d714610b675780638456cb5914610ba55780638da5cb5b14610bba57610518565b80636c0360eb14610a945780636ecd230614610aa957806370a0823114610abc578063715018a614610adc578063729f095314610af157610518565b80632713e2c2116103df57806349a3ccca116103465780635fd8c710116102ff5780635fd8c710146109d7578063624dc7a4146109ec5780636263605314610a195780636352211e14610a39578063671b6b0514610a595780636a82dd3d14610a7957610518565b806349a3ccca146109445780634f6ccce714610959578063535db374146109795780635c975abb1461098f5780635cf1971e146109a85780635cf4f865146109c257610518565b80633a653e9d116103985780633a653e9d146108ba5780633ccf6225146108cf5780633f4ba83a146108e55780633fcd5f56146108fa57806342842e0e1461090f57806348c2c0dc1461092f57610518565b80632713e2c2146108285780632f745c591461083b5780633225d3df1461085b57806332b6dd8b1461087057806338fd1b871461088557806339a0c6f91461089a57610518565b80630e3ea2051161048357806315a553471161043c57806315a553471461075f57806318160ddd1461077557806318d3cba01461078b5780631e415edb146107ab57806323b872dd146107e857806325e1ac5d1461080857610518565b80630e3ea205146106cc5780630eebdad6146106f85780630f7309e81461070d5780630fb6c6e814610722578063100073801461073757806312065fe01461074c57610518565b8063095ea7b3116104d5578063095ea7b3146105e257806309a9789f146106025780630abba15d146106225780630acb0064146106425780630c960ea5146106575780630d381a281461069f57610518565b806301ffc9a714610527578063028aa5ee1461055c578063029574eb1461057e57806306fdde0314610595578063081812fc146105aa57610518565b3661051857005b34801561052457600080fd5b50005b34801561053357600080fd5b50610547610542366004614c82565b610fdb565b60405190151581526020015b60405180910390f35b34801561056857600080fd5b50610571610fec565b6040516105539190614e4a565b34801561058a57600080fd5b5061059361107b565b005b3480156105a157600080fd5b50610571611139565b3480156105b657600080fd5b506105ca6105c5366004614c69565b6111cc565b6040516001600160a01b039091168152602001610553565b3480156105ee57600080fd5b506105936105fd366004614c0a565b611263565b34801561060e57600080fd5b5061059361061d366004614c0a565b611379565b34801561062e57600080fd5b5061059361063d366004614cbc565b6113d0565b34801561064e57600080fd5b506105936114c3565b34801561066357600080fd5b50600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29545b604051908152602001610553565b3480156106ab57600080fd5b506106bf6106ba366004614ac8565b611558565b6040516105539190614e06565b3480156106d857600080fd5b506004546106e69060ff1681565b60405160ff9091168152602001610553565b34801561070457600080fd5b50610593611617565b34801561071957600080fd5b5061057161165c565b34801561072e57600080fd5b50610593611669565b34801561074357600080fd5b50610691601981565b34801561075857600080fd5b5047610691565b34801561076b57600080fd5b50610691600d5481565b34801561078157600080fd5b50611f7154610691565b34801561079757600080fd5b506105936107a6366004614c0a565b6116f8565b3480156107b757600080fd5b506000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f854610691565b3480156107f457600080fd5b50610593610803366004614b16565b61174f565b34801561081457600080fd5b50610547610823366004614c34565b61175a565b610593610836366004614d05565b6117a1565b34801561084757600080fd5b50610691610856366004614c0a565b6119a8565b34801561086757600080fd5b50610593611a3f565b34801561087c57600080fd5b50610691611afc565b34801561089157600080fd5b50610593611b5c565b3480156108a657600080fd5b506105936108b5366004614cbc565b611bfb565b3480156108c657600080fd5b50610593611d48565b3480156108db57600080fd5b50610691600b5481565b3480156108f157600080fd5b50610593611d8b565b34801561090657600080fd5b506105ca611dc4565b34801561091b57600080fd5b5061059361092a366004614b16565b611e00565b34801561093b57600080fd5b50610691600581565b34801561095057600080fd5b50610691611e0b565b34801561096557600080fd5b50610691610974366004614c69565b611e81565b34801561098557600080fd5b50610691600c5481565b34801561099b57600080fd5b50611f6e5460ff16610547565b3480156109b457600080fd5b506008546105479060ff1681565b3480156109ce57600080fd5b50610593611f16565b3480156109e357600080fd5b50610593611f59565b3480156109f857600080fd5b50610691610a07366004614ac8565b600a6020526000908152604090205481565b348015610a2557600080fd5b50610691610a34366004614c69565b6120fe565b348015610a4557600080fd5b506105ca610a54366004614c69565b612120565b348015610a6557600080fd5b50610691610a74366004614c69565b612198565b348015610a8557600080fd5b50611f64546105479060ff1681565b348015610aa057600080fd5b506105716121a8565b610593610ab7366004614d05565b6121b5565b348015610ac857600080fd5b50610691610ad7366004614ac8565b6122a2565b348015610ae857600080fd5b5061059361232a565b348015610afd57600080fd5b50610593610b0c366004614d05565b612365565b348015610b1d57600080fd5b5061069160095481565b348015610b3357600080fd5b50610593610b42366004614c69565b612467565b348015610b5357600080fd5b50610593610b62366004614c0a565b612501565b348015610b7357600080fd5b50600360005260066020527f75f96ab15d697e93042dc45b5c896c4b27e89bb6eaf39475c5c371cb2513f7d254610691565b348015610bb157600080fd5b50610593612555565b348015610bc657600080fd5b50611f645461010090046001600160a01b03166105ca565b348015610bea57600080fd5b5061057161258e565b348015610bff57600080fd5b5061059361259e565b348015610c1457600080fd5b50611f66546105479060ff1681565b348015610c2f57600080fd5b50610691610c3e366004614ac8565b60116020526000908152604090205481565b348015610c5c57600080fd5b50610547610c6b366004614c69565b611f616020526000908152604090205460ff1681565b348015610c8d57600080fd5b50610691600a81565b348015610ca257600080fd5b5060105461054790610100900460ff1681565b348015610cc157600080fd5b50610593610cd0366004614bce565b612645565b348015610ce157600080fd5b5061069161270b565b348015610cf657600080fd5b506012546105479060ff1681565b348015610d1057600080fd5b506014546105479060ff1681565b348015610d2a57600080fd5b50610593612760565b348015610d3f57600080fd5b50610691611f5f5481565b348015610d5657600080fd5b506106916127a3565b348015610d6b57600080fd5b50610593610d7a366004614b52565b6127f8565b348015610d8b57600080fd5b50610691612830565b348015610da057600080fd5b5061069166470de4df82000081565b348015610dbb57600080fd5b506004546106e690610100900460ff1681565b348015610dda57600080fd5b506106916128c1565b348015610def57600080fd5b50610593612914565b348015610e0457600080fd5b50610571610e13366004614c69565b6129a3565b348015610e2457600080fd5b50610593610e33366004614c0a565b612a7e565b348015610e4457600080fd5b506010546105479060ff1681565b348015610e5e57600080fd5b50610593612ad1565b348015610e7357600080fd5b506105ca610e82366004614c69565b612b62565b348015610e9357600080fd5b50610691600f5481565b610593610eab366004614d20565b612b8c565b348015610ebc57600080fd5b50600160005260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a3154610691565b348015610efa57600080fd5b50610547610f09366004614ae3565b6001600160a01b039182166000908152611f6d6020908152604080832093909416825291909152205460ff1690565b348015610f4457600080fd5b50610691600e5481565b348015610f5a57600080fd5b50610691611f655481565b348015610f7157600080fd5b50610593610f80366004614ac8565b612ec7565b348015610f9157600080fd5b50610691611f4881565b348015610fa757600080fd5b50610593610fb6366004614ac8565b612f66565b348015610fc757600080fd5b50610593610fd6366004614cbc565b613066565b6000610fe68261314f565b92915050565b611f638054610ffa90615318565b80601f016020809104026020016040519081016040528092919081815260200182805461102690615318565b80156110735780601f1061104857610100808354040283529160200191611073565b820191906000526020600020905b81548152906001019060200180831161105657829003601f168201915b505050505081565b611f64546001600160a01b036101009091041633146110b55760405162461bcd60e51b81526004016110ac90614fe8565b60405180910390fd5b60105460ff166110d75760405162461bcd60e51b81526004016110ac90614f6b565b60085460ff166111295760405162461bcd60e51b815260206004820152601e60248201527f426c696e64206d696e74696e6720616c72656164792064697361626c6564000060448201526064016110ac565b6008805460ff1916905542600f55565b6060611f68805461114990615318565b80601f016020809104026020016040519081016040528092919081815260200182805461117590615318565b80156111c25780601f10611197576101008083540402835291602001916111c2565b820191906000526020600020905b8154815290600101906020018083116111a557829003601f168201915b5050505050905090565b6000818152611f6a60205260408120546001600160a01b03166112465760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016110ac565b506000908152611f6c60205260409020546001600160a01b031690565b600061126e82612120565b9050806001600160a01b0316836001600160a01b031614156112dc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016110ac565b336001600160a01b03821614806112f857506112f88133610f09565b61136a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016110ac565b6113748383613174565b505050565b611381611dc4565b6001600160a01b0316336001600160a01b0316146113b15760405162461bcd60e51b81526004016110ac9061501d565b6004546113cc9060009062010000900461ffff1684846131e3565b5050565b611f64546001600160a01b036101009091041633146114015760405162461bcd60e51b81526004016110ac90614fe8565b611f645460ff166114665760405162461bcd60e51b815260206004820152602960248201527f5468652074726170206d6573736167652063616e2774206265206368616e67656044820152686420616e796d6f726560b81b60648201526084016110ac565b60008151116114af5760405162461bcd60e51b815260206004820152601560248201527474726170206d65737361676520697320656d70747960581b60448201526064016110ac565b80516113cc90611f63906020840190614924565b611f64546001600160a01b036101009091041633146114f45760405162461bcd60e51b81526004016110ac90614fe8565b601054610100900460ff1661154b5760405162461bcd60e51b815260206004820152601e60248201527f4561726c79206d696e74696e6720616c72656164792064697361626c6564000060448201526064016110ac565b6010805461ff0019169055565b60606000611565836122a2565b9050806115865760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156115a1576115a16153f4565b6040519080825280602002602001820160405280156115ca578160200160208202803683370190505b50905060005b8281101561157e576115e285826119a8565b8282815181106115f4576115f46153de565b6020908102919091010152806116098161534d565b9150506115d0565b50919050565b61161f611dc4565b6001600160a01b0316336001600160a01b03161461164f5760405162461bcd60e51b81526004016110ac9061501d565b61165a336000611379565b565b60158054610ffa90615318565b611f64546001600160a01b0361010090910416331461169a5760405162461bcd60e51b81526004016110ac90614fe8565b60125460ff166116ec5760405162461bcd60e51b815260206004820152601c60248201527f42617365555249206368616e676573206172652064697361626c65640000000060448201526064016110ac565b6012805460ff19169055565b611700611dc4565b6001600160a01b0316336001600160a01b0316146117305760405162461bcd60e51b81526004016110ac9061501d565b6004546113cc906002906601000000000000900461ffff1684846131e3565b6113748383836133c4565b6040516001600160601b03193360601b166020820152600090819060340160405160208183030381529060405280519060200120905061179a81846133f5565b9392505050565b6002611f735414156117c55760405162461bcd60e51b81526004016110ac906150ec565b6002611f735560105460ff166117ed5760405162461bcd60e51b81526004016110ac90614f6b565b60085460ff1661183f5760405162461bcd60e51b815260206004820152601c60248201527f426c696e64206d696e74696e67206973206e6f7420737461727465640000000060448201526064016110ac565b600954600f5461184f90426152b2565b111561189d5760405162461bcd60e51b815260206004820152601860248201527f426c696e64206d696e74696e672068617320706173736564000000000000000060448201526064016110ac565b60058160ff1611156118f15760405162461bcd60e51b815260206004820152601c60248201527f546f206d616e7920626c696e6420746f6b656e7320746f206d696e740000000060448201526064016110ac565b336000908152600a60205260409020546005906119119060ff8416615154565b111561196e5760405162461bcd60e51b815260206004820152602660248201527f546f6f206d616e7920626c696e6420746f6b656e7320746f206d696e7420696e604482015265081d1bdd185b60d21b60648201526084016110ac565b336000908152600a60205260408120805460ff84169290611990908490615154565b9091555061199f9050816134a6565b506001611f7355565b60006119b3836122a2565b8210611a155760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016110ac565b506001600160a01b03919091166000908152611f6f60209081526040808320938352929052205490565b611f64546001600160a01b03610100909104163314611a705760405162461bcd60e51b81526004016110ac90614fe8565b6000611a7a611e0b565b905060008111611add5760405162461bcd60e51b815260206004820152602860248201527f5468657265206973206e6f20636f6e74726163742062616c616e636520746f20604482015267776974686472617760c01b60648201526084016110ac565b611f6454611af99061010090046001600160a01b03168261367a565b50565b600160009081527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b8285460066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31545b611b5791906152b2565b905090565b611f64546001600160a01b03610100909104163314611b8d5760405162461bcd60e51b81526004016110ac90614fe8565b611f645460ff16611bee5760405162461bcd60e51b815260206004820152602560248201527f5468652074726170206d657373616765206368616e676573206172652064697360448201526418589b195960da1b60648201526084016110ac565b611f64805460ff19169055565b611f64546001600160a01b03610100909104163314611c2c5760405162461bcd60e51b81526004016110ac90614fe8565b60125460ff16611c8a5760405162461bcd60e51b8152602060048201526024808201527f54686520626173655552492063616e2774206265206368616e67656420616e796044820152636d6f726560e01b60648201526084016110ac565b60085460ff1615611cad5760405162461bcd60e51b81526004016110ac90615064565b6000815111611cf15760405162461bcd60e51b815260206004820152601060248201526f6261736555524920697320656d70747960801b60448201526064016110ac565b336001600160a01b03167f92bf6a7b8937c17e6781a68d61f9fe6a5ce08604b96ca2206f311049a3a295ea601383604051611d2d929190614e5d565b60405180910390a280516113cc906013906020840190614924565b611d50611dc4565b6001600160a01b0316336001600160a01b031614611d805760405162461bcd60e51b81526004016110ac9061501d565b61165a336000612a7e565b611f64546001600160a01b03610100909104163314611dbc5760405162461bcd60e51b81526004016110ac90614fe8565b61165a613710565b600080548190611dd6906001906152b2565b81548110611de657611de66153de565b6000918252602090912001546001600160a01b0316919050565b6113748383836137a5565b60004781805b60025460ff82161015611e5e5760028160ff1681548110611e3457611e346153de565b906000526020600020015482611e4a9190615154565b915080611e5681615368565b915050611e11565b5080821115611e7857611e7181836152b2565b9250505090565b60009250505090565b6000611e8d611f715490565b8210611ef05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016110ac565b611f718281548110611f0457611f046153de565b90600052602060002001549050919050565b611f1e611dc4565b6001600160a01b0316336001600160a01b031614611f4e5760405162461bcd60e51b81526004016110ac9061501d565b61165a3360006116f8565b611f61611dc4565b6001600160a01b0316336001600160a01b03161415611fde5760405162461bcd60e51b815260206004820152603360248201527f43616e277420776974686472617720636f6d6d756e6974792062616c616e636560448201527210333937b6903a3434b990333ab731ba34b7b760691b60648201526084016110ac565b3360009081526003602052604090205460ff16806120555760405162461bcd60e51b815260206004820152602e60248201527f5468652073656e646572206973206e6f7420616c6c6f77656420746f2063686560448201526d636b207468652062616c616e636560901b60648201526084016110ac565b6120606001826152c9565b9050600060028260ff168154811061207a5761207a6153de565b90600052602060002001549050600081116120d05760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016110ac565b600060028360ff16815481106120e8576120e86153de565b6000918252602090912001556113cc338261367a565b611f60818154811061210f57600080fd5b600091825260209091200154905081565b6000818152611f6a60205260408120546001600160a01b031680610fe65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016110ac565b6001818154811061210f57600080fd5b60138054610ffa90615318565b6002611f735414156121d95760405162461bcd60e51b81526004016110ac906150ec565b6002611f735560105460ff166122015760405162461bcd60e51b81526004016110ac90614f6b565b60085460ff16156122245760405162461bcd60e51b81526004016110ac90615064565b601054610100900460ff16156122995760405162461bcd60e51b815260206004820152603460248201527f546865206561726c79206d696e74696e6720697320656e61626c65642e205573604482015273329032b0b9363ca6b4b73a10333ab731ba34b7b760611b60648201526084016110ac565b61199f816134a6565b60006001600160a01b03821661230d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016110ac565b506001600160a01b03166000908152611f6b602052604090205490565b611f64546001600160a01b0361010090910416331461235b5760405162461bcd60e51b81526004016110ac90614fe8565b61165a60006137c0565b60008160ff1611801561237d5750600d548160ff1611155b6123da5760405162461bcd60e51b815260206004820152602860248201527f546f6f206d616e7920726573657276656420746f6b656e7320746f206d696e74604482015267206174206f6e636560c01b60648201526084016110ac565b600d54600e546123ed9060ff8416615154565b111561243b5760405162461bcd60e51b815260206004820181905260248201527f546f6f206d616e7920726573657276656420746f6b656e7320746f206d696e7460448201526064016110ac565b8060ff16600e60008282546124509190615154565b90915550611af99050612461611dc4565b8261381b565b611f64546001600160a01b036101009091041633146124985760405162461bcd60e51b81526004016110ac90614fe8565b611f665460ff166124fb5760405162461bcd60e51b815260206004820152602760248201527f546865204d65726b6c65526f6f742063616e2774206265206368616e67656420604482015266616e796d6f726560c81b60648201526084016110ac565b611f6555565b612509611dc4565b6001600160a01b0316336001600160a01b0316146125395760405162461bcd60e51b81526004016110ac9061501d565b6004546113cc90600390600160401b900461ffff1684846131e3565b611f64546001600160a01b036101009091041633146125865760405162461bcd60e51b81526004016110ac90614fe8565b61165a613847565b6060611f69805461114990615318565b611f64546001600160a01b036101009091041633146125cf5760405162461bcd60e51b81526004016110ac90614fe8565b60105460ff16156126225760405162461bcd60e51b815260206004820152601a60248201527f4d696e74696e6720697320616c7265616479207374617274656400000000000060448201526064016110ac565b42600f5560108054600160ff199182168117909255600880549091169091179055565b6001600160a01b03821633141561269e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016110ac565b336000818152611f6d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600360009081527f3be6fd20d5acfde5b873b48692cd31f4d3c7e8ee8a813af4696af8859e5ca6c65460066020527f75f96ab15d697e93042dc45b5c896c4b27e89bb6eaf39475c5c371cb2513f7d254611b4d565b612768611dc4565b6001600160a01b0316336001600160a01b0316146127985760405162461bcd60e51b81526004016110ac9061501d565b61165a336000612501565b600260009081527fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d5460066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace2954611b4d565b61280233836138c4565b61281e5760405162461bcd60e51b81526004016110ac9061509b565b61282a848484846139bd565b50505050565b3360009081526003602052604081205460ff16806128905760405162461bcd60e51b815260206004820152601f60248201527f5468652073656e64657220646f65736e277420686176652062616c616e63650060448201526064016110ac565b600261289d6001836152c9565b60ff16815481106128b0576128b06153de565b906000526020600020015491505090565b60008080527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5460066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f854611b4d565b611f64546001600160a01b036101009091041633146129455760405162461bcd60e51b81526004016110ac90614fe8565b60145460ff166129975760405162461bcd60e51b815260206004820152601f60248201527f50726f76656e616e6365206368616e676573206172652064697361626c65640060448201526064016110ac565b6014805460ff19169055565b6000818152611f6a60205260409020546060906001600160a01b0316612a235760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016110ac565b6000612a2d6139f0565b90506000815111612a4d576040518060200160405280600081525061179a565b80612a57846139ff565b604051602001612a68929190614d9a565b6040516020818303038152906040529392505050565b612a86611dc4565b6001600160a01b0316336001600160a01b031614612ab65760405162461bcd60e51b81526004016110ac9061501d565b6113cc600160048054906101000a900461ffff1684846131e3565b611f64546001600160a01b03610100909104163314612b025760405162461bcd60e51b81526004016110ac90614fe8565b611f665460ff16612b555760405162461bcd60e51b815260206004820152601f60248201527f4d65726b6c65526f6f74206368616e676573206172652064697361626c65640060448201526064016110ac565b611f66805460ff19169055565b60008181548110612b7257600080fd5b6000918252602090912001546001600160a01b0316905081565b6002611f73541415612bb05760405162461bcd60e51b81526004016110ac906150ec565b6002611f735580612bc08161175a565b612c1b5760405162461bcd60e51b815260206004820152602660248201527f7468652070726f6f6620666f7220746869732073656e646572206973206e6f74604482015265081d985b1a5960d21b60648201526084016110ac565b60105460ff16612c3d5760405162461bcd60e51b81526004016110ac90614f6b565b60085460ff1615612c605760405162461bcd60e51b81526004016110ac90615064565b600c54600f54612c7090426152b2565b1115612cbe5760405162461bcd60e51b815260206004820152601860248201527f4561726c79206d696e74696e672068617320706173736564000000000000000060448201526064016110ac565b601054610100900460ff16612d325760405162461bcd60e51b815260206004820152603460248201527f546865206561726c79206d696e74696e672069732064697361626c65642e205560448201527339b2903a34329036b4b73a10333ab731ba34b7b760611b60648201526084016110ac565b600b54600f54612d4290426152b2565b11612df957600a8360ff161115612db65760405162461bcd60e51b815260206004820152603260248201527f546f206d616e7920746f6b656e7320746f206265206d696e746564206561726c6044820152717920696e207468652066697273742064617960701b60648201526084016110ac565b33600090815260116020526040902054600a90612dd69060ff8616615154565b1115612df45760405162461bcd60e51b81526004016110ac90614fa2565b612e8b565b60198360ff161115612e4d5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d616e79206561726c7920746f6b656e7320746f206d696e7400000060448201526064016110ac565b33600090815260116020526040902054601990612e6d9060ff8616615154565b1115612e8b5760405162461bcd60e51b81526004016110ac90614fa2565b336000908152601160205260408120805460ff86169290612ead908490615154565b90915550612ebc9050836134a6565b50506001611f735550565b611f64546001600160a01b03610100909104163314612ef85760405162461bcd60e51b81526004016110ac90614fe8565b6001600160a01b038116612f5d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110ac565b611af9816137c0565b3360009081526003602052604090205460ff1680612fde5760405162461bcd60e51b815260206004820152602f60248201527f5468652073656e646572206973206e6f7420616c6c6f77656420746f2063686160448201526e6e676520746865206164647265737360881b60648201526084016110ac565b33600090815260036020526040808220805460ff199081169091556001600160a01b0385168352908220805490911660ff841617905582906130216001846152c9565b60ff1681548110613034576130346153de565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b611f64546001600160a01b036101009091041633146130975760405162461bcd60e51b81526004016110ac90614fe8565b60145460ff166130f55760405162461bcd60e51b815260206004820152602360248201527f50726f76656e616e63652063616e2774206265206368616e67656420616e796d6044820152626f726560e81b60648201526084016110ac565b600081511161313c5760405162461bcd60e51b815260206004820152601360248201527270726f76656e616e636520697320656d70747960681b60448201526064016110ac565b80516113cc906015906020840190614924565b60006001600160e01b0319821663780e9d6360e01b1480610fe65750610fe682613afd565b6000818152611f6c6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906131aa82612120565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b3360009081526003602052604090205460ff166132016001826152c9565b9050600060028260ff168154811061321b5761321b6153de565b90600052602060002001549050600081116132715760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016110ac565b6000600260055461328291906151e8565b61329061ffff881684615293565b61329a9190615191565b9050831561335457838110156132e85760405162461bcd60e51b8152602060048201526013602482015272546f6f206d75636820746f207769746472617760681b60448201526064016110ac565b8360028460ff16815481106132ff576132ff6153de565b90600052602060002001600082825461331891906152b2565b909155505060ff87166000908152600760205260408120805486929061333f908490615154565b9091555061334f9050858561367a565b6133bb565b8060028460ff168154811061336b5761336b6153de565b90600052602060002001600082825461338491906152b2565b909155505060ff8716600090815260076020526040812080548392906133ab908490615154565b909155506133bb9050858261367a565b50505050505050565b6133ce33826138c4565b6133ea5760405162461bcd60e51b81526004016110ac9061509b565b611374838383613b3d565b600082815b8351811015613499576000848281518110613417576134176153de565b60200260200101519050808311613459576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613486565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806134918161534d565b9150506133fa565b50611f6554149392505050565b611f6e5460ff16156134ee5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b60448201526064016110ac565b60006134fa611f715490565b905060198260ff16111561355f5760405162461bcd60e51b815260206004820152602660248201527f45786365656473206d6178696d756d20746f6b656e7320706572207472616e7360448201526530b1ba34b7b760d11b60648201526084016110ac565b600d5461356e90611f486152b2565b61357b60ff841683615154565b11156135da5760405162461bcd60e51b815260206004820152602860248201527f45786365656473206d6178696d756d20746f6b656e7320617661696c61626c65604482015267081d1bc81b5a5b9d60c21b60648201526084016110ac565b6135ee66470de4df82000060ff8416613ceb565b34146136475760405162461bcd60e51b815260206004820152602260248201527f4d696e742076616c7565206973206e6f7420746865206578706563746564206f6044820152616e6560f01b60648201526084016110ac565b60005b8260ff168110156136705761365e33613cf7565b806136688161534d565b91505061364a565b506113cc82613d16565b60405182906000906001600160a01b0383169084908381818185875af1925050503d80600081146136c7576040519150601f19603f3d011682016040523d82523d6000602084013e6136cc565b606091505b505090508061282a5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016110ac565b611f6e5460ff1661375a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016110ac565b611f6e805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b611374838383604051806020016040528060008152506127f8565b611f6480546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b8160ff168160ff1610156113745761383583613cf7565b8061383f81615368565b91505061381e565b611f6e5460ff161561388e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016110ac565b611f6e805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137883390565b6000818152611f6a60205260408120546001600160a01b031661393e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016110ac565b600061394983612120565b9050806001600160a01b0316846001600160a01b031614806139845750836001600160a01b0316613979846111cc565b6001600160a01b0316145b806139b557506001600160a01b038082166000908152611f6d602090815260408083209388168352929052205460ff165b949350505050565b6139c8848484613b3d565b6139d484848484613f45565b61282a5760405162461bcd60e51b81526004016110ac90614f19565b60606013805461114990615318565b606081613a235750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613a4d5780613a378161534d565b9150613a469050600a83615191565b9150613a27565b60008167ffffffffffffffff811115613a6857613a686153f4565b6040519080825280601f01601f191660200182016040528015613a92576020820181803683370190505b5090505b84156139b557613aa76001836152b2565b9150613ab4600a86615388565b613abf906030615154565b60f81b818381518110613ad457613ad46153de565b60200101906001600160f81b031916908160001a905350613af6600a86615191565b9450613a96565b60006001600160e01b031982166380ac58cd60e01b1480613b2e57506001600160e01b03198216635b5e139f60e01b145b80610fe65750610fe682614052565b826001600160a01b0316613b5082612120565b6001600160a01b031614613bb85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016110ac565b6001600160a01b038216613c1a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016110ac565b613c2583838361408f565b613c30600082613174565b6001600160a01b0383166000908152611f6b60205260408120805460019290613c5a9084906152b2565b90915550506001600160a01b0382166000908152611f6b60205260408120805460019290613c89908490615154565b90915550506000818152611f6a602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061179a8284615293565b6000613d0161409a565b9050613d0c816141f7565b6113cc8282614270565b60005460045434919060ff80821691613d3691869161010090041661516c565b60ff1611613e2c5782600460018282829054906101000a900460ff16613d5c919061516c565b92506101000a81548160ff021916908360ff16021790555060005b8160ff168160ff16101561282a57600060055460018360ff1681548110613da057613da06153de565b906000526020600020015485613db69190615293565b613dc09190615191565b90508060028360ff1681548110613dd957613dd96153de565b906000526020600020016000828254613df29190615154565b90915550613e0390506001846152c9565b60ff168260ff161415613e1957613e198161428a565b5080613e2481615368565b915050613d77565b6004805461ff001916905560005b60005460ff8216101561282a57600060055460018360ff1681548110613e6257613e626153de565b906000526020600020015485613e789190615293565b613e829190615191565b9050613e8f6001846152c9565b60ff168260ff161415613eaa57613ea58161428a565b613f32565b60028260ff1681548110613ec057613ec06153de565b906000526020600020015481613ed69190615154565b9050600060028360ff1681548110613ef057613ef06153de565b9060005260206000200181905550613f3260008360ff1681548110613f1757613f176153de565b6000918252602090912001546001600160a01b03168261367a565b5080613f3d81615368565b915050613e3a565b60006001600160a01b0384163b1561404757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613f89903390899088908890600401614dc9565b602060405180830381600087803b158015613fa357600080fd5b505af1925050508015613fd3575060408051601f3d908101601f19168201909252613fd091810190614c9f565b60015b61402d573d808015614001576040519150601f19603f3d011682016040523d82523d6000602084013e614006565b606091505b5080516140255760405162461bcd60e51b81526004016110ac90614f19565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506139b5565b506001949350505050565b60006301ffc9a760e01b6001600160e01b031983161480610fe65750506001600160e01b0319166000908152611f67602052604090205460ff1690565b61137483838361445a565b6000806140a7611f715490565b6140b390611f486152b2565b6016546040805160208101929092526001600160601b03193360601b169082015244605482015242607482015290915060009082906094016040516020818303038152906040528051906020012060001c61410e9190615388565b90506000601782611f488110614126576141266153de565b01541561414a57601782611f488110614141576141416153de565b0154905061414d565b50805b601761415a6001856152b2565b611f48811061416b5761416b6153de565b01546141975761417c6001846152b2565b601783611f488110614190576141906153de565b01556141ce565b60176141a46001856152b2565b611f4881106141b5576141b56153de565b0154601783611f4881106141cb576141cb6153de565b01555b601680549060006141de8361534d565b909155506141ef9050816001615154565b935050505090565b611f5f54611f605414156142085750565b60006142138261451f565b9050611f5f548110156113cc57506000818152611f6160205260408120805460ff19166001908117909155611f60805491820181559091527fbccb917d26f9cd64d9537fc498853caaed3bd1119484caeac948ea9947c6caaa0155565b6113cc82826040518060200160405280600081525061459b565b600260055461429991906151e8565b6004546142b09062010000900461ffff1683615293565b6142ba9190615191565b600080805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f880549091906142f5908490615154565b9091555050600554614309906002906151e8565b60045461432290640100000000900461ffff1683615293565b61432c9190615191565b6002600090815260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace298054909190614369908490615154565b909155505060055461437d906002906151e8565b600454614398906601000000000000900461ffff1683615293565b6143a29190615191565b6001600090815260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a3180549091906143df908490615154565b90915550506005546143f3906002906151e8565b60045461440b90600160401b900461ffff1683615293565b6144159190615191565b6003600090815260066020527f75f96ab15d697e93042dc45b5c896c4b27e89bb6eaf39475c5c371cb2513f7d28054909190614452908490615154565b909155505050565b6144658383836145ce565b6001600160a01b0383166144c2576144bd81611f7180546000838152611f7260205260408120829055600182018355919091527f81e56acc2cc4fd28b151ca5123b342a155824205f7b3f384e54555891f3fded10155565b6144e5565b816001600160a01b0316836001600160a01b0316146144e5576144e58382614636565b6001600160a01b0382166144fc57611374816146d8565b826001600160a01b0316826001600160a01b03161461137457611374828261478d565b611f625460165460408051602081018590529081019290925260608083019190915233901b6001600160601b03191660808201524460948201524260b48201526000908190611f489060d4016040516020818303038152906040528051906020012060001c61458e9190615388565b611f628190559392505050565b6145a583836147d3565b6145b26000848484613f45565b6113745760405162461bcd60e51b81526004016110ac90614f19565b611f6e5460ff16156113745760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b60648201526084016110ac565b60006001614643846122a2565b61464d91906152b2565b6000838152611f7060205260409020549091508082146146a3576001600160a01b0384166000908152611f6f602090815260408083208584528252808320548484528184208190558352611f7090915290208190555b506000918252611f70602090815260408084208490556001600160a01b039094168352611f6f81528383209183525290812055565b611f71546000906146eb906001906152b2565b6000838152611f726020526040812054611f718054939450909284908110614715576147156153de565b9060005260206000200154905080611f718381548110614737576147376153de565b6000918252602080832090910192909255828152611f729091526040808220849055858252812055611f71805480614771576147716153c8565b6001900381819060005260206000200160009055905550505050565b6000614798836122a2565b6001600160a01b039093166000908152611f6f602090815260408083208684528252808320859055938252611f709052919091209190915550565b6001600160a01b0382166148295760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016110ac565b6000818152611f6a60205260409020546001600160a01b03161561488f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016110ac565b61489b6000838361408f565b6001600160a01b0382166000908152611f6b602052604081208054600192906148c5908490615154565b90915550506000818152611f6a602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461493090615318565b90600052602060002090601f0160209004810192826149525760008555614998565b82601f1061496b57805160ff1916838001178555614998565b82800160010185558215614998579182015b8281111561499857825182559160200191906001019061497d565b506149a49291506149a8565b5090565b5b808211156149a457600081556001016149a9565b600067ffffffffffffffff8311156149d7576149d76153f4565b6149ea601f8401601f1916602001615123565b90508281528383830111156149fe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114614a2c57600080fd5b919050565b600082601f830112614a4257600080fd5b8135602067ffffffffffffffff821115614a5e57614a5e6153f4565b8160051b614a6d828201615123565b838152828101908684018388018501891015614a8857600080fd5b600093505b85841015614aab578035835260019390930192918401918401614a8d565b50979650505050505050565b803560ff81168114614a2c57600080fd5b600060208284031215614ada57600080fd5b61179a82614a15565b60008060408385031215614af657600080fd5b614aff83614a15565b9150614b0d60208401614a15565b90509250929050565b600080600060608486031215614b2b57600080fd5b614b3484614a15565b9250614b4260208501614a15565b9150604084013590509250925092565b60008060008060808587031215614b6857600080fd5b614b7185614a15565b9350614b7f60208601614a15565b925060408501359150606085013567ffffffffffffffff811115614ba257600080fd5b8501601f81018713614bb357600080fd5b614bc2878235602084016149bd565b91505092959194509250565b60008060408385031215614be157600080fd5b614bea83614a15565b915060208301358015158114614bff57600080fd5b809150509250929050565b60008060408385031215614c1d57600080fd5b614c2683614a15565b946020939093013593505050565b600060208284031215614c4657600080fd5b813567ffffffffffffffff811115614c5d57600080fd5b6139b584828501614a31565b600060208284031215614c7b57600080fd5b5035919050565b600060208284031215614c9457600080fd5b813561179a8161540a565b600060208284031215614cb157600080fd5b815161179a8161540a565b600060208284031215614cce57600080fd5b813567ffffffffffffffff811115614ce557600080fd5b8201601f81018413614cf657600080fd5b6139b5848235602084016149bd565b600060208284031215614d1757600080fd5b61179a82614ab7565b60008060408385031215614d3357600080fd5b614d3c83614ab7565b9150602083013567ffffffffffffffff811115614d5857600080fd5b614d6485828601614a31565b9150509250929050565b60008151808452614d868160208601602086016152ec565b601f01601f19169290920160200192915050565b60008351614dac8184602088016152ec565b835190830190614dc08183602088016152ec565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614dfc90830184614d6e565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614e3e57835183529284019291840191600101614e22565b50909695505050505050565b60208152600061179a6020830184614d6e565b60408152600080845481600182811c915080831680614e7d57607f831692505b6020808410821415614e9d57634e487b7160e01b86526022600452602486fd5b6040880184905260608801828015614ebc5760018114614ecd57614ef8565b60ff19871682528282019750614ef8565b60008c81526020902060005b87811015614ef257815484820152908601908401614ed9565b83019850505b5050878603818901525050505050614f108185614d6e565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601a908201527f4d696e74696e67206861736e2774207374617274656420796574000000000000604082015260600190565b60208082526026908201527f546f6f206d616e79206561726c7920746f6b656e7320746f206d696e7420696e604082015265081d1bdd185b60d21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526027908201527f5468652073656e646572206973206e6f742074686520636f6d6d756e697479206040820152666164647265737360c81b606082015260800190565b60208082526018908201527f426c696e64206d696e74696e6720697320737461727465640000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561514c5761514c6153f4565b604052919050565b600082198211156151675761516761539c565b500190565b600060ff821660ff84168060ff038211156151895761518961539c565b019392505050565b6000826151a0576151a06153b2565b500490565b600181815b808511156151e05781600019048211156151c6576151c661539c565b808516156151d357918102915b93841c93908002906151aa565b509250929050565b600061179a60ff84168360008261520157506001610fe6565b8161520e57506000610fe6565b8160018114615224576002811461522e5761524a565b6001915050610fe6565b60ff84111561523f5761523f61539c565b50506001821b610fe6565b5060208310610133831016604e8410600b841016171561526d575081810a610fe6565b61527783836151a5565b806000190482111561528b5761528b61539c565b029392505050565b60008160001904831182151516156152ad576152ad61539c565b500290565b6000828210156152c4576152c461539c565b500390565b600060ff821660ff8416808210156152e3576152e361539c565b90039392505050565b60005b838110156153075781810151838201526020016152ef565b8381111561282a5750506000910152565b600181811c9082168061532c57607f821691505b6020821081141561161157634e487b7160e01b600052602260045260246000fd5b60006000198214156153615761536161539c565b5060010190565b600060ff821660ff81141561537f5761537f61539c565b60010192915050565b600082615397576153976153b2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611af957600080fdfea2646970667358221220ed6df98d6ba4c3ed0234d7efbc2ae34329a90b69277de9c8f9900300f2d3848464736f6c63430008050033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000957657457616966757300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003574554000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000008aebb11c2602818c154d16d2ce325e77e0f9b89a00000000000000000000000057eaebe03841ecb923ade81bf9a232cd2b0ce0aa000000000000000000000000d02ae906edc339872b8300020fc4411c4f4036e10000000000000000000000004e70048a971b470066afabd4a184ef96317736d0000000000000000000000000c39d0fcfa32219f1246ef538746244372339fe5f00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d

Deployed Bytecode

0x6080604052600436106105115760003560e01c80636c0360eb11610297578063ace1fab111610165578063d399ba8b116100cc578063eb74cc7d11610085578063eb74cc7d14610f38578063ebf0c71714610f4e578063f2fde38b14610f65578063f47c84c514610f85578063fe64d6ff14610f9b578063ffe630b514610fbb57610518565b8063d399ba8b14610e52578063d8c03be914610e67578063dfef5f6914610e87578063e1d08eea14610e9d578063e788348a14610eb0578063e985e9c514610eee57610518565b8063c1faac531161011e578063c1faac5314610daf578063c4bf61be14610dce578063c7f5fee614610de3578063c87b56dd14610df8578063c907759f14610e18578063d01b2f1114610e3857610518565b8063ace1fab114610d1e578063b0b1d1c514610d33578063b2659fe014610d4a578063b88d4fde14610d5f578063bd218e7414610d7f578063c002d23d14610d9457610518565b806393e0ef75116102095780639f490da0116101c25780639f490da014610c81578063a07de77514610c96578063a22cb46514610cb5578063a769b78614610cd5578063a84894b814610cea578063ab61391b14610d0457610518565b806393e0ef751461073757806395d89b4114610bde5780639a65ea2614610bf35780639cc2b39c14610c085780639ea5505514610c235780639ee8465814610c5057610518565b8063771e647a1161025b578063771e647a14610b115780637cb6475914610b275780637e24793014610b47578063819995d714610b675780638456cb5914610ba55780638da5cb5b14610bba57610518565b80636c0360eb14610a945780636ecd230614610aa957806370a0823114610abc578063715018a614610adc578063729f095314610af157610518565b80632713e2c2116103df57806349a3ccca116103465780635fd8c710116102ff5780635fd8c710146109d7578063624dc7a4146109ec5780636263605314610a195780636352211e14610a39578063671b6b0514610a595780636a82dd3d14610a7957610518565b806349a3ccca146109445780634f6ccce714610959578063535db374146109795780635c975abb1461098f5780635cf1971e146109a85780635cf4f865146109c257610518565b80633a653e9d116103985780633a653e9d146108ba5780633ccf6225146108cf5780633f4ba83a146108e55780633fcd5f56146108fa57806342842e0e1461090f57806348c2c0dc1461092f57610518565b80632713e2c2146108285780632f745c591461083b5780633225d3df1461085b57806332b6dd8b1461087057806338fd1b871461088557806339a0c6f91461089a57610518565b80630e3ea2051161048357806315a553471161043c57806315a553471461075f57806318160ddd1461077557806318d3cba01461078b5780631e415edb146107ab57806323b872dd146107e857806325e1ac5d1461080857610518565b80630e3ea205146106cc5780630eebdad6146106f85780630f7309e81461070d5780630fb6c6e814610722578063100073801461073757806312065fe01461074c57610518565b8063095ea7b3116104d5578063095ea7b3146105e257806309a9789f146106025780630abba15d146106225780630acb0064146106425780630c960ea5146106575780630d381a281461069f57610518565b806301ffc9a714610527578063028aa5ee1461055c578063029574eb1461057e57806306fdde0314610595578063081812fc146105aa57610518565b3661051857005b34801561052457600080fd5b50005b34801561053357600080fd5b50610547610542366004614c82565b610fdb565b60405190151581526020015b60405180910390f35b34801561056857600080fd5b50610571610fec565b6040516105539190614e4a565b34801561058a57600080fd5b5061059361107b565b005b3480156105a157600080fd5b50610571611139565b3480156105b657600080fd5b506105ca6105c5366004614c69565b6111cc565b6040516001600160a01b039091168152602001610553565b3480156105ee57600080fd5b506105936105fd366004614c0a565b611263565b34801561060e57600080fd5b5061059361061d366004614c0a565b611379565b34801561062e57600080fd5b5061059361063d366004614cbc565b6113d0565b34801561064e57600080fd5b506105936114c3565b34801561066357600080fd5b50600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29545b604051908152602001610553565b3480156106ab57600080fd5b506106bf6106ba366004614ac8565b611558565b6040516105539190614e06565b3480156106d857600080fd5b506004546106e69060ff1681565b60405160ff9091168152602001610553565b34801561070457600080fd5b50610593611617565b34801561071957600080fd5b5061057161165c565b34801561072e57600080fd5b50610593611669565b34801561074357600080fd5b50610691601981565b34801561075857600080fd5b5047610691565b34801561076b57600080fd5b50610691600d5481565b34801561078157600080fd5b50611f7154610691565b34801561079757600080fd5b506105936107a6366004614c0a565b6116f8565b3480156107b757600080fd5b506000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f854610691565b3480156107f457600080fd5b50610593610803366004614b16565b61174f565b34801561081457600080fd5b50610547610823366004614c34565b61175a565b610593610836366004614d05565b6117a1565b34801561084757600080fd5b50610691610856366004614c0a565b6119a8565b34801561086757600080fd5b50610593611a3f565b34801561087c57600080fd5b50610691611afc565b34801561089157600080fd5b50610593611b5c565b3480156108a657600080fd5b506105936108b5366004614cbc565b611bfb565b3480156108c657600080fd5b50610593611d48565b3480156108db57600080fd5b50610691600b5481565b3480156108f157600080fd5b50610593611d8b565b34801561090657600080fd5b506105ca611dc4565b34801561091b57600080fd5b5061059361092a366004614b16565b611e00565b34801561093b57600080fd5b50610691600581565b34801561095057600080fd5b50610691611e0b565b34801561096557600080fd5b50610691610974366004614c69565b611e81565b34801561098557600080fd5b50610691600c5481565b34801561099b57600080fd5b50611f6e5460ff16610547565b3480156109b457600080fd5b506008546105479060ff1681565b3480156109ce57600080fd5b50610593611f16565b3480156109e357600080fd5b50610593611f59565b3480156109f857600080fd5b50610691610a07366004614ac8565b600a6020526000908152604090205481565b348015610a2557600080fd5b50610691610a34366004614c69565b6120fe565b348015610a4557600080fd5b506105ca610a54366004614c69565b612120565b348015610a6557600080fd5b50610691610a74366004614c69565b612198565b348015610a8557600080fd5b50611f64546105479060ff1681565b348015610aa057600080fd5b506105716121a8565b610593610ab7366004614d05565b6121b5565b348015610ac857600080fd5b50610691610ad7366004614ac8565b6122a2565b348015610ae857600080fd5b5061059361232a565b348015610afd57600080fd5b50610593610b0c366004614d05565b612365565b348015610b1d57600080fd5b5061069160095481565b348015610b3357600080fd5b50610593610b42366004614c69565b612467565b348015610b5357600080fd5b50610593610b62366004614c0a565b612501565b348015610b7357600080fd5b50600360005260066020527f75f96ab15d697e93042dc45b5c896c4b27e89bb6eaf39475c5c371cb2513f7d254610691565b348015610bb157600080fd5b50610593612555565b348015610bc657600080fd5b50611f645461010090046001600160a01b03166105ca565b348015610bea57600080fd5b5061057161258e565b348015610bff57600080fd5b5061059361259e565b348015610c1457600080fd5b50611f66546105479060ff1681565b348015610c2f57600080fd5b50610691610c3e366004614ac8565b60116020526000908152604090205481565b348015610c5c57600080fd5b50610547610c6b366004614c69565b611f616020526000908152604090205460ff1681565b348015610c8d57600080fd5b50610691600a81565b348015610ca257600080fd5b5060105461054790610100900460ff1681565b348015610cc157600080fd5b50610593610cd0366004614bce565b612645565b348015610ce157600080fd5b5061069161270b565b348015610cf657600080fd5b506012546105479060ff1681565b348015610d1057600080fd5b506014546105479060ff1681565b348015610d2a57600080fd5b50610593612760565b348015610d3f57600080fd5b50610691611f5f5481565b348015610d5657600080fd5b506106916127a3565b348015610d6b57600080fd5b50610593610d7a366004614b52565b6127f8565b348015610d8b57600080fd5b50610691612830565b348015610da057600080fd5b5061069166470de4df82000081565b348015610dbb57600080fd5b506004546106e690610100900460ff1681565b348015610dda57600080fd5b506106916128c1565b348015610def57600080fd5b50610593612914565b348015610e0457600080fd5b50610571610e13366004614c69565b6129a3565b348015610e2457600080fd5b50610593610e33366004614c0a565b612a7e565b348015610e4457600080fd5b506010546105479060ff1681565b348015610e5e57600080fd5b50610593612ad1565b348015610e7357600080fd5b506105ca610e82366004614c69565b612b62565b348015610e9357600080fd5b50610691600f5481565b610593610eab366004614d20565b612b8c565b348015610ebc57600080fd5b50600160005260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a3154610691565b348015610efa57600080fd5b50610547610f09366004614ae3565b6001600160a01b039182166000908152611f6d6020908152604080832093909416825291909152205460ff1690565b348015610f4457600080fd5b50610691600e5481565b348015610f5a57600080fd5b50610691611f655481565b348015610f7157600080fd5b50610593610f80366004614ac8565b612ec7565b348015610f9157600080fd5b50610691611f4881565b348015610fa757600080fd5b50610593610fb6366004614ac8565b612f66565b348015610fc757600080fd5b50610593610fd6366004614cbc565b613066565b6000610fe68261314f565b92915050565b611f638054610ffa90615318565b80601f016020809104026020016040519081016040528092919081815260200182805461102690615318565b80156110735780601f1061104857610100808354040283529160200191611073565b820191906000526020600020905b81548152906001019060200180831161105657829003601f168201915b505050505081565b611f64546001600160a01b036101009091041633146110b55760405162461bcd60e51b81526004016110ac90614fe8565b60405180910390fd5b60105460ff166110d75760405162461bcd60e51b81526004016110ac90614f6b565b60085460ff166111295760405162461bcd60e51b815260206004820152601e60248201527f426c696e64206d696e74696e6720616c72656164792064697361626c6564000060448201526064016110ac565b6008805460ff1916905542600f55565b6060611f68805461114990615318565b80601f016020809104026020016040519081016040528092919081815260200182805461117590615318565b80156111c25780601f10611197576101008083540402835291602001916111c2565b820191906000526020600020905b8154815290600101906020018083116111a557829003601f168201915b5050505050905090565b6000818152611f6a60205260408120546001600160a01b03166112465760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016110ac565b506000908152611f6c60205260409020546001600160a01b031690565b600061126e82612120565b9050806001600160a01b0316836001600160a01b031614156112dc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016110ac565b336001600160a01b03821614806112f857506112f88133610f09565b61136a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016110ac565b6113748383613174565b505050565b611381611dc4565b6001600160a01b0316336001600160a01b0316146113b15760405162461bcd60e51b81526004016110ac9061501d565b6004546113cc9060009062010000900461ffff1684846131e3565b5050565b611f64546001600160a01b036101009091041633146114015760405162461bcd60e51b81526004016110ac90614fe8565b611f645460ff166114665760405162461bcd60e51b815260206004820152602960248201527f5468652074726170206d6573736167652063616e2774206265206368616e67656044820152686420616e796d6f726560b81b60648201526084016110ac565b60008151116114af5760405162461bcd60e51b815260206004820152601560248201527474726170206d65737361676520697320656d70747960581b60448201526064016110ac565b80516113cc90611f63906020840190614924565b611f64546001600160a01b036101009091041633146114f45760405162461bcd60e51b81526004016110ac90614fe8565b601054610100900460ff1661154b5760405162461bcd60e51b815260206004820152601e60248201527f4561726c79206d696e74696e6720616c72656164792064697361626c6564000060448201526064016110ac565b6010805461ff0019169055565b60606000611565836122a2565b9050806115865760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156115a1576115a16153f4565b6040519080825280602002602001820160405280156115ca578160200160208202803683370190505b50905060005b8281101561157e576115e285826119a8565b8282815181106115f4576115f46153de565b6020908102919091010152806116098161534d565b9150506115d0565b50919050565b61161f611dc4565b6001600160a01b0316336001600160a01b03161461164f5760405162461bcd60e51b81526004016110ac9061501d565b61165a336000611379565b565b60158054610ffa90615318565b611f64546001600160a01b0361010090910416331461169a5760405162461bcd60e51b81526004016110ac90614fe8565b60125460ff166116ec5760405162461bcd60e51b815260206004820152601c60248201527f42617365555249206368616e676573206172652064697361626c65640000000060448201526064016110ac565b6012805460ff19169055565b611700611dc4565b6001600160a01b0316336001600160a01b0316146117305760405162461bcd60e51b81526004016110ac9061501d565b6004546113cc906002906601000000000000900461ffff1684846131e3565b6113748383836133c4565b6040516001600160601b03193360601b166020820152600090819060340160405160208183030381529060405280519060200120905061179a81846133f5565b9392505050565b6002611f735414156117c55760405162461bcd60e51b81526004016110ac906150ec565b6002611f735560105460ff166117ed5760405162461bcd60e51b81526004016110ac90614f6b565b60085460ff1661183f5760405162461bcd60e51b815260206004820152601c60248201527f426c696e64206d696e74696e67206973206e6f7420737461727465640000000060448201526064016110ac565b600954600f5461184f90426152b2565b111561189d5760405162461bcd60e51b815260206004820152601860248201527f426c696e64206d696e74696e672068617320706173736564000000000000000060448201526064016110ac565b60058160ff1611156118f15760405162461bcd60e51b815260206004820152601c60248201527f546f206d616e7920626c696e6420746f6b656e7320746f206d696e740000000060448201526064016110ac565b336000908152600a60205260409020546005906119119060ff8416615154565b111561196e5760405162461bcd60e51b815260206004820152602660248201527f546f6f206d616e7920626c696e6420746f6b656e7320746f206d696e7420696e604482015265081d1bdd185b60d21b60648201526084016110ac565b336000908152600a60205260408120805460ff84169290611990908490615154565b9091555061199f9050816134a6565b506001611f7355565b60006119b3836122a2565b8210611a155760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016110ac565b506001600160a01b03919091166000908152611f6f60209081526040808320938352929052205490565b611f64546001600160a01b03610100909104163314611a705760405162461bcd60e51b81526004016110ac90614fe8565b6000611a7a611e0b565b905060008111611add5760405162461bcd60e51b815260206004820152602860248201527f5468657265206973206e6f20636f6e74726163742062616c616e636520746f20604482015267776974686472617760c01b60648201526084016110ac565b611f6454611af99061010090046001600160a01b03168261367a565b50565b600160009081527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b8285460066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31545b611b5791906152b2565b905090565b611f64546001600160a01b03610100909104163314611b8d5760405162461bcd60e51b81526004016110ac90614fe8565b611f645460ff16611bee5760405162461bcd60e51b815260206004820152602560248201527f5468652074726170206d657373616765206368616e676573206172652064697360448201526418589b195960da1b60648201526084016110ac565b611f64805460ff19169055565b611f64546001600160a01b03610100909104163314611c2c5760405162461bcd60e51b81526004016110ac90614fe8565b60125460ff16611c8a5760405162461bcd60e51b8152602060048201526024808201527f54686520626173655552492063616e2774206265206368616e67656420616e796044820152636d6f726560e01b60648201526084016110ac565b60085460ff1615611cad5760405162461bcd60e51b81526004016110ac90615064565b6000815111611cf15760405162461bcd60e51b815260206004820152601060248201526f6261736555524920697320656d70747960801b60448201526064016110ac565b336001600160a01b03167f92bf6a7b8937c17e6781a68d61f9fe6a5ce08604b96ca2206f311049a3a295ea601383604051611d2d929190614e5d565b60405180910390a280516113cc906013906020840190614924565b611d50611dc4565b6001600160a01b0316336001600160a01b031614611d805760405162461bcd60e51b81526004016110ac9061501d565b61165a336000612a7e565b611f64546001600160a01b03610100909104163314611dbc5760405162461bcd60e51b81526004016110ac90614fe8565b61165a613710565b600080548190611dd6906001906152b2565b81548110611de657611de66153de565b6000918252602090912001546001600160a01b0316919050565b6113748383836137a5565b60004781805b60025460ff82161015611e5e5760028160ff1681548110611e3457611e346153de565b906000526020600020015482611e4a9190615154565b915080611e5681615368565b915050611e11565b5080821115611e7857611e7181836152b2565b9250505090565b60009250505090565b6000611e8d611f715490565b8210611ef05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016110ac565b611f718281548110611f0457611f046153de565b90600052602060002001549050919050565b611f1e611dc4565b6001600160a01b0316336001600160a01b031614611f4e5760405162461bcd60e51b81526004016110ac9061501d565b61165a3360006116f8565b611f61611dc4565b6001600160a01b0316336001600160a01b03161415611fde5760405162461bcd60e51b815260206004820152603360248201527f43616e277420776974686472617720636f6d6d756e6974792062616c616e636560448201527210333937b6903a3434b990333ab731ba34b7b760691b60648201526084016110ac565b3360009081526003602052604090205460ff16806120555760405162461bcd60e51b815260206004820152602e60248201527f5468652073656e646572206973206e6f7420616c6c6f77656420746f2063686560448201526d636b207468652062616c616e636560901b60648201526084016110ac565b6120606001826152c9565b9050600060028260ff168154811061207a5761207a6153de565b90600052602060002001549050600081116120d05760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016110ac565b600060028360ff16815481106120e8576120e86153de565b6000918252602090912001556113cc338261367a565b611f60818154811061210f57600080fd5b600091825260209091200154905081565b6000818152611f6a60205260408120546001600160a01b031680610fe65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016110ac565b6001818154811061210f57600080fd5b60138054610ffa90615318565b6002611f735414156121d95760405162461bcd60e51b81526004016110ac906150ec565b6002611f735560105460ff166122015760405162461bcd60e51b81526004016110ac90614f6b565b60085460ff16156122245760405162461bcd60e51b81526004016110ac90615064565b601054610100900460ff16156122995760405162461bcd60e51b815260206004820152603460248201527f546865206561726c79206d696e74696e6720697320656e61626c65642e205573604482015273329032b0b9363ca6b4b73a10333ab731ba34b7b760611b60648201526084016110ac565b61199f816134a6565b60006001600160a01b03821661230d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016110ac565b506001600160a01b03166000908152611f6b602052604090205490565b611f64546001600160a01b0361010090910416331461235b5760405162461bcd60e51b81526004016110ac90614fe8565b61165a60006137c0565b60008160ff1611801561237d5750600d548160ff1611155b6123da5760405162461bcd60e51b815260206004820152602860248201527f546f6f206d616e7920726573657276656420746f6b656e7320746f206d696e74604482015267206174206f6e636560c01b60648201526084016110ac565b600d54600e546123ed9060ff8416615154565b111561243b5760405162461bcd60e51b815260206004820181905260248201527f546f6f206d616e7920726573657276656420746f6b656e7320746f206d696e7460448201526064016110ac565b8060ff16600e60008282546124509190615154565b90915550611af99050612461611dc4565b8261381b565b611f64546001600160a01b036101009091041633146124985760405162461bcd60e51b81526004016110ac90614fe8565b611f665460ff166124fb5760405162461bcd60e51b815260206004820152602760248201527f546865204d65726b6c65526f6f742063616e2774206265206368616e67656420604482015266616e796d6f726560c81b60648201526084016110ac565b611f6555565b612509611dc4565b6001600160a01b0316336001600160a01b0316146125395760405162461bcd60e51b81526004016110ac9061501d565b6004546113cc90600390600160401b900461ffff1684846131e3565b611f64546001600160a01b036101009091041633146125865760405162461bcd60e51b81526004016110ac90614fe8565b61165a613847565b6060611f69805461114990615318565b611f64546001600160a01b036101009091041633146125cf5760405162461bcd60e51b81526004016110ac90614fe8565b60105460ff16156126225760405162461bcd60e51b815260206004820152601a60248201527f4d696e74696e6720697320616c7265616479207374617274656400000000000060448201526064016110ac565b42600f5560108054600160ff199182168117909255600880549091169091179055565b6001600160a01b03821633141561269e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016110ac565b336000818152611f6d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600360009081527f3be6fd20d5acfde5b873b48692cd31f4d3c7e8ee8a813af4696af8859e5ca6c65460066020527f75f96ab15d697e93042dc45b5c896c4b27e89bb6eaf39475c5c371cb2513f7d254611b4d565b612768611dc4565b6001600160a01b0316336001600160a01b0316146127985760405162461bcd60e51b81526004016110ac9061501d565b61165a336000612501565b600260009081527fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d5460066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace2954611b4d565b61280233836138c4565b61281e5760405162461bcd60e51b81526004016110ac9061509b565b61282a848484846139bd565b50505050565b3360009081526003602052604081205460ff16806128905760405162461bcd60e51b815260206004820152601f60248201527f5468652073656e64657220646f65736e277420686176652062616c616e63650060448201526064016110ac565b600261289d6001836152c9565b60ff16815481106128b0576128b06153de565b906000526020600020015491505090565b60008080527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5460066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f854611b4d565b611f64546001600160a01b036101009091041633146129455760405162461bcd60e51b81526004016110ac90614fe8565b60145460ff166129975760405162461bcd60e51b815260206004820152601f60248201527f50726f76656e616e6365206368616e676573206172652064697361626c65640060448201526064016110ac565b6014805460ff19169055565b6000818152611f6a60205260409020546060906001600160a01b0316612a235760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016110ac565b6000612a2d6139f0565b90506000815111612a4d576040518060200160405280600081525061179a565b80612a57846139ff565b604051602001612a68929190614d9a565b6040516020818303038152906040529392505050565b612a86611dc4565b6001600160a01b0316336001600160a01b031614612ab65760405162461bcd60e51b81526004016110ac9061501d565b6113cc600160048054906101000a900461ffff1684846131e3565b611f64546001600160a01b03610100909104163314612b025760405162461bcd60e51b81526004016110ac90614fe8565b611f665460ff16612b555760405162461bcd60e51b815260206004820152601f60248201527f4d65726b6c65526f6f74206368616e676573206172652064697361626c65640060448201526064016110ac565b611f66805460ff19169055565b60008181548110612b7257600080fd5b6000918252602090912001546001600160a01b0316905081565b6002611f73541415612bb05760405162461bcd60e51b81526004016110ac906150ec565b6002611f735580612bc08161175a565b612c1b5760405162461bcd60e51b815260206004820152602660248201527f7468652070726f6f6620666f7220746869732073656e646572206973206e6f74604482015265081d985b1a5960d21b60648201526084016110ac565b60105460ff16612c3d5760405162461bcd60e51b81526004016110ac90614f6b565b60085460ff1615612c605760405162461bcd60e51b81526004016110ac90615064565b600c54600f54612c7090426152b2565b1115612cbe5760405162461bcd60e51b815260206004820152601860248201527f4561726c79206d696e74696e672068617320706173736564000000000000000060448201526064016110ac565b601054610100900460ff16612d325760405162461bcd60e51b815260206004820152603460248201527f546865206561726c79206d696e74696e672069732064697361626c65642e205560448201527339b2903a34329036b4b73a10333ab731ba34b7b760611b60648201526084016110ac565b600b54600f54612d4290426152b2565b11612df957600a8360ff161115612db65760405162461bcd60e51b815260206004820152603260248201527f546f206d616e7920746f6b656e7320746f206265206d696e746564206561726c6044820152717920696e207468652066697273742064617960701b60648201526084016110ac565b33600090815260116020526040902054600a90612dd69060ff8616615154565b1115612df45760405162461bcd60e51b81526004016110ac90614fa2565b612e8b565b60198360ff161115612e4d5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d616e79206561726c7920746f6b656e7320746f206d696e7400000060448201526064016110ac565b33600090815260116020526040902054601990612e6d9060ff8616615154565b1115612e8b5760405162461bcd60e51b81526004016110ac90614fa2565b336000908152601160205260408120805460ff86169290612ead908490615154565b90915550612ebc9050836134a6565b50506001611f735550565b611f64546001600160a01b03610100909104163314612ef85760405162461bcd60e51b81526004016110ac90614fe8565b6001600160a01b038116612f5d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110ac565b611af9816137c0565b3360009081526003602052604090205460ff1680612fde5760405162461bcd60e51b815260206004820152602f60248201527f5468652073656e646572206973206e6f7420616c6c6f77656420746f2063686160448201526e6e676520746865206164647265737360881b60648201526084016110ac565b33600090815260036020526040808220805460ff199081169091556001600160a01b0385168352908220805490911660ff841617905582906130216001846152c9565b60ff1681548110613034576130346153de565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b611f64546001600160a01b036101009091041633146130975760405162461bcd60e51b81526004016110ac90614fe8565b60145460ff166130f55760405162461bcd60e51b815260206004820152602360248201527f50726f76656e616e63652063616e2774206265206368616e67656420616e796d6044820152626f726560e81b60648201526084016110ac565b600081511161313c5760405162461bcd60e51b815260206004820152601360248201527270726f76656e616e636520697320656d70747960681b60448201526064016110ac565b80516113cc906015906020840190614924565b60006001600160e01b0319821663780e9d6360e01b1480610fe65750610fe682613afd565b6000818152611f6c6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906131aa82612120565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b3360009081526003602052604090205460ff166132016001826152c9565b9050600060028260ff168154811061321b5761321b6153de565b90600052602060002001549050600081116132715760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016110ac565b6000600260055461328291906151e8565b61329061ffff881684615293565b61329a9190615191565b9050831561335457838110156132e85760405162461bcd60e51b8152602060048201526013602482015272546f6f206d75636820746f207769746472617760681b60448201526064016110ac565b8360028460ff16815481106132ff576132ff6153de565b90600052602060002001600082825461331891906152b2565b909155505060ff87166000908152600760205260408120805486929061333f908490615154565b9091555061334f9050858561367a565b6133bb565b8060028460ff168154811061336b5761336b6153de565b90600052602060002001600082825461338491906152b2565b909155505060ff8716600090815260076020526040812080548392906133ab908490615154565b909155506133bb9050858261367a565b50505050505050565b6133ce33826138c4565b6133ea5760405162461bcd60e51b81526004016110ac9061509b565b611374838383613b3d565b600082815b8351811015613499576000848281518110613417576134176153de565b60200260200101519050808311613459576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613486565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806134918161534d565b9150506133fa565b50611f6554149392505050565b611f6e5460ff16156134ee5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b60448201526064016110ac565b60006134fa611f715490565b905060198260ff16111561355f5760405162461bcd60e51b815260206004820152602660248201527f45786365656473206d6178696d756d20746f6b656e7320706572207472616e7360448201526530b1ba34b7b760d11b60648201526084016110ac565b600d5461356e90611f486152b2565b61357b60ff841683615154565b11156135da5760405162461bcd60e51b815260206004820152602860248201527f45786365656473206d6178696d756d20746f6b656e7320617661696c61626c65604482015267081d1bc81b5a5b9d60c21b60648201526084016110ac565b6135ee66470de4df82000060ff8416613ceb565b34146136475760405162461bcd60e51b815260206004820152602260248201527f4d696e742076616c7565206973206e6f7420746865206578706563746564206f6044820152616e6560f01b60648201526084016110ac565b60005b8260ff168110156136705761365e33613cf7565b806136688161534d565b91505061364a565b506113cc82613d16565b60405182906000906001600160a01b0383169084908381818185875af1925050503d80600081146136c7576040519150601f19603f3d011682016040523d82523d6000602084013e6136cc565b606091505b505090508061282a5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016110ac565b611f6e5460ff1661375a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016110ac565b611f6e805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b611374838383604051806020016040528060008152506127f8565b611f6480546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b8160ff168160ff1610156113745761383583613cf7565b8061383f81615368565b91505061381e565b611f6e5460ff161561388e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016110ac565b611f6e805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137883390565b6000818152611f6a60205260408120546001600160a01b031661393e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016110ac565b600061394983612120565b9050806001600160a01b0316846001600160a01b031614806139845750836001600160a01b0316613979846111cc565b6001600160a01b0316145b806139b557506001600160a01b038082166000908152611f6d602090815260408083209388168352929052205460ff165b949350505050565b6139c8848484613b3d565b6139d484848484613f45565b61282a5760405162461bcd60e51b81526004016110ac90614f19565b60606013805461114990615318565b606081613a235750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613a4d5780613a378161534d565b9150613a469050600a83615191565b9150613a27565b60008167ffffffffffffffff811115613a6857613a686153f4565b6040519080825280601f01601f191660200182016040528015613a92576020820181803683370190505b5090505b84156139b557613aa76001836152b2565b9150613ab4600a86615388565b613abf906030615154565b60f81b818381518110613ad457613ad46153de565b60200101906001600160f81b031916908160001a905350613af6600a86615191565b9450613a96565b60006001600160e01b031982166380ac58cd60e01b1480613b2e57506001600160e01b03198216635b5e139f60e01b145b80610fe65750610fe682614052565b826001600160a01b0316613b5082612120565b6001600160a01b031614613bb85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016110ac565b6001600160a01b038216613c1a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016110ac565b613c2583838361408f565b613c30600082613174565b6001600160a01b0383166000908152611f6b60205260408120805460019290613c5a9084906152b2565b90915550506001600160a01b0382166000908152611f6b60205260408120805460019290613c89908490615154565b90915550506000818152611f6a602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061179a8284615293565b6000613d0161409a565b9050613d0c816141f7565b6113cc8282614270565b60005460045434919060ff80821691613d3691869161010090041661516c565b60ff1611613e2c5782600460018282829054906101000a900460ff16613d5c919061516c565b92506101000a81548160ff021916908360ff16021790555060005b8160ff168160ff16101561282a57600060055460018360ff1681548110613da057613da06153de565b906000526020600020015485613db69190615293565b613dc09190615191565b90508060028360ff1681548110613dd957613dd96153de565b906000526020600020016000828254613df29190615154565b90915550613e0390506001846152c9565b60ff168260ff161415613e1957613e198161428a565b5080613e2481615368565b915050613d77565b6004805461ff001916905560005b60005460ff8216101561282a57600060055460018360ff1681548110613e6257613e626153de565b906000526020600020015485613e789190615293565b613e829190615191565b9050613e8f6001846152c9565b60ff168260ff161415613eaa57613ea58161428a565b613f32565b60028260ff1681548110613ec057613ec06153de565b906000526020600020015481613ed69190615154565b9050600060028360ff1681548110613ef057613ef06153de565b9060005260206000200181905550613f3260008360ff1681548110613f1757613f176153de565b6000918252602090912001546001600160a01b03168261367a565b5080613f3d81615368565b915050613e3a565b60006001600160a01b0384163b1561404757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613f89903390899088908890600401614dc9565b602060405180830381600087803b158015613fa357600080fd5b505af1925050508015613fd3575060408051601f3d908101601f19168201909252613fd091810190614c9f565b60015b61402d573d808015614001576040519150601f19603f3d011682016040523d82523d6000602084013e614006565b606091505b5080516140255760405162461bcd60e51b81526004016110ac90614f19565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506139b5565b506001949350505050565b60006301ffc9a760e01b6001600160e01b031983161480610fe65750506001600160e01b0319166000908152611f67602052604090205460ff1690565b61137483838361445a565b6000806140a7611f715490565b6140b390611f486152b2565b6016546040805160208101929092526001600160601b03193360601b169082015244605482015242607482015290915060009082906094016040516020818303038152906040528051906020012060001c61410e9190615388565b90506000601782611f488110614126576141266153de565b01541561414a57601782611f488110614141576141416153de565b0154905061414d565b50805b601761415a6001856152b2565b611f48811061416b5761416b6153de565b01546141975761417c6001846152b2565b601783611f488110614190576141906153de565b01556141ce565b60176141a46001856152b2565b611f4881106141b5576141b56153de565b0154601783611f4881106141cb576141cb6153de565b01555b601680549060006141de8361534d565b909155506141ef9050816001615154565b935050505090565b611f5f54611f605414156142085750565b60006142138261451f565b9050611f5f548110156113cc57506000818152611f6160205260408120805460ff19166001908117909155611f60805491820181559091527fbccb917d26f9cd64d9537fc498853caaed3bd1119484caeac948ea9947c6caaa0155565b6113cc82826040518060200160405280600081525061459b565b600260055461429991906151e8565b6004546142b09062010000900461ffff1683615293565b6142ba9190615191565b600080805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f880549091906142f5908490615154565b9091555050600554614309906002906151e8565b60045461432290640100000000900461ffff1683615293565b61432c9190615191565b6002600090815260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace298054909190614369908490615154565b909155505060055461437d906002906151e8565b600454614398906601000000000000900461ffff1683615293565b6143a29190615191565b6001600090815260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a3180549091906143df908490615154565b90915550506005546143f3906002906151e8565b60045461440b90600160401b900461ffff1683615293565b6144159190615191565b6003600090815260066020527f75f96ab15d697e93042dc45b5c896c4b27e89bb6eaf39475c5c371cb2513f7d28054909190614452908490615154565b909155505050565b6144658383836145ce565b6001600160a01b0383166144c2576144bd81611f7180546000838152611f7260205260408120829055600182018355919091527f81e56acc2cc4fd28b151ca5123b342a155824205f7b3f384e54555891f3fded10155565b6144e5565b816001600160a01b0316836001600160a01b0316146144e5576144e58382614636565b6001600160a01b0382166144fc57611374816146d8565b826001600160a01b0316826001600160a01b03161461137457611374828261478d565b611f625460165460408051602081018590529081019290925260608083019190915233901b6001600160601b03191660808201524460948201524260b48201526000908190611f489060d4016040516020818303038152906040528051906020012060001c61458e9190615388565b611f628190559392505050565b6145a583836147d3565b6145b26000848484613f45565b6113745760405162461bcd60e51b81526004016110ac90614f19565b611f6e5460ff16156113745760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b60648201526084016110ac565b60006001614643846122a2565b61464d91906152b2565b6000838152611f7060205260409020549091508082146146a3576001600160a01b0384166000908152611f6f602090815260408083208584528252808320548484528184208190558352611f7090915290208190555b506000918252611f70602090815260408084208490556001600160a01b039094168352611f6f81528383209183525290812055565b611f71546000906146eb906001906152b2565b6000838152611f726020526040812054611f718054939450909284908110614715576147156153de565b9060005260206000200154905080611f718381548110614737576147376153de565b6000918252602080832090910192909255828152611f729091526040808220849055858252812055611f71805480614771576147716153c8565b6001900381819060005260206000200160009055905550505050565b6000614798836122a2565b6001600160a01b039093166000908152611f6f602090815260408083208684528252808320859055938252611f709052919091209190915550565b6001600160a01b0382166148295760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016110ac565b6000818152611f6a60205260409020546001600160a01b03161561488f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016110ac565b61489b6000838361408f565b6001600160a01b0382166000908152611f6b602052604081208054600192906148c5908490615154565b90915550506000818152611f6a602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461493090615318565b90600052602060002090601f0160209004810192826149525760008555614998565b82601f1061496b57805160ff1916838001178555614998565b82800160010185558215614998579182015b8281111561499857825182559160200191906001019061497d565b506149a49291506149a8565b5090565b5b808211156149a457600081556001016149a9565b600067ffffffffffffffff8311156149d7576149d76153f4565b6149ea601f8401601f1916602001615123565b90508281528383830111156149fe57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114614a2c57600080fd5b919050565b600082601f830112614a4257600080fd5b8135602067ffffffffffffffff821115614a5e57614a5e6153f4565b8160051b614a6d828201615123565b838152828101908684018388018501891015614a8857600080fd5b600093505b85841015614aab578035835260019390930192918401918401614a8d565b50979650505050505050565b803560ff81168114614a2c57600080fd5b600060208284031215614ada57600080fd5b61179a82614a15565b60008060408385031215614af657600080fd5b614aff83614a15565b9150614b0d60208401614a15565b90509250929050565b600080600060608486031215614b2b57600080fd5b614b3484614a15565b9250614b4260208501614a15565b9150604084013590509250925092565b60008060008060808587031215614b6857600080fd5b614b7185614a15565b9350614b7f60208601614a15565b925060408501359150606085013567ffffffffffffffff811115614ba257600080fd5b8501601f81018713614bb357600080fd5b614bc2878235602084016149bd565b91505092959194509250565b60008060408385031215614be157600080fd5b614bea83614a15565b915060208301358015158114614bff57600080fd5b809150509250929050565b60008060408385031215614c1d57600080fd5b614c2683614a15565b946020939093013593505050565b600060208284031215614c4657600080fd5b813567ffffffffffffffff811115614c5d57600080fd5b6139b584828501614a31565b600060208284031215614c7b57600080fd5b5035919050565b600060208284031215614c9457600080fd5b813561179a8161540a565b600060208284031215614cb157600080fd5b815161179a8161540a565b600060208284031215614cce57600080fd5b813567ffffffffffffffff811115614ce557600080fd5b8201601f81018413614cf657600080fd5b6139b5848235602084016149bd565b600060208284031215614d1757600080fd5b61179a82614ab7565b60008060408385031215614d3357600080fd5b614d3c83614ab7565b9150602083013567ffffffffffffffff811115614d5857600080fd5b614d6485828601614a31565b9150509250929050565b60008151808452614d868160208601602086016152ec565b601f01601f19169290920160200192915050565b60008351614dac8184602088016152ec565b835190830190614dc08183602088016152ec565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614dfc90830184614d6e565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614e3e57835183529284019291840191600101614e22565b50909695505050505050565b60208152600061179a6020830184614d6e565b60408152600080845481600182811c915080831680614e7d57607f831692505b6020808410821415614e9d57634e487b7160e01b86526022600452602486fd5b6040880184905260608801828015614ebc5760018114614ecd57614ef8565b60ff19871682528282019750614ef8565b60008c81526020902060005b87811015614ef257815484820152908601908401614ed9565b83019850505b5050878603818901525050505050614f108185614d6e565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601a908201527f4d696e74696e67206861736e2774207374617274656420796574000000000000604082015260600190565b60208082526026908201527f546f6f206d616e79206561726c7920746f6b656e7320746f206d696e7420696e604082015265081d1bdd185b60d21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526027908201527f5468652073656e646572206973206e6f742074686520636f6d6d756e697479206040820152666164647265737360c81b606082015260800190565b60208082526018908201527f426c696e64206d696e74696e6720697320737461727465640000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561514c5761514c6153f4565b604052919050565b600082198211156151675761516761539c565b500190565b600060ff821660ff84168060ff038211156151895761518961539c565b019392505050565b6000826151a0576151a06153b2565b500490565b600181815b808511156151e05781600019048211156151c6576151c661539c565b808516156151d357918102915b93841c93908002906151aa565b509250929050565b600061179a60ff84168360008261520157506001610fe6565b8161520e57506000610fe6565b8160018114615224576002811461522e5761524a565b6001915050610fe6565b60ff84111561523f5761523f61539c565b50506001821b610fe6565b5060208310610133831016604e8410600b841016171561526d575081810a610fe6565b61527783836151a5565b806000190482111561528b5761528b61539c565b029392505050565b60008160001904831182151516156152ad576152ad61539c565b500290565b6000828210156152c4576152c461539c565b500390565b600060ff821660ff8416808210156152e3576152e361539c565b90039392505050565b60005b838110156153075781810151838201526020016152ef565b8381111561282a5750506000910152565b600181811c9082168061532c57607f821691505b6020821081141561161157634e487b7160e01b600052602260045260246000fd5b60006000198214156153615761536161539c565b5060010190565b600060ff821660ff81141561537f5761537f61539c565b60010192915050565b600082615397576153976153b2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611af957600080fdfea2646970667358221220ed6df98d6ba4c3ed0234d7efbc2ae34329a90b69277de9c8f9900300f2d3848464736f6c63430008050033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000957657457616966757300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003574554000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000008aebb11c2602818c154d16d2ce325e77e0f9b89a00000000000000000000000057eaebe03841ecb923ade81bf9a232cd2b0ce0aa000000000000000000000000d02ae906edc339872b8300020fc4411c4f4036e10000000000000000000000004e70048a971b470066afabd4a184ef96317736d0000000000000000000000000c39d0fcfa32219f1246ef538746244372339fe5f00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d

-----Decoded View---------------
Arg [0] : name_ (string): WetWaifus
Arg [1] : symbol_ (string): WET
Arg [2] : receiverAddresses_ (address[]): 0x8AEbb11C2602818c154D16D2cE325e77e0F9b89a,0x57EAebE03841Ecb923AdE81bF9A232cd2b0cE0aA,0xd02AE906edc339872b8300020Fc4411c4f4036e1,0x4E70048a971B470066AfAbD4A184Ef96317736d0,0xc39D0FCfA32219f1246EF538746244372339fe5f
Arg [3] : receiverPercentages_ (uint256[]): 39,35,5,8,13

-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 5765745761696675730000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 5745540000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 0000000000000000000000008aebb11c2602818c154d16d2ce325e77e0f9b89a
Arg [10] : 00000000000000000000000057eaebe03841ecb923ade81bf9a232cd2b0ce0aa
Arg [11] : 000000000000000000000000d02ae906edc339872b8300020fc4411c4f4036e1
Arg [12] : 0000000000000000000000004e70048a971b470066afabd4a184ef96317736d0
Arg [13] : 000000000000000000000000c39d0fcfa32219f1246ef538746244372339fe5f
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [19] : 000000000000000000000000000000000000000000000000000000000000000d


Deployed Bytecode Sourcemap

71896:17179:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58054:244;;;;;;;;;;-1:-1:-1;58054:244:0;;;;;:::i;:::-;;:::i;:::-;;;9783:14:1;;9776:22;9758:41;;9746:2;9731:18;58054:244:0;;;;;;;;56944:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;81326:280::-;;;;;;;;;;;;;:::i;:::-;;26546:100;;;;;;;;;;;;;:::i;28105:221::-;;;;;;;;;;-1:-1:-1;28105:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8444:32:1;;;8426:51;;8414:2;8399:18;28105:221:0;8381:102:1;27628:411:0;;;;;;;;;;-1:-1:-1;27628:411:0;;;;;:::i;:::-;;:::i;77098:197::-;;;;;;;;;;-1:-1:-1;77098:197:0;;;;;:::i;:::-;;:::i;80951:314::-;;;;;;;;;;-1:-1:-1;80951:314:0;;;;;:::i;:::-;;:::i;81667:155::-;;;;;;;;;;;;;:::i;75605:127::-;;;;;;;;;;-1:-1:-1;75722:1:0;75668:7;75695:29;:26;:29;;;;75605:127;;;9956:25:1;;;9944:2;9929:18;75605:127:0;9911:76:1;61948:534:0;;;;;;;;;;-1:-1:-1;61948:534:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54476:51::-;;;;;;;;;;-1:-1:-1;54476:51:0;;;;;;;;;;;36918:4:1;36906:17;;;36888:36;;36876:2;36861:18;54476:51:0;36843:87:1;76750:127:0;;;;;;;;;;;;;:::i;56390:29::-;;;;;;;;;;;;;:::i;62549:163::-;;;;;;;;;;;;;:::i;53764:52::-;;;;;;;;;;;;53814:2;53764:52;;59976:99;;;;;;;;;;-1:-1:-1;60046:21:0;59976:99;;55522:35;;;;;;;;;;;;;;;;43454:113;;;;;;;;;;-1:-1:-1;43542:10:0;:17;43454:113;;78293:191;;;;;;;;;;-1:-1:-1;78293:191:0;;;;;:::i;:::-;;:::i;74660:165::-;;;;;;;;;;-1:-1:-1;74756:7:0;74788:29;;:26;:29;;;;74660:165;;59328:179;;;;;;;;;;-1:-1:-1;59328:179:0;;;;;:::i;:::-;;:::i;4530:183::-;;;;;;;;;;-1:-1:-1;4530:183:0;;;;;:::i;:::-;;:::i;82476:668::-;;;;;;:::i;:::-;;:::i;43122:256::-;;;;;;;;;;-1:-1:-1;43122:256:0;;;;;:::i;:::-;;:::i;60632:306::-;;;;;;;;;;;;;:::i;75379:141::-;;;;;;;;;;;;;:::i;80664:184::-;;;;;;;;;;;;;:::i;62821:372::-;;;;;;;;;;-1:-1:-1;62821:372:0;;;;;:::i;:::-;;:::i;77370:111::-;;;;;;;;;;;;;:::i;55324:47::-;;;;;;;;;;;;;;;;57911:71;;;;;;;;;;;;;:::i;72983:134::-;;;;;;;;;;;;;:::i;58921:187::-;;;;;;;;;;-1:-1:-1;58921:187:0;;;;;:::i;:::-;;:::i;53905:44::-;;;;;;;;;;;;53948:1;53905:44;;60149:399;;;;;;;;;;;;;:::i;43644:233::-;;;;;;;;;;-1:-1:-1;43644:233:0;;;;;:::i;:::-;;:::i;55413:46::-;;;;;;;;;;;;;;;;38808:86;;;;;;;;;;-1:-1:-1;38879:7:0;;;;38808:86;;55006:39;;;;;;;;;;-1:-1:-1;55006:39:0;;;;;;;;77957:115;;;;;;;;;;;;;:::i;73576:528::-;;;;;;;;;;;;;:::i;55222:59::-;;;;;;;;;;-1:-1:-1;55222:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;56691:33;;;;;;;;;;-1:-1:-1;56691:33:0;;;;;:::i;:::-;;:::i;26240:239::-;;;;;;;;;;-1:-1:-1;26240:239:0;;;;;:::i;:::-;;:::i;54194:36::-;;;;;;;;;;-1:-1:-1;54194:36:0;;;;;:::i;:::-;;:::i;57041:39::-;;;;;;;;;;-1:-1:-1;57041:39:0;;;;;;;;56205:26;;;;;;;;;;;;;:::i;84894:348::-;;;;;;:::i;:::-;;:::i;25970:208::-;;;;;;;;;;-1:-1:-1;25970:208:0;;;;;:::i;:::-;;:::i;2594:94::-;;;;;;;;;;;;;:::i;81894:469::-;;;;;;;;;;-1:-1:-1;81894:469:0;;;;;:::i;:::-;;:::i;55114:41::-;;;;;;;;;;;;;;;;3918:223;;;;;;;;;;-1:-1:-1;3918:223:0;;;;;:::i;:::-;;:::i;78884:187::-;;;;;;;;;;-1:-1:-1;78884:187:0;;;;;:::i;:::-;;:::i;76043:125::-;;;;;;;;;;-1:-1:-1;76158:1:0;76104:7;76131:29;:26;:29;;;;76043:125;;57703:67;;;;;;;;;;;;;:::i;1943:87::-;;;;;;;;;;-1:-1:-1;2016:6:0;;;;;-1:-1:-1;;;;;2016:6:0;1943:87;;26715:104;;;;;;;;;;;;;:::i;80360:232::-;;;;;;;;;;;;;:::i;3530:38::-;;;;;;;;;;-1:-1:-1;3530:38:0;;;;;;;;55997:59;;;;;;;;;;-1:-1:-1;55997:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;56769:39;;;;;;;;;;-1:-1:-1;56769:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53626:55;;;;;;;;;;;;53679:2;53626:55;;55899:31;;;;;;;;;;-1:-1:-1;55899:31:0;;;;;;;;;;;28398:295;;;;;;;;;;-1:-1:-1;28398:295:0;;;;;:::i;:::-;;:::i;76245:141::-;;;;;;;;;;;;;:::i;56124:35::-;;;;;;;;;;-1:-1:-1;56124:35:0;;;;;;;;56302:38;;;;;;;;;;-1:-1:-1;56302:38:0;;;;;;;;78554:111;;;;;;;;;;;;;:::i;56608:39::-;;;;;;;;;;;;;;;;75811:145;;;;;;;;;;;;;:::i;29661:328::-;;;;;;;;;;-1:-1:-1;29661:328:0;;;;;:::i;:::-;;:::i;73205:281::-;;;;;;;;;;;;;:::i;53992:54::-;;;;;;;;;;;;54029:17;53992:54;;54534:47;;;;;;;;;;-1:-1:-1;54534:47:0;;;;;;;;;;;74915:171;;;;;;;;;;;;;:::i;61246:174::-;;;;;;;;;;;;;:::i;26890:334::-;;;;;;;;;;-1:-1:-1;26890:334:0;;;;;:::i;:::-;;:::i;77698:187::-;;;;;;;;;;-1:-1:-1;77698:187:0;;;;;:::i;:::-;;:::i;55773:36::-;;;;;;;;;;-1:-1:-1;55773:36:0;;;;;;;;3640:175;;;;;;;;;;;;;:::i;54110:34::-;;;;;;;;;;-1:-1:-1;54110:34:0;;;;;:::i;:::-;;:::i;55678:31::-;;;;;;;;;;;;;;;;83330:1453;;;;;;:::i;:::-;;:::i;75173:125::-;;;;;;;;;;-1:-1:-1;75288:1:0;75234:7;75261:29;:26;:29;;;;75173:125;;28764:164;;;;;;;;;;-1:-1:-1;28764:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28885:25:0;;;28861:4;28885:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28764:164;55603:39;;;;;;;;;;;;;;;;3502:19;;;;;;;;;;;;;;;;2843:192;;;;;;;;;;-1:-1:-1;2843:192:0;;;;;:::i;:::-;;:::i;53368:41::-;;;;;;;;;;;;53405:4;53368:41;;74237:327;;;;;;;;;;-1:-1:-1;74237:327:0;;;;;:::i;:::-;;:::i;61549:260::-;;;;;;;;;;-1:-1:-1;61549:260:0;;;;;:::i;:::-;;:::i;58054:244::-;58225:4;58254:36;58278:11;58254:23;:36::i;:::-;58247:43;58054:244;-1:-1:-1;;58054:244:0:o;56944:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81326:280::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;;;;;;;;;81395:16:::1;::::0;::::1;;81387:55;;;;-1:-1:-1::0;;;81387:55:0::1;;;;;;;:::i;:::-;81461:19;::::0;::::1;;81453:62;;;::::0;-1:-1:-1;;;81453:62:0;;17206:2:1;81453:62:0::1;::::0;::::1;17188:21:1::0;17245:2;17225:18;;;17218:30;17284:32;17264:18;;;17257:60;17334:18;;81453:62:0::1;17178:180:1::0;81453:62:0::1;81526:19;:27:::0;;-1:-1:-1;;81526:27:0::1;::::0;;81583:15:::1;81564:16;:34:::0;81326:280::o;26546:100::-;26600:13;26633:5;26626:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26546:100;:::o;28105:221::-;28181:7;31588:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31588:16:0;28201:73;;;;-1:-1:-1;;;28201:73:0;;24526:2:1;28201:73:0;;;24508:21:1;24565:2;24545:18;;;24538:30;24604:34;24584:18;;;24577:62;-1:-1:-1;;;24655:18:1;;;24648:42;24707:19;;28201:73:0;24498:234:1;28201:73:0;-1:-1:-1;28294:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28294:24:0;;28105:221::o;27628:411::-;27709:13;27725:23;27740:7;27725:14;:23::i;:::-;27709:39;;27773:5;-1:-1:-1;;;;;27767:11:0;:2;-1:-1:-1;;;;;27767:11:0;;;27759:57;;;;-1:-1:-1;;;27759:57:0;;30571:2:1;27759:57:0;;;30553:21:1;30610:2;30590:18;;;30583:30;30649:34;30629:18;;;30622:62;-1:-1:-1;;;30700:18:1;;;30693:31;30741:19;;27759:57:0;30543:223:1;27759:57:0;805:10;-1:-1:-1;;;;;27851:21:0;;;;:62;;-1:-1:-1;27876:37:0;27893:5;805:10;28764:164;:::i;27876:37::-;27829:168;;;;-1:-1:-1;;;27829:168:0;;21789:2:1;27829:168:0;;;21771:21:1;21828:2;21808:18;;;21801:30;21867:34;21847:18;;;21840:62;21938:26;21918:18;;;21911:54;21982:19;;27829:168:0;21761:246:1;27829:168:0;28010:21;28019:2;28023:7;28010:8;:21::i;:::-;27698:341;27628:411;;:::o;77098:197::-;76559:21;:19;:21::i;:::-;-1:-1:-1;;;;;76545:35:0;:10;-1:-1:-1;;;;;76545:35:0;;76523:124;;;;-1:-1:-1;;;76523:124:0;;;;;;;:::i;:::-;77257:16:::1;::::0;77229:58:::1;::::0;77254:1:::1;::::0;77257:16;;::::1;;;77275:2:::0;77279:7;77229:24:::1;:58::i;:::-;77098:197:::0;;:::o;80951:314::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;81056:20:::1;::::0;::::1;;81034:111;;;::::0;-1:-1:-1;;;81034:111:0;;12864:2:1;81034:111:0::1;::::0;::::1;12846:21:1::0;12903:2;12883:18;;;12876:30;12942:34;12922:18;;;12915:62;-1:-1:-1;;;12993:18:1;;;12986:39;13042:19;;81034:111:0::1;12836:231:1::0;81034:111:0::1;81193:1;81170:12;81164:26;:30;81156:64;;;::::0;-1:-1:-1;;;81156:64:0;;16448:2:1;81156:64:0::1;::::0;::::1;16430:21:1::0;16487:2;16467:18;;;16460:30;-1:-1:-1;;;16506:18:1;;;16499:51;16567:18;;81156:64:0::1;16420:171:1::0;81156:64:0::1;81231:26:::0;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;81667:155::-:0;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;81736:12:::1;::::0;::::1;::::0;::::1;;;81728:55;;;::::0;-1:-1:-1;;;81728:55:0;;30212:2:1;81728:55:0::1;::::0;::::1;30194:21:1::0;30251:2;30231:18;;;30224:30;30290:32;30270:18;;;30263:60;30340:18;;81728:55:0::1;30184:180:1::0;81728:55:0::1;81794:12;:20:::0;;-1:-1:-1;;81794:20:0::1;::::0;;81667:155::o;61948:534::-;62037:16;62071:18;62092:17;62102:6;62092:9;:17::i;:::-;62071:38;-1:-1:-1;62124:15:0;62120:355;;62163:16;;;62177:1;62163:16;;;;;;;;;;;-1:-1:-1;62156:23:0;61948:534;-1:-1:-1;;;61948:534:0:o;62120:355::-;62212:23;62252:10;62238:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62238:25:0;;62212:51;;62278:13;62306:130;62330:10;62322:5;:18;62306:130;;;62386:34;62406:6;62414:5;62386:19;:34::i;:::-;62370:6;62377:5;62370:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;62342:7;;;;:::i;:::-;;;;62306:130;;62120:355;62060:422;61948:534;;;:::o;76750:127::-;76559:21;:19;:21::i;:::-;-1:-1:-1;;;;;76545:35:0;:10;-1:-1:-1;;;;;76545:35:0;;76523:124;;;;-1:-1:-1;;;76523:124:0;;;;;;;:::i;:::-;76829:40:::1;76855:10;76867:1;76829:25;:40::i;:::-;76750:127::o:0;56390:29::-;;;;;;;:::i;62549:163::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;62620:16:::1;::::0;::::1;;62612:57;;;::::0;-1:-1:-1;;;62612:57:0;;19497:2:1;62612:57:0::1;::::0;::::1;19479:21:1::0;19536:2;19516:18;;;19509:30;19575;19555:18;;;19548:58;19623:18;;62612:57:0::1;19469:178:1::0;62612:57:0::1;62680:16;:24:::0;;-1:-1:-1;;62680:24:0::1;::::0;;62549:163::o;78293:191::-;76559:21;:19;:21::i;:::-;-1:-1:-1;;;;;76545:35:0;:10;-1:-1:-1;;;;;76545:35:0;;76523:124;;;;-1:-1:-1;;;76523:124:0;;;;;;;:::i;:::-;78446:16:::1;::::0;78418:58:::1;::::0;78443:1:::1;::::0;78446:16;;::::1;;;78464:2:::0;78468:7;78418:24:::1;:58::i;59328:179::-:0;59462:37;59481:4;59487:2;59491:7;59462:18;:37::i;4530:183::-;4639:28;;-1:-1:-1;;;;;;4656:10:0;6266:2:1;6262:15;6258:53;4639:28:0;;;6246:66:1;4597:4:0;;;;6328:12:1;;4639:28:0;;;;;;;;;;;;4629:39;;;;;;4614:54;;4686:19;4693:4;4699:5;4686:6;:19::i;:::-;4679:26;4530:183;-1:-1:-1;;;4530:183:0:o;82476:668::-;52091:1;52687:7;;:19;;52679:63;;;;-1:-1:-1;;;52679:63:0;;;;;;;:::i;:::-;52091:1;52820:7;:18;82556:16:::1;::::0;::::1;;82548:55;;;;-1:-1:-1::0;;;82548:55:0::1;;;;;;;:::i;:::-;82622:19;::::0;::::1;;82614:60;;;::::0;-1:-1:-1;;;82614:60:0;;33251:2:1;82614:60:0::1;::::0;::::1;33233:21:1::0;33290:2;33270:18;;;33263:30;33329;33309:18;;;33302:58;33377:18;;82614:60:0::1;33223:178:1::0;82614:60:0::1;82745:16;::::0;82725::::1;::::0;82707:34:::1;::::0;:15:::1;:34;:::i;:::-;:54;;82685:128;;;::::0;-1:-1:-1;;;82685:128:0;;33608:2:1;82685:128:0::1;::::0;::::1;33590:21:1::0;33647:2;33627:18;;;33620:30;33686:26;33666:18;;;33659:54;33730:18;;82685:128:0::1;33580:174:1::0;82685:128:0::1;53948:1;82832:6;:26;;;;82824:67;;;::::0;-1:-1:-1;;;82824:67:0;;29149:2:1;82824:67:0::1;::::0;::::1;29131:21:1::0;29188:2;29168:18;;;29161:30;29227;29207:18;;;29200:58;29275:18;;82824:67:0::1;29121:178:1::0;82824:67:0::1;82958:10;82933:36;::::0;;;:24:::1;:36;::::0;;;;;53948:1:::1;::::0;82924:45:::1;::::0;::::1;::::0;::::1;;:::i;:::-;:65;;82902:153;;;::::0;-1:-1:-1;;;82902:153:0;;34798:2:1;82902:153:0::1;::::0;::::1;34780:21:1::0;34837:2;34817:18;;;34810:30;34876:34;34856:18;;;34849:62;-1:-1:-1;;;34927:18:1;;;34920:36;34973:19;;82902:153:0::1;34770:228:1::0;82902:153:0::1;83091:10;83066:36;::::0;;;:24:::1;:36;::::0;;;;:46;;::::1;::::0;::::1;::::0;:36;:46:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;83123:13:0::1;::::0;-1:-1:-1;83129:6:0;83123:5:::1;:13::i;:::-;-1:-1:-1::0;52047:1:0;52999:7;:22;82476:668::o;43122:256::-;43219:7;43255:23;43272:5;43255:16;:23::i;:::-;43247:5;:31;43239:87;;;;-1:-1:-1;;;43239:87:0;;14041:2:1;43239:87:0;;;14023:21:1;14080:2;14060:18;;;14053:30;14119:34;14099:18;;;14092:62;-1:-1:-1;;;14170:18:1;;;14163:41;14221:19;;43239:87:0;14013:233:1;43239:87:0;-1:-1:-1;;;;;;43344:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;43122:256::o;60632:306::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;60704:24:::1;60731:29;:27;:29::i;:::-;60704:56;;60812:1;60793:16;:20;60771:110;;;::::0;-1:-1:-1;;;60771:110:0;;13274:2:1;60771:110:0::1;::::0;::::1;13256:21:1::0;13313:2;13293:18;;;13286:30;13352:34;13332:18;;;13325:62;-1:-1:-1;;;13403:18:1;;;13396:38;13451:19;;60771:110:0::1;13246:230:1::0;60771:110:0::1;2016:6:::0;;60892:38:::1;::::0;2016:6;;;-1:-1:-1;;;;;2016:6:0;60913:16:::1;60892:11;:38::i;:::-;60693:245;60632:306::o:0;75379:141::-;75510:1;75428:7;75488:24;;;;;75261:26;75488:24;75261:29;;;75455:30;:57;;;;:::i;:::-;75448:64;;75379:141;:::o;80664:184::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;80739:20:::1;::::0;::::1;;80731:70;;;::::0;-1:-1:-1;;;80731:70:0;;17565:2:1;80731:70:0::1;::::0;::::1;17547:21:1::0;17604:2;17584:18;;;17577:30;17643:34;17623:18;;;17616:62;-1:-1:-1;;;17694:18:1;;;17687:35;17739:19;;80731:70:0::1;17537:227:1::0;80731:70:0::1;80812:20;:28:::0;;-1:-1:-1;;80812:28:0::1;::::0;;80664:184::o;62821:372::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;62904:16:::1;::::0;::::1;;62896:65;;;::::0;-1:-1:-1;;;62896:65:0;;14872:2:1;62896:65:0::1;::::0;::::1;14854:21:1::0;14911:2;14891:18;;;14884:30;14950:34;14930:18;;;14923:62;-1:-1:-1;;;15001:18:1;;;14994:34;15045:19;;62896:65:0::1;14844:226:1::0;62896:65:0::1;62981:19;::::0;::::1;;62980:20;62972:57;;;;-1:-1:-1::0;;;62972:57:0::1;;;;;;;:::i;:::-;63073:1;63054:8;63048:22;:26;63040:55;;;::::0;-1:-1:-1;;;63040:55:0;;26461:2:1;63040:55:0::1;::::0;::::1;26443:21:1::0;26500:2;26480:18;;;26473:30;-1:-1:-1;;;26519:18:1;;;26512:46;26575:18;;63040:55:0::1;26433:166:1::0;63040:55:0::1;63126:10;-1:-1:-1::0;;;;;63111:45:0::1;;63138:7;63147:8;63111:45;;;;;;;:::i;:::-;;;;;;;;63167:18:::0;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;77370:111::-:0;76559:21;:19;:21::i;:::-;-1:-1:-1;;;;;76545:35:0;:10;-1:-1:-1;;;;;76545:35:0;;76523:124;;;;-1:-1:-1;;;76523:124:0;;;;;;;:::i;:::-;77441:32:::1;77459:10;77471:1;77441:17;:32::i;57911:71::-:0;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;57958:16:::1;:14;:16::i;72983:134::-:0;73035:7;73080:24;;73035:7;;73080:28;;73107:1;;73080:28;:::i;:::-;73062:47;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;73062:47:0;;72983:134;-1:-1:-1;72983:134:0:o;58921:187::-;59059:41;59082:4;59088:2;59092:7;59059:22;:41::i;60149:399::-;60209:7;60247:21;60209:7;;60313:117;60335:18;:25;60331:29;;;;60313:117;;;60397:18;60416:1;60397:21;;;;;;;;;;:::i;:::-;;;;;;;;;60382:36;;;;;:::i;:::-;;-1:-1:-1;60362:3:0;;;;:::i;:::-;;;;60313:117;;;;60454:11;60444:7;:21;60440:82;;;60489:21;60499:11;60489:7;:21;:::i;:::-;60482:28;;;;60149:399;:::o;60440:82::-;60539:1;60532:8;;;;60149:399;:::o;43644:233::-;43719:7;43755:30;43542:10;:17;;43454:113;43755:30;43747:5;:38;43739:95;;;;-1:-1:-1;;;43739:95:0;;32838:2:1;43739:95:0;;;32820:21:1;32877:2;32857:18;;;32850:30;32916:34;32896:18;;;32889:62;-1:-1:-1;;;32967:18:1;;;32960:42;33019:19;;43739:95:0;32810:234:1;43739:95:0;43852:10;43863:5;43852:17;;;;;;;;:::i;:::-;;;;;;;;;43845:24;;43644:233;;;:::o;77957:115::-;76559:21;:19;:21::i;:::-;-1:-1:-1;;;;;76545:35:0;:10;-1:-1:-1;;;;;76545:35:0;;76523:124;;;;-1:-1:-1;;;76523:124:0;;;;;;;:::i;:::-;78030:34:::1;78050:10;78062:1;78030:19;:34::i;73576:528::-:0;73657:21;:19;:21::i;:::-;-1:-1:-1;;;;;73643:35:0;:10;-1:-1:-1;;;;;73643:35:0;;;73621:136;;;;-1:-1:-1;;;73621:136:0;;36346:2:1;73621:136:0;;;36328:21:1;36385:2;36365:18;;;36358:30;36424:34;36404:18;;;36397:62;-1:-1:-1;;;36475:18:1;;;36468:49;36534:19;;73621:136:0;36318:241:1;73621:136:0;73797:10;73768:11;73782:26;;;:14;:26;;;;;;;;73827:9;73819:68;;;;-1:-1:-1;;;73819:68:0;;20622:2:1;73819:68:0;;;20604:21:1;20661:2;20641:18;;;20634:30;20700:34;20680:18;;;20673:62;-1:-1:-1;;;20751:18:1;;;20744:44;20805:19;;73819:68:0;20594:236:1;73819:68:0;73898:10;73907:1;73898:10;;:::i;:::-;;;73919:13;73935:18;73954:5;73935:25;;;;;;;;;;:::i;:::-;;;;;;;;;73919:41;;73987:1;73979:5;:9;73971:44;;;;-1:-1:-1;;;73971:44:0;;29861:2:1;73971:44:0;;;29843:21:1;29900:2;29880:18;;;29873:30;-1:-1:-1;;;29919:18:1;;;29912:52;29981:18;;73971:44:0;29833:172:1;73971:44:0;74054:1;74026:18;74045:5;74026:25;;;;;;;;;;:::i;:::-;;;;;;;;;;:29;74066:30;74078:10;74090:5;74066:11;:30::i;56691:33::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56691:33:0;:::o;26240:239::-;26312:7;26348:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26348:16:0;26383:19;26375:73;;;;-1:-1:-1;;;26375:73:0;;22625:2:1;26375:73:0;;;22607:21:1;22664:2;22644:18;;;22637:30;22703:34;22683:18;;;22676:62;-1:-1:-1;;;22754:18:1;;;22747:39;22803:19;;26375:73:0;22597:231:1;54194:36:0;;;;;;;;;;;;56205:26;;;;;;;:::i;84894:348::-;52091:1;52687:7;;:19;;52679:63;;;;-1:-1:-1;;;52679:63:0;;;;;;;:::i;:::-;52091:1;52820:7;:18;84969:16:::1;::::0;::::1;;84961:55;;;;-1:-1:-1::0;;;84961:55:0::1;;;;;;;:::i;:::-;85036:19;::::0;::::1;;85035:20;85027:57;;;;-1:-1:-1::0;;;85027:57:0::1;;;;;;;:::i;:::-;85118:12;::::0;::::1;::::0;::::1;;;85117:13;85095:115;;;::::0;-1:-1:-1;;;85095:115:0;;33961:2:1;85095:115:0::1;::::0;::::1;33943:21:1::0;34000:2;33980:18;;;33973:30;34039:34;34019:18;;;34012:62;-1:-1:-1;;;34090:18:1;;;34083:50;34150:19;;85095:115:0::1;33933:242:1::0;85095:115:0::1;85221:13;85227:6;85221:5;:13::i;25970:208::-:0;26042:7;-1:-1:-1;;;;;26070:19:0;;26062:74;;;;-1:-1:-1;;;26062:74:0;;22214:2:1;26062:74:0;;;22196:21:1;22253:2;22233:18;;;22226:30;22292:34;22272:18;;;22265:62;-1:-1:-1;;;22343:18:1;;;22336:40;22393:19;;26062:74:0;22186:232:1;26062:74:0;-1:-1:-1;;;;;;26154:16:0;;;;;:9;:16;;;;;;;25970:208::o;2594:94::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;2659:21:::1;2677:1;2659:9;:21::i;81894:469::-:0;82021:1;82012:6;:10;;;:38;;;;;82036:14;;82026:6;:24;;;;82012:38;81990:128;;;;-1:-1:-1;;;81990:128:0;;23756:2:1;81990:128:0;;;23738:21:1;23795:2;23775:18;;;23768:30;23834:34;23814:18;;;23807:62;-1:-1:-1;;;23885:18:1;;;23878:38;23933:19;;81990:128:0;23728:230:1;81990:128:0;82184:14;;82160:20;;82151:29;;;;;;:::i;:::-;:47;;82129:129;;;;-1:-1:-1;;;82129:129:0;;23395:2:1;82129:129:0;;;23377:21:1;;;23414:18;;;23407:30;23473:34;23453:18;;;23446:62;23525:18;;82129:129:0;23367:182:1;82129:129:0;82293:6;82269:30;;:20;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;82310:45:0;;-1:-1:-1;82325:21:0;:19;:21::i;:::-;82348:6;82310:14;:45::i;3918:223::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;3994:19:::1;::::0;::::1;;3986:71;;;::::0;-1:-1:-1;;;3986:71:0;;16798:2:1;3986:71:0::1;::::0;::::1;16780:21:1::0;16837:2;16817:18;;;16810:30;16876:34;16856:18;;;16849:62;-1:-1:-1;;;16927:18:1;;;16920:37;16974:19;;3986:71:0::1;16770:229:1::0;3986:71:0::1;4121:4;:12:::0;3918:223::o;78884:187::-;76559:21;:19;:21::i;:::-;-1:-1:-1;;;;;76545:35:0;:10;-1:-1:-1;;;;;76545:35:0;;76523:124;;;;-1:-1:-1;;;76523:124:0;;;;;;;:::i;:::-;79035:14:::1;::::0;79007:56:::1;::::0;79032:1:::1;::::0;-1:-1:-1;;;79035:14:0;::::1;;;79051:2:::0;79055:7;79007:24:::1;:56::i;57703:67::-:0;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;57748:14:::1;:12;:14::i;26715:104::-:0;26771:13;26804:7;26797:14;;;;;:::i;80360:232::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;80421:16:::1;::::0;::::1;;80420:17;80412:56;;;::::0;-1:-1:-1;;;80412:56:0;;29506:2:1;80412:56:0::1;::::0;::::1;29488:21:1::0;29545:2;29525:18;;;29518:30;29584:28;29564:18;;;29557:56;29630:18;;80412:56:0::1;29478:176:1::0;80412:56:0::1;80498:15;80479:16;:34:::0;80524:16:::1;:23:::0;;80543:4:::1;-1:-1:-1::0;;80524:23:0;;::::1;::::0;::::1;::::0;;;80558:19:::1;:26:::0;;;;::::1;::::0;;::::1;::::0;;80360:232::o;28398:295::-;-1:-1:-1;;;;;28501:24:0;;805:10;28501:24;;28493:62;;;;-1:-1:-1;;;28493:62:0;;18795:2:1;28493:62:0;;;18777:21:1;18834:2;18814:18;;;18807:30;18873:27;18853:18;;;18846:55;18918:18;;28493:62:0;18767:175:1;28493:62:0;805:10;28568:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28568:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28568:53:0;;;;;;;;;;28637:48;;9758:41:1;;;28568:42:0;;805:10;28637:48;;9731:18:1;28637:48:0;;;;;;;28398:295;;:::o;76245:141::-;76376:1;76294:7;76354:24;;;;;76131:26;76354:24;76131:29;;;76321:30;76043:125;78554:111;76559:21;:19;:21::i;:::-;-1:-1:-1;;;;;76545:35:0;:10;-1:-1:-1;;;;;76545:35:0;;76523:124;;;;-1:-1:-1;;;76523:124:0;;;;;;;:::i;:::-;78625:32:::1;78643:10;78655:1;78625:17;:32::i;75811:145::-:0;75946:1;75862:7;75924:24;;;;;75695:26;75924:24;75695:29;;;75889:32;75605:127;29661:328;29836:41;805:10;29869:7;29836:18;:41::i;:::-;29828:103;;;;-1:-1:-1;;;29828:103:0;;;;;;;:::i;:::-;29942:39;29956:4;29962:2;29966:7;29975:5;29942:13;:39::i;:::-;29661:328;;;;:::o;73205:281::-;73356:10;73302:7;73341:26;;;:14;:26;;;;;;;;73386:9;73378:53;;;;-1:-1:-1;;;73378:53:0;;35986:2:1;73378:53:0;;;35968:21:1;36025:2;36005:18;;;35998:30;36064:33;36044:18;;;36037:61;36115:18;;73378:53:0;35958:181:1;73378:53:0;73449:18;73468:9;73476:1;73468:5;:9;:::i;:::-;73449:29;;;;;;;;;;:::i;:::-;;;;;;;;;73442:36;;;73205:281;:::o;74915:171::-;74973:7;75054:24;;;;;74788:26;75054:24;74788:29;;;75013:38;74660:165;61246:174;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;61319:19:::1;::::0;::::1;;61311:63;;;::::0;-1:-1:-1;;;61311:63:0;;28789:2:1;61311:63:0::1;::::0;::::1;28771:21:1::0;28828:2;28808:18;;;28801:30;28867:33;28847:18;;;28840:61;28918:18;;61311:63:0::1;28761:181:1::0;61311:63:0::1;61385:19;:27:::0;;-1:-1:-1;;61385:27:0::1;::::0;;61246:174::o;26890:334::-;31564:4;31588:16;;;:7;:16;;;;;;26963:13;;-1:-1:-1;;;;;31588:16:0;26989:76;;;;-1:-1:-1;;;26989:76:0;;27216:2:1;26989:76:0;;;27198:21:1;27255:2;27235:18;;;27228:30;27294:34;27274:18;;;27267:62;-1:-1:-1;;;27345:18:1;;;27338:45;27400:19;;26989:76:0;27188:237:1;26989:76:0;27078:21;27102:10;:8;:10::i;:::-;27078:34;;27154:1;27136:7;27130:21;:25;:86;;;;;;;;;;;;;;;;;27182:7;27191:18;:7;:16;:18::i;:::-;27165:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27123:93;26890:334;-1:-1:-1;;;26890:334:0:o;77698:187::-;76559:21;:19;:21::i;:::-;-1:-1:-1;;;;;76545:35:0;:10;-1:-1:-1;;;;;76545:35:0;;76523:124;;;;-1:-1:-1;;;76523:124:0;;;;;;;:::i;:::-;77821:56:::1;77846:1;77849:14;::::0;::::1;;;;;;;;77865:2;77869:7;77821:24;:56::i;3640:175::-:0;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;3714:19:::1;::::0;::::1;;3706:63;;;::::0;-1:-1:-1;;;3706:63:0;;23035:2:1;3706:63:0::1;::::0;::::1;23017:21:1::0;23074:2;23054:18;;;23047:30;23113:33;23093:18;;;23086:61;23164:18;;3706:63:0::1;23007:181:1::0;3706:63:0::1;3780:19;:27:::0;;-1:-1:-1;;3780:27:0::1;::::0;;3640:175::o;54110:34::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54110:34:0;;-1:-1:-1;54110:34:0;:::o;83330:1453::-;52091:1;52687:7;;:19;;52679:63;;;;-1:-1:-1;;;52679:63:0;;;;;;;:::i;:::-;52091:1;52820:7;:18;83464:5;4333:19:::1;83464:5:::0;4333:12:::1;:19::i;:::-;4325:70;;;::::0;-1:-1:-1;;;4325:70:0;;15684:2:1;4325:70:0::1;::::0;::::1;15666:21:1::0;15723:2;15703:18;;;15696:30;15762:34;15742:18;;;15735:62;-1:-1:-1;;;15813:18:1;;;15806:36;15859:19;;4325:70:0::1;15656:228:1::0;4325:70:0::1;83495:16:::2;::::0;::::2;;83487:55;;;;-1:-1:-1::0;;;83487:55:0::2;;;;;;;:::i;:::-;83562:19;::::0;::::2;;83561:20;83553:57;;;;-1:-1:-1::0;;;83553:57:0::2;;;;;;;:::i;:::-;83681:22;::::0;83661:16:::2;::::0;83643:34:::2;::::0;:15:::2;:34;:::i;:::-;:60;;83621:134;;;::::0;-1:-1:-1;;;83621:134:0;;11750:2:1;83621:134:0::2;::::0;::::2;11732:21:1::0;11789:2;11769:18;;;11762:30;11828:26;11808:18;;;11801:54;11872:18;;83621:134:0::2;11722:174:1::0;83621:134:0::2;83788:12;::::0;::::2;::::0;::::2;;;83766:114;;;::::0;-1:-1:-1;;;83766:114:0;;35205:2:1;83766:114:0::2;::::0;::::2;35187:21:1::0;35244:2;35224:18;;;35217:30;35283:34;35263:18;;;35256:62;-1:-1:-1;;;35334:18:1;;;35327:50;35394:19;;83766:114:0::2;35177:242:1::0;83766:114:0::2;83933:23;::::0;83913:16:::2;::::0;83895:34:::2;::::0;:15:::2;:34;:::i;:::-;:61;83891:804;;53679:2;83999:6;:36;;;;83973:148;;;::::0;-1:-1:-1;;;83973:148:0;;17971:2:1;83973:148:0::2;::::0;::::2;17953:21:1::0;18010:2;17990:18;;;17983:30;18049:34;18029:18;;;18022:62;-1:-1:-1;;;18100:18:1;;;18093:48;18158:19;;83973:148:0::2;17943:240:1::0;83973:148:0::2;84196:10;84171:36;::::0;;;:24:::2;:36;::::0;;;;;53679:2:::2;::::0;84162:45:::2;::::0;::::2;::::0;::::2;;:::i;:::-;:96;;84136:196;;;;-1:-1:-1::0;;;84136:196:0::2;;;;;;;:::i;:::-;83891:804;;;53517:2;84391:6;:26;;;;84365:117;;;::::0;-1:-1:-1;;;84365:117:0;;13683:2:1;84365:117:0::2;::::0;::::2;13665:21:1::0;13722:2;13702:18;;;13695:30;13761:31;13741:18;;;13734:59;13810:18;;84365:117:0::2;13655:179:1::0;84365:117:0::2;84557:10;84532:36;::::0;;;:24:::2;:36;::::0;;;;;53517:2:::2;::::0;84523:45:::2;::::0;::::2;::::0;::::2;;:::i;:::-;:86;;84497:186;;;;-1:-1:-1::0;;;84497:186:0::2;;;;;;;:::i;:::-;84730:10;84705:36;::::0;;;:24:::2;:36;::::0;;;;:46;;::::2;::::0;::::2;::::0;:36;:46:::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;84762:13:0::2;::::0;-1:-1:-1;84768:6:0;84762:5:::2;:13::i;:::-;-1:-1:-1::0;;52047:1:0;52999:7;:22;-1:-1:-1;83330:1453:0:o;2843:192::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2932:22:0;::::1;2924:73;;;::::0;-1:-1:-1;;;2924:73:0;;15277:2:1;2924:73:0::1;::::0;::::1;15259:21:1::0;15316:2;15296:18;;;15289:30;15355:34;15335:18;;;15328:62;-1:-1:-1;;;15406:18:1;;;15399:36;15452:19;;2924:73:0::1;15249:228:1::0;2924:73:0::1;3008:19;3018:8;3008:9;:19::i;74237:327::-:0;74327:10;74298:11;74312:26;;;:14;:26;;;;;;;;74357:9;74349:69;;;;-1:-1:-1;;;74349:69:0;;34382:2:1;74349:69:0;;;34364:21:1;34421:2;34401:18;;;34394:30;34460:34;34440:18;;;34433:62;-1:-1:-1;;;34511:18:1;;;34504:45;34566:19;;74349:69:0;34354:237:1;74349:69:0;74444:10;74458:1;74429:26;;;:14;:26;;;;;;:30;;-1:-1:-1;;74429:30:0;;;;;;-1:-1:-1;;;;;74470:26:0;;;;;;;:34;;;;;74429:30;74470:34;;;;;:26;;74533:9;-1:-1:-1;74470:34:0;74533:9;:::i;:::-;74515:28;;;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;;-1:-1:-1;;;;;74515:41:0;;;;;-1:-1:-1;;;;;74515:41:0;;;;;;74287:277;74237:327;:::o;61549:260::-;2016:6;;-1:-1:-1;;;;;2016:6:0;;;;;805:10;2163:23;2155:68;;;;-1:-1:-1;;;2155:68:0;;;;;;;:::i;:::-;61635:19:::1;::::0;::::1;;61627:67;;;::::0;-1:-1:-1;;;61627:67:0;;25696:2:1;61627:67:0::1;::::0;::::1;25678:21:1::0;25735:2;25715:18;;;25708:30;25774:34;25754:18;;;25747:62;-1:-1:-1;;;25825:18:1;;;25818:33;25868:19;;61627:67:0::1;25668:225:1::0;61627:67:0::1;61741:1;61719:11;61713:25;:29;61705:61;;;::::0;-1:-1:-1;;;61705:61:0;;19149:2:1;61705:61:0::1;::::0;::::1;19131:21:1::0;19188:2;19168:18;;;19161:30;-1:-1:-1;;;19207:18:1;;;19200:49;19266:18;;61705:61:0::1;19121:169:1::0;61705:61:0::1;61777:24:::0;;::::1;::::0;:10:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;42814:224::-:0;42916:4;-1:-1:-1;;;;;;42940:50:0;;-1:-1:-1;;;42940:50:0;;:90;;;42994:36;43018:11;42994:23;:36::i;35481:174::-;35556:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35556:29:0;-1:-1:-1;;;;;35556:29:0;;;;;;;;:24;;35610:23;35556:24;35610:14;:23::i;:::-;-1:-1:-1;;;;;35601:46:0;;;;;;;;;;;35481:174;;:::o;79431:865::-;79620:10;79591:11;79605:26;;;:14;:26;;;;;;;;79642:10;79605:26;;79642:10;:::i;:::-;;;79663:13;79679:18;79698:5;79679:25;;;;;;;;;;:::i;:::-;;;;;;;;;79663:41;;79731:1;79723:5;:9;79715:44;;;;-1:-1:-1;;;79715:44:0;;29861:2:1;79715:44:0;;;29843:21:1;29900:2;29880:18;;;29873:30;-1:-1:-1;;;29919:18:1;;;29912:52;29981:18;;79715:44:0;29833:172:1;79715:44:0;79770:24;79829:1;79817:10;;:13;;;;:::i;:::-;79798:15;;;;:5;:15;:::i;:::-;79797:33;;;;:::i;:::-;79770:60;-1:-1:-1;79845:11:0;;79841:448;;79901:7;79881:16;:27;;79873:59;;;;-1:-1:-1;;;79873:59:0;;24939:2:1;79873:59:0;;;24921:21:1;24978:2;24958:18;;;24951:30;-1:-1:-1;;;24997:18:1;;;24990:49;25056:18;;79873:59:0;24911:169:1;79873:59:0;79976:7;79947:18;79966:5;79947:25;;;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;79998:34:0;;;;;;;:21;:34;;;;;:45;;80036:7;;79998:34;:45;;80036:7;;79998:45;:::i;:::-;;;;-1:-1:-1;80058:24:0;;-1:-1:-1;80070:2:0;80074:7;80058:11;:24::i;:::-;79841:448;;;80144:16;80115:18;80134:5;80115:25;;;;;;;;;;:::i;:::-;;;;;;;;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;80175:34:0;;;;;;;:21;:34;;;;;:54;;80213:16;;80175:34;:54;;80213:16;;80175:54;:::i;:::-;;;;-1:-1:-1;80244:33:0;;-1:-1:-1;80256:2:0;80260:16;80244:11;:33::i;:::-;79580:716;;;79431:865;;;;:::o;28995:339::-;29190:41;805:10;29223:7;29190:18;:41::i;:::-;29182:103;;;;-1:-1:-1;;;29182:103:0;;;;;;;:::i;:::-;29298:28;29308:4;29314:2;29318:7;29298:9;:28::i;5055:894::-;5159:4;5204;5159;5221:605;5245:5;:12;5241:1;:16;5221:605;;;5279:20;5302:5;5308:1;5302:8;;;;;;;;:::i;:::-;;;;;;;5279:31;;5347:12;5331;:28;5327:488;;5506:44;;;;;;6508:19:1;;;6543:12;;;6536:28;;;6580:12;;5506:44:0;;;;;;;;;;;;5474:95;;;;;;5459:110;;5327:488;;;5736:44;;;;;;6508:19:1;;;6543:12;;;6536:28;;;6580:12;;5736:44:0;;;;;;;;;;;;5704:95;;;;;;5689:110;;5327:488;-1:-1:-1;5259:3:0;;;;:::i;:::-;;;;5221:605;;;-1:-1:-1;5937:4:0;;5921:20;;5055:894;-1:-1:-1;;;5055:894:0:o;86298:693::-;38879:7;;;;86355:9;86347:39;;;;-1:-1:-1;;;86347:39:0;;32089:2:1;86347:39:0;;;32071:21:1;32128:2;32108:18;;;32101:30;-1:-1:-1;;;32147:18:1;;;32140:47;32204:18;;86347:39:0;32061:167:1;86347:39:0;86397:19;86419:13;43542:10;:17;;43454:113;86419:13;86397:35;;53814:2;86467:6;:33;;;;86445:121;;;;-1:-1:-1;;;86445:121:0;;28382:2:1;86445:121:0;;;28364:21:1;28421:2;28401:18;;;28394:30;28460:34;28440:18;;;28433:62;-1:-1:-1;;;28511:18:1;;;28504:36;28557:19;;86445:121:0;28354:228:1;86445:121:0;86636:14;;86623:27;;53405:4;86623:27;:::i;:::-;86599:20;;;;:11;:20;:::i;:::-;:51;;86577:141;;;;-1:-1:-1;;;86577:141:0;;25287:2:1;86577:141:0;;;25269:21:1;25326:2;25306:18;;;25299:30;25365:34;25345:18;;;25338:62;-1:-1:-1;;;25416:18:1;;;25409:38;25464:19;;86577:141:0;25259:230:1;86577:141:0;86764:22;54029:17;86764:22;;;:14;:22::i;:::-;86751:9;:35;86729:119;;;;-1:-1:-1;;;86729:119:0;;32435:2:1;86729:119:0;;;32417:21:1;32474:2;32454:18;;;32447:30;32513:34;32493:18;;;32486:62;-1:-1:-1;;;32564:18:1;;;32557:32;32606:19;;86729:119:0;32407:224:1;86729:119:0;86866:9;86861:86;86885:6;86881:10;;:1;:10;86861:86;;;86913:22;86924:10;86913;:22::i;:::-;86893:3;;;;:::i;:::-;;;;86861:86;;;;86959:24;86976:6;86959:16;:24::i;58485:212::-;58617:25;;58583:3;;58554:18;;-1:-1:-1;;;;;58617:7:0;;;58632:5;;58554:18;58617:25;58554:18;58617:25;58632:5;58617:7;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58598:44;;;58661:7;58653:36;;;;-1:-1:-1;;;58653:36:0;;31326:2:1;58653:36:0;;;31308:21:1;31365:2;31345:18;;;31338:30;-1:-1:-1;;;31384:18:1;;;31377:46;31440:18;;58653:36:0;31298:166:1;39867:120:0;38879:7;;;;39403:41;;;;-1:-1:-1;;;39403:41:0;;12515:2:1;39403:41:0;;;12497:21:1;12554:2;12534:18;;;12527:30;-1:-1:-1;;;12573:18:1;;;12566:50;12633:18;;39403:41:0;12487:170:1;39403:41:0;39926:7:::1;:15:::0;;-1:-1:-1;;39926:15:0::1;::::0;;39957:22:::1;805:10:::0;39966:12:::1;39957:22;::::0;-1:-1:-1;;;;;8444:32:1;;;8426:51;;8414:2;8399:18;39957:22:0::1;;;;;;;39867:120::o:0;29405:185::-;29543:39;29560:4;29566:2;29570:7;29543:39;;;;;;;;;;;;:16;:39::i;3043:173::-;3118:6;;;-1:-1:-1;;;;;3135:17:0;;;3118:6;3135:17;;;-1:-1:-1;;;;;;3135:17:0;;;;;;3168:40;;3118:6;;;;;;;;3168:40;;3099:16;;3168:40;3088:128;3043:173;:::o;85790:143::-;85860:7;85855:71;85877:1;85873:5;;:1;:5;;;85855:71;;;85900:14;85911:2;85900:10;:14::i;:::-;85880:3;;;;:::i;:::-;;;;85855:71;;39608:118;38879:7;;;;39133:9;39125:38;;;;-1:-1:-1;;;39125:38:0;;21444:2:1;39125:38:0;;;21426:21:1;21483:2;21463:18;;;21456:30;-1:-1:-1;;;21502:18:1;;;21495:46;21558:18;;39125:38:0;21416:166:1;39125:38:0;39668:7:::1;:14:::0;;-1:-1:-1;;39668:14:0::1;39678:4;39668:14;::::0;;39698:20:::1;39705:12;805:10:::0;;725:98;31793:348;31886:4;31588:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31588:16:0;31903:73;;;;-1:-1:-1;;;31903:73:0;;20209:2:1;31903:73:0;;;20191:21:1;20248:2;20228:18;;;20221:30;20287:34;20267:18;;;20260:62;-1:-1:-1;;;20338:18:1;;;20331:42;20390:19;;31903:73:0;20181:234:1;31903:73:0;31987:13;32003:23;32018:7;32003:14;:23::i;:::-;31987:39;;32056:5;-1:-1:-1;;;;;32045:16:0;:7;-1:-1:-1;;;;;32045:16:0;;:51;;;;32089:7;-1:-1:-1;;;;;32065:31:0;:20;32077:7;32065:11;:20::i;:::-;-1:-1:-1;;;;;32065:31:0;;32045:51;:87;;;-1:-1:-1;;;;;;28885:25:0;;;28861:4;28885:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32100:32;32037:96;31793:348;-1:-1:-1;;;;31793:348:0:o;30871:315::-;31028:28;31038:4;31044:2;31048:7;31028:9;:28::i;:::-;31075:48;31098:4;31104:2;31108:7;31117:5;31075:22;:48::i;:::-;31067:111;;;;-1:-1:-1;;;31067:111:0;;;;;;;:::i;61076:100::-;61128:13;61161:7;61154:14;;;;;:::i;21536:723::-;21592:13;21813:10;21809:53;;-1:-1:-1;;21840:10:0;;;;;;;;;;;;-1:-1:-1;;;21840:10:0;;;;;21536:723::o;21809:53::-;21887:5;21872:12;21928:78;21935:9;;21928:78;;21961:8;;;;:::i;:::-;;-1:-1:-1;21984:10:0;;-1:-1:-1;21992:2:0;21984:10;;:::i;:::-;;;21928:78;;;22016:19;22048:6;22038:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22038:17:0;;22016:39;;22066:154;22073:10;;22066:154;;22100:11;22110:1;22100:11;;:::i;:::-;;-1:-1:-1;22169:10:0;22177:2;22169:5;:10;:::i;:::-;22156:24;;:2;:24;:::i;:::-;22143:39;;22126:6;22133;22126:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;22126:56:0;;;;;;;;-1:-1:-1;22197:11:0;22206:2;22197:11;;:::i;:::-;;;22066:154;;25601:305;25703:4;-1:-1:-1;;;;;;25740:40:0;;-1:-1:-1;;;25740:40:0;;:105;;-1:-1:-1;;;;;;;25797:48:0;;-1:-1:-1;;;25797:48:0;25740:105;:158;;;;25862:36;25886:11;25862:23;:36::i;34785:578::-;34944:4;-1:-1:-1;;;;;34917:31:0;:23;34932:7;34917:14;:23::i;:::-;-1:-1:-1;;;;;34917:31:0;;34909:85;;;;-1:-1:-1;;;34909:85:0;;26806:2:1;34909:85:0;;;26788:21:1;26845:2;26825:18;;;26818:30;26884:34;26864:18;;;26857:62;-1:-1:-1;;;26935:18:1;;;26928:39;26984:19;;34909:85:0;26778:231:1;34909:85:0;-1:-1:-1;;;;;35013:16:0;;35005:65;;;;-1:-1:-1;;;35005:65:0;;18390:2:1;35005:65:0;;;18372:21:1;18429:2;18409:18;;;18402:30;18468:34;18448:18;;;18441:62;-1:-1:-1;;;18519:18:1;;;18512:34;18563:19;;35005:65:0;18362:226:1;35005:65:0;35083:39;35104:4;35110:2;35114:7;35083:20;:39::i;:::-;35187:29;35204:1;35208:7;35187:8;:29::i;:::-;-1:-1:-1;;;;;35229:15:0;;;;;;:9;:15;;;;;:20;;35248:1;;35229:15;:20;;35248:1;;35229:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35260:13:0;;;;;;:9;:13;;;;;:18;;35277:1;;35260:13;:18;;35277:1;;35260:18;:::i;:::-;;;;-1:-1:-1;;35289:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35289:21:0;-1:-1:-1;;;;;35289:21:0;;;;;;;;;35328:27;;35289:16;;35328:27;;;;;;;34785:578;;;:::o;68400:98::-;68458:7;68485:5;68489:1;68485;:5;:::i;86042:145::-;86094:10;86107:13;:11;:13::i;:::-;86094:26;;86131:20;86148:2;86131:16;:20::i;:::-;86162:17;86172:2;86176;86162:9;:17::i;87138:1244::-;87198:13;87250:24;87360:33;;87214:9;;87250:24;87360:33;;;;;87304:39;;87337:6;;87360:33;87304:30;;;:39;:::i;:::-;:89;;;87286:539;;87454:6;87420:30;;:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;87480:7;87475:318;87497:1;87493:5;;:1;:5;;;87475:318;;;87524:18;87601:10;;87554:19;87574:1;87554:22;;;;;;;;;;:::i;:::-;;;;;;;;;87546:5;:30;;;;:::i;:::-;87545:66;;;;:::i;:::-;87524:87;;87655:10;87630:18;87649:1;87630:21;;;;;;;;;;:::i;:::-;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;87693:5:0;;-1:-1:-1;87697:1:0;87693;:5;:::i;:::-;87688:10;;:1;:10;;;87684:94;;;87723:35;87747:10;87723:23;:35::i;:::-;-1:-1:-1;87500:3:0;;;;:::i;:::-;;;;87475:318;;87286:539;87837:30;:34;;-1:-1:-1;;87837:34:0;;;87870:1;87941:434;87963:17;:24;87959:28;;;;87941:434;;;88009:19;88066:10;;88040:19;88060:1;88040:22;;;;;;;;;;:::i;:::-;;;;;;;;;88032:5;:30;;;;:::i;:::-;88031:45;;;;:::i;:::-;88009:67;-1:-1:-1;88100:5:0;88104:1;88100;:5;:::i;:::-;88095:10;;:1;:10;;;88091:273;;;88126:36;88150:11;88126:23;:36::i;:::-;88091:273;;;88218:18;88237:1;88218:21;;;;;;;;;;:::i;:::-;;;;;;;;;88203:36;;;;;:::i;:::-;;;88282:1;88258:18;88277:1;88258:21;;;;;;;;;;:::i;:::-;;;;;;;;:25;;;;88302:46;88314:17;88332:1;88314:20;;;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;88314:20:0;88336:11;88302;:46::i;:::-;-1:-1:-1;87989:3:0;;;;:::i;:::-;;;;87941:434;;36220:803;36375:4;-1:-1:-1;;;;;36396:13:0;;14426:20;14474:8;36392:624;;36432:72;;-1:-1:-1;;;36432:72:0;;-1:-1:-1;;;;;36432:36:0;;;;;:72;;805:10;;36483:4;;36489:7;;36498:5;;36432:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36432:72:0;;;;;;;;-1:-1:-1;;36432:72:0;;;;;;;;;;;;:::i;:::-;;;36428:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36678:13:0;;36674:272;;36721:60;;-1:-1:-1;;;36721:60:0;;;;;;;:::i;36674:272::-;36896:6;36890:13;36881:6;36877:2;36873:15;36866:38;36428:533;-1:-1:-1;;;;;;36555:55:0;-1:-1:-1;;;36555:55:0;;-1:-1:-1;36548:62:0;;36392:624;-1:-1:-1;37000:4:0;36220:803;;;;;;:::o;49531:190::-;49616:4;-1:-1:-1;;;;;;;;;24208:40:0;;;49640:73;;;-1:-1:-1;;;;;;;;49680:33:0;;;;;:20;:33;;;;;;;;;49531:190::o;59662:231::-;59840:45;59867:4;59873:2;59877:7;59840:26;:45::i;63847:1008::-;63888:7;63908:17;63941:13;43542:10;:17;;43454:113;63941:13;63928:26;;53405:4;63928:26;:::i;:::-;64070:5;;64031:173;;;;;;7501:19:1;;;;-1:-1:-1;;;;;;64098:10:0;7558:2:1;7554:15;7550:53;7536:12;;;7529:75;64131:16:0;7620:12:1;;;7613:28;64170:15:0;7657:12:1;;;7650:28;63908:46:0;;-1:-1:-1;63965:13:0;;63908:46;;7694:13:1;;64031:173:0;;;;;;;;;;;;64003:216;;;;;;63981:249;;:261;;;;:::i;:::-;63965:277;;64253:13;64287:7;64295:5;64287:14;;;;;;;:::i;:::-;;;:19;64283:120;;64331:7;64339:5;64331:14;;;;;;;:::i;:::-;;;64323:22;;64283:120;;;-1:-1:-1;64386:5:0;64283:120;64466:7;64474:13;64486:1;64474:9;:13;:::i;:::-;64466:22;;;;;;;:::i;:::-;;;64462:283;;64591:13;64603:1;64591:9;:13;:::i;:::-;64574:7;64582:5;64574:14;;;;;;;:::i;:::-;;:30;64462:283;;;64711:7;64719:13;64731:1;64719:9;:13;:::i;:::-;64711:22;;;;;;;:::i;:::-;;;64694:7;64702:5;64694:14;;;;;;;:::i;:::-;;:39;64462:283;64755:5;:7;;;:5;:7;;;:::i;:::-;;;;-1:-1:-1;64838:9:0;;-1:-1:-1;64838:5:0;64846:1;64838:9;:::i;:::-;64831:16;;;;;63847:1008;:::o;85313:322::-;85402:18;;85375:16;:23;:45;85371:84;;;85313:322;:::o;85371:84::-;85465:14;85482:17;85496:2;85482:13;:17::i;:::-;85465:34;;85523:18;;85514:6;:27;85510:118;;;-1:-1:-1;85558:11:0;;;;:7;:11;;;;;:18;;-1:-1:-1;;85558:18:0;85572:4;85558:18;;;;;;85591:16;:25;;;;;;;;;;;;;85313:322::o;32483:110::-;32559:26;32569:2;32573:7;32559:26;;;;;;;;;;;;:9;:26::i;88539:533::-;88716:1;88704:10;;:13;;;;:::i;:::-;88671:16;;88658:29;;88671:16;;;;;88658:10;:29;:::i;:::-;88657:60;;;;:::i;:::-;88611:29;;;;:26;:29;;;:106;;:29;;;:106;;;;;:::i;:::-;;;;-1:-1:-1;;88819:10:0;;:13;;88831:1;;88819:13;:::i;:::-;88788:14;;88775:27;;88788:14;;;;;88775:10;:27;:::i;:::-;88774:58;;;;:::i;:::-;88755:1;88728:29;;;;:26;:29;;;:104;;:29;;;:104;;;;;:::i;:::-;;;;-1:-1:-1;;88936:10:0;;:13;;88948:1;;88936:13;:::i;:::-;88903:16;;88890:29;;88903:16;;;;;88890:10;:29;:::i;:::-;88889:60;;;;:::i;:::-;88870:1;88843:29;;;;:26;:29;;;:106;;:29;;;:106;;;;;:::i;:::-;;;;-1:-1:-1;;89051:10:0;;:13;;89063:1;;89051:13;:::i;:::-;89020:14;;89007:27;;-1:-1:-1;;;89020:14:0;;;;89007:10;:27;:::i;:::-;89006:58;;;;:::i;:::-;88987:1;88960:29;;;;:26;:29;;;:104;;:29;;;:104;;;;;:::i;:::-;;;;-1:-1:-1;;;88539:533:0:o;44490:589::-;44634:45;44661:4;44667:2;44671:7;44634:26;:45::i;:::-;-1:-1:-1;;;;;44696:18:0;;44692:187;;44731:40;44763:7;45906:10;:17;;45879:24;;;;:15;:24;;;;;:44;;;45934:24;;;;;;;;;;;;45802:164;44731:40;44692:187;;;44801:2;-1:-1:-1;;;;;44793:10:0;:4;-1:-1:-1;;;;;44793:10:0;;44789:90;;44820:47;44853:4;44859:7;44820:32;:47::i;:::-;-1:-1:-1;;;;;44893:16:0;;44889:183;;44926:45;44963:7;44926:36;:45::i;44889:183::-;44999:4;-1:-1:-1;;;;;44993:10:0;:2;-1:-1:-1;;;;;44993:10:0;;44989:83;;45020:40;45048:2;45052:7;45020:27;:40::i;63283:492::-;63487:20;;63530:5;;63423:241;;;;;;7987:19:1;;;8022:12;;;8015:28;;;;8059:12;;;;8052:28;;;;63558:10:0;8114:15:1;;-1:-1:-1;;;;;;8110:53:1;8096:12;;;8089:75;63591:16:0;8180:13:1;;;8173:29;63630:15:0;8218:13:1;;;8211:29;-1:-1:-1;;;;53405:4:0;;8256:13:1;;63423:241:0;;;;;;;;;;;;63395:284;;;;;;63373:317;;:330;;;;:::i;:::-;63714:20;:29;;;63356:347;63283:492;-1:-1:-1;;;63283:492:0:o;32820:321::-;32950:18;32956:2;32960:7;32950:5;:18::i;:::-;33001:54;33032:1;33036:2;33040:7;33049:5;33001:22;:54::i;:::-;32979:154;;;;-1:-1:-1;;;32979:154:0;;;;;;;:::i;40599:275::-;38879:7;;;;40809:9;40801:65;;;;-1:-1:-1;;;40801:65:0;;12103:2:1;40801:65:0;;;12085:21:1;12142:2;12122:18;;;12115:30;12181:34;12161:18;;;12154:62;-1:-1:-1;;;12232:18:1;;;12225:41;12283:19;;40801:65:0;12075:233:1;46593:988:0;46859:22;46909:1;46884:22;46901:4;46884:16;:22::i;:::-;:26;;;;:::i;:::-;46921:18;46942:26;;;:17;:26;;;;;;46859:51;;-1:-1:-1;47075:28:0;;;47071:328;;-1:-1:-1;;;;;47142:18:0;;47120:19;47142:18;;;:12;:18;;;;;;;;:34;;;;;;;;;47193:30;;;;;;:44;;;47310:30;;:17;:30;;;;;:43;;;47071:328;-1:-1:-1;47495:26:0;;;;:17;:26;;;;;;;;47488:33;;;-1:-1:-1;;;;;47539:18:0;;;;;:12;:18;;;;;:34;;;;;;;47532:41;46593:988::o;47876:1079::-;48154:10;:17;48129:22;;48154:21;;48174:1;;48154:21;:::i;:::-;48186:18;48207:24;;;:15;:24;;;;;;48580:10;:26;;48129:46;;-1:-1:-1;48207:24:0;;48129:46;;48580:26;;;;;;:::i;:::-;;;;;;;;;48558:48;;48644:11;48619:10;48630;48619:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;48724:28;;;:15;:28;;;;;;;:41;;;48896:24;;;;;48889:31;48931:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47947:1008;;;47876:1079;:::o;45380:221::-;45465:14;45482:20;45499:2;45482:16;:20::i;:::-;-1:-1:-1;;;;;45513:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45558:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45380:221:0:o;33477:382::-;-1:-1:-1;;;;;33557:16:0;;33549:61;;;;-1:-1:-1;;;33549:61:0;;24165:2:1;33549:61:0;;;24147:21:1;;;24184:18;;;24177:30;24243:34;24223:18;;;24216:62;24295:18;;33549:61:0;24137:182:1;33549:61:0;31564:4;31588:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31588:16:0;:30;33621:58;;;;-1:-1:-1;;;33621:58:0;;16091:2:1;33621:58:0;;;16073:21:1;16130:2;16110:18;;;16103:30;16169;16149:18;;;16142:58;16217:18;;33621:58:0;16063:178:1;33621:58:0;33692:45;33721:1;33725:2;33729:7;33692:20;:45::i;:::-;-1:-1:-1;;;;;33750:13:0;;;;;;:9;:13;;;;;:18;;33767:1;;33750:13;:18;;33767:1;;33750:18;:::i;:::-;;;;-1:-1:-1;;33779:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33779:21:0;-1:-1:-1;;;;;33779:21:0;;;;;;;;33818:33;;33779:16;;;33818:33;;33779:16;;33818:33;33477:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;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:2;;;309:1;306;299:12;268:2;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;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;522:2;474:124;;;:::o;603:723::-;657:5;710:3;703:4;695:6;691:17;687:27;677:2;;728:1;725;718:12;677:2;764:6;751:20;790:4;813:18;809:2;806:26;803:2;;;835:18;;:::i;:::-;881:2;878:1;874:10;904:28;928:2;924;920:11;904:28;:::i;:::-;966:15;;;997:12;;;;1029:15;;;1063;;;1059:24;;1056:33;-1:-1:-1;1053:2:1;;;1102:1;1099;1092:12;1053:2;1124:1;1115:10;;1134:163;1148:2;1145:1;1142:9;1134:163;;;1205:17;;1193:30;;1166:1;1159:9;;;;;1243:12;;;;1275;;1134:163;;;-1:-1:-1;1315:5:1;667:659;-1:-1:-1;;;;;;;667:659:1:o;1331:156::-;1397:20;;1457:4;1446:16;;1436:27;;1426:2;;1477:1;1474;1467:12;1492:186;1551:6;1604:2;1592:9;1583:7;1579:23;1575:32;1572:2;;;1620:1;1617;1610:12;1572:2;1643:29;1662:9;1643:29;:::i;1683:260::-;1751:6;1759;1812:2;1800:9;1791:7;1787:23;1783:32;1780:2;;;1828:1;1825;1818:12;1780:2;1851:29;1870:9;1851:29;:::i;:::-;1841:39;;1899:38;1933:2;1922:9;1918:18;1899:38;:::i;:::-;1889:48;;1770:173;;;;;:::o;1948:328::-;2025:6;2033;2041;2094:2;2082:9;2073:7;2069:23;2065:32;2062:2;;;2110:1;2107;2100:12;2062:2;2133:29;2152:9;2133:29;:::i;:::-;2123:39;;2181:38;2215:2;2204:9;2200:18;2181:38;:::i;:::-;2171:48;;2266:2;2255:9;2251:18;2238:32;2228:42;;2052:224;;;;;:::o;2281:666::-;2376:6;2384;2392;2400;2453:3;2441:9;2432:7;2428:23;2424:33;2421:2;;;2470:1;2467;2460:12;2421:2;2493:29;2512:9;2493:29;:::i;:::-;2483:39;;2541:38;2575:2;2564:9;2560:18;2541:38;:::i;:::-;2531:48;;2626:2;2615:9;2611:18;2598:32;2588:42;;2681:2;2670:9;2666:18;2653:32;2708:18;2700:6;2697:30;2694:2;;;2740:1;2737;2730:12;2694:2;2763:22;;2816:4;2808:13;;2804:27;-1:-1:-1;2794:2:1;;2845:1;2842;2835:12;2794:2;2868:73;2933:7;2928:2;2915:16;2910:2;2906;2902:11;2868:73;:::i;:::-;2858:83;;;2411:536;;;;;;;:::o;2952:347::-;3017:6;3025;3078:2;3066:9;3057:7;3053:23;3049:32;3046:2;;;3094:1;3091;3084:12;3046:2;3117:29;3136:9;3117:29;:::i;:::-;3107:39;;3196:2;3185:9;3181:18;3168:32;3243:5;3236:13;3229:21;3222:5;3219:32;3209:2;;3265:1;3262;3255:12;3209:2;3288:5;3278:15;;;3036:263;;;;;:::o;3304:254::-;3372:6;3380;3433:2;3421:9;3412:7;3408:23;3404:32;3401:2;;;3449:1;3446;3439:12;3401:2;3472:29;3491:9;3472:29;:::i;:::-;3462:39;3548:2;3533:18;;;;3520:32;;-1:-1:-1;;;3391:167:1:o;3563:348::-;3647:6;3700:2;3688:9;3679:7;3675:23;3671:32;3668:2;;;3716:1;3713;3706:12;3668:2;3756:9;3743:23;3789:18;3781:6;3778:30;3775:2;;;3821:1;3818;3811:12;3775:2;3844:61;3897:7;3888:6;3877:9;3873:22;3844:61;:::i;3916:180::-;3975:6;4028:2;4016:9;4007:7;4003:23;3999:32;3996:2;;;4044:1;4041;4034:12;3996:2;-1:-1:-1;4067:23:1;;3986:110;-1:-1:-1;3986:110:1:o;4101:245::-;4159:6;4212:2;4200:9;4191:7;4187:23;4183:32;4180:2;;;4228:1;4225;4218:12;4180:2;4267:9;4254:23;4286:30;4310:5;4286:30;:::i;4351:249::-;4420:6;4473:2;4461:9;4452:7;4448:23;4444:32;4441:2;;;4489:1;4486;4479:12;4441:2;4521:9;4515:16;4540:30;4564:5;4540:30;:::i;4605:450::-;4674:6;4727:2;4715:9;4706:7;4702:23;4698:32;4695:2;;;4743:1;4740;4733:12;4695:2;4783:9;4770:23;4816:18;4808:6;4805:30;4802:2;;;4848:1;4845;4838:12;4802:2;4871:22;;4924:4;4916:13;;4912:27;-1:-1:-1;4902:2:1;;4953:1;4950;4943:12;4902:2;4976:73;5041:7;5036:2;5023:16;5018:2;5014;5010:11;4976:73;:::i;5245:182::-;5302:6;5355:2;5343:9;5334:7;5330:23;5326:32;5323:2;;;5371:1;5368;5361:12;5323:2;5394:27;5411:9;5394:27;:::i;5432:418::-;5523:6;5531;5584:2;5572:9;5563:7;5559:23;5555:32;5552:2;;;5600:1;5597;5590:12;5552:2;5623:27;5640:9;5623:27;:::i;:::-;5613:37;;5701:2;5690:9;5686:18;5673:32;5728:18;5720:6;5717:30;5714:2;;;5760:1;5757;5750:12;5714:2;5783:61;5836:7;5827:6;5816:9;5812:22;5783:61;:::i;:::-;5773:71;;;5542:308;;;;;:::o;5855:257::-;5896:3;5934:5;5928:12;5961:6;5956:3;5949:19;5977:63;6033:6;6026:4;6021:3;6017:14;6010:4;6003:5;5999:16;5977:63;:::i;:::-;6094:2;6073:15;-1:-1:-1;;6069:29:1;6060:39;;;;6101:4;6056:50;;5904:208;-1:-1:-1;;5904:208:1:o;6603:470::-;6782:3;6820:6;6814:13;6836:53;6882:6;6877:3;6870:4;6862:6;6858:17;6836:53;:::i;:::-;6952:13;;6911:16;;;;6974:57;6952:13;6911:16;7008:4;6996:17;;6974:57;:::i;:::-;7047:20;;6790:283;-1:-1:-1;;;;6790:283:1:o;8488:488::-;-1:-1:-1;;;;;8757:15:1;;;8739:34;;8809:15;;8804:2;8789:18;;8782:43;8856:2;8841:18;;8834:34;;;8904:3;8899:2;8884:18;;8877:31;;;8682:4;;8925:45;;8950:19;;8942:6;8925:45;:::i;:::-;8917:53;8691:285;-1:-1:-1;;;;;;8691:285:1:o;8981:632::-;9152:2;9204:21;;;9274:13;;9177:18;;;9296:22;;;9123:4;;9152:2;9375:15;;;;9349:2;9334:18;;;9123:4;9418:169;9432:6;9429:1;9426:13;9418:169;;;9493:13;;9481:26;;9562:15;;;;9527:12;;;;9454:1;9447:9;9418:169;;;-1:-1:-1;9604:3:1;;9132:481;-1:-1:-1;;;;;;9132:481:1:o;9992:219::-;10141:2;10130:9;10123:21;10104:4;10161:44;10201:2;10190:9;10186:18;10178:6;10161:44;:::i;10216:1327::-;10410:2;10399:9;10392:21;10373:4;10433:1;10466:6;10460:13;10496:3;10518:1;10546:9;10542:2;10538:18;10528:28;;10606:2;10595:9;10591:18;10628;10618:2;;10672:4;10664:6;10660:17;10650:27;;10618:2;10698;10746;10738:6;10735:14;10715:18;10712:38;10709:2;;;-1:-1:-1;;;10773:33:1;;10829:4;10826:1;10819:15;10859:4;10780:3;10847:17;10709:2;10956;10941:18;;37439:19;;;37482:14;;;10984:18;11011:100;;;;11125:1;11120:315;;;;10977:458;;11011:100;-1:-1:-1;;11044:24:1;;11032:37;;11089:12;;;;-1:-1:-1;11011:100:1;;11120:315;37288:1;37281:14;;;37325:4;37312:18;;11215:1;11229:165;11243:6;11240:1;11237:13;11229:165;;;11321:14;;11308:11;;;11301:35;11364:16;;;;11258:10;;11229:165;;;11414:11;;;-1:-1:-1;;10977:458:1;;;11480:9;11475:3;11471:19;11466:2;11455:9;11451:18;11444:47;;;;;;11508:29;11533:3;11525:6;11508:29;:::i;:::-;11500:37;10382:1161;-1:-1:-1;;;;;10382:1161:1:o;14251:414::-;14453:2;14435:21;;;14492:2;14472:18;;;14465:30;14531:34;14526:2;14511:18;;14504:62;-1:-1:-1;;;14597:2:1;14582:18;;14575:48;14655:3;14640:19;;14425:240::o;19652:350::-;19854:2;19836:21;;;19893:2;19873:18;;;19866:30;19932:28;19927:2;19912:18;;19905:56;19993:2;19978:18;;19826:176::o;20835:402::-;21037:2;21019:21;;;21076:2;21056:18;;;21049:30;21115:34;21110:2;21095:18;;21088:62;-1:-1:-1;;;21181:2:1;21166:18;;21159:36;21227:3;21212:19;;21009:228::o;25898:356::-;26100:2;26082:21;;;26119:18;;;26112:30;26178:34;26173:2;26158:18;;26151:62;26245:2;26230:18;;26072:182::o;27772:403::-;27974:2;27956:21;;;28013:2;27993:18;;;27986:30;28052:34;28047:2;28032:18;;28025:62;-1:-1:-1;;;28118:2:1;28103:18;;28096:37;28165:3;28150:19;;27946:229::o;30771:348::-;30973:2;30955:21;;;31012:2;30992:18;;;30985:30;31051:26;31046:2;31031:18;;31024:54;31110:2;31095:18;;30945:174::o;31469:413::-;31671:2;31653:21;;;31710:2;31690:18;;;31683:30;31749:34;31744:2;31729:18;;31722:62;-1:-1:-1;;;31815:2:1;31800:18;;31793:47;31872:3;31857:19;;31643:239::o;35424:355::-;35626:2;35608:21;;;35665:2;35645:18;;;35638:30;35704:33;35699:2;35684:18;;35677:61;35770:2;35755:18;;35598:181::o;36935:275::-;37006:2;37000:9;37071:2;37052:13;;-1:-1:-1;;37048:27:1;37036:40;;37106:18;37091:34;;37127:22;;;37088:62;37085:2;;;37153:18;;:::i;:::-;37189:2;37182:22;36980:230;;-1:-1:-1;36980:230:1:o;37507:128::-;37547:3;37578:1;37574:6;37571:1;37568:13;37565:2;;;37584:18;;:::i;:::-;-1:-1:-1;37620:9:1;;37555:80::o;37640:204::-;37678:3;37714:4;37711:1;37707:12;37746:4;37743:1;37739:12;37781:3;37775:4;37771:14;37766:3;37763:23;37760:2;;;37789:18;;:::i;:::-;37825:13;;37686:158;-1:-1:-1;;;37686:158:1:o;37849:120::-;37889:1;37915;37905:2;;37920:18;;:::i;:::-;-1:-1:-1;37954:9:1;;37895:74::o;37974:422::-;38063:1;38106:5;38063:1;38120:270;38141:7;38131:8;38128:21;38120:270;;;38200:4;38196:1;38192:6;38188:17;38182:4;38179:27;38176:2;;;38209:18;;:::i;:::-;38259:7;38249:8;38245:22;38242:2;;;38279:16;;;;38242:2;38358:22;;;;38318:15;;;;38120:270;;;38124:3;38038:358;;;;;:::o;38401:140::-;38459:5;38488:47;38529:4;38519:8;38515:19;38509:4;38595:5;38625:8;38615:2;;-1:-1:-1;38666:1:1;38680:5;;38615:2;38714:4;38704:2;;-1:-1:-1;38751:1:1;38765:5;;38704:2;38796:4;38814:1;38809:59;;;;38882:1;38877:130;;;;38789:218;;38809:59;38839:1;38830:10;;38853:5;;;38877:130;38914:3;38904:8;38901:17;38898:2;;;38921:18;;:::i;:::-;-1:-1:-1;;38977:1:1;38963:16;;38992:5;;38789:218;;39091:2;39081:8;39078:16;39072:3;39066:4;39063:13;39059:36;39053:2;39043:8;39040:16;39035:2;39029:4;39026:12;39022:35;39019:77;39016:2;;;-1:-1:-1;39128:19:1;;;39160:5;;39016:2;39207:34;39232:8;39226:4;39207:34;:::i;:::-;39277:6;39273:1;39269:6;39265:19;39256:7;39253:32;39250:2;;;39288:18;;:::i;:::-;39326:20;;38605:747;-1:-1:-1;;;38605:747:1:o;39357:168::-;39397:7;39463:1;39459;39455:6;39451:14;39448:1;39445:21;39440:1;39433:9;39426:17;39422:45;39419:2;;;39470:18;;:::i;:::-;-1:-1:-1;39510:9:1;;39409:116::o;39530:125::-;39570:4;39598:1;39595;39592:8;39589:2;;;39603:18;;:::i;:::-;-1:-1:-1;39640:9:1;;39579:76::o;39660:195::-;39698:4;39735;39732:1;39728:12;39767:4;39764:1;39760:12;39792:3;39787;39784:12;39781:2;;;39799:18;;:::i;:::-;39836:13;;;39707:148;-1:-1:-1;;;39707:148:1:o;39860:258::-;39932:1;39942:113;39956:6;39953:1;39950:13;39942:113;;;40032:11;;;40026:18;40013:11;;;40006:39;39978:2;39971:10;39942:113;;;40073:6;40070:1;40067:13;40064:2;;;-1:-1:-1;;40108:1:1;40090:16;;40083:27;39913:205::o;40123:380::-;40202:1;40198:12;;;;40245;;;40266:2;;40320:4;40312:6;40308:17;40298:27;;40266:2;40373;40365:6;40362:14;40342:18;40339:38;40336:2;;;40419:10;40414:3;40410:20;40407:1;40400:31;40454:4;40451:1;40444:15;40482:4;40479:1;40472:15;40508:135;40547:3;-1:-1:-1;;40568:17:1;;40565:2;;;40588:18;;:::i;:::-;-1:-1:-1;40635:1:1;40624:13;;40555:88::o;40648:175::-;40685:3;40729:4;40722:5;40718:16;40758:4;40749:7;40746:17;40743:2;;;40766:18;;:::i;:::-;40815:1;40802:15;;40693:130;-1:-1:-1;;40693:130:1:o;40828:112::-;40860:1;40886;40876:2;;40891:18;;:::i;:::-;-1:-1:-1;40925:9:1;;40866:74::o;40945:127::-;41006:10;41001:3;40997:20;40994:1;40987:31;41037:4;41034:1;41027:15;41061:4;41058:1;41051:15;41077:127;41138:10;41133:3;41129:20;41126:1;41119:31;41169:4;41166:1;41159:15;41193:4;41190:1;41183:15;41209:127;41270:10;41265:3;41261:20;41258:1;41251:31;41301:4;41298:1;41291:15;41325:4;41322:1;41315:15;41341:127;41402:10;41397:3;41393:20;41390:1;41383:31;41433:4;41430:1;41423:15;41457:4;41454:1;41447:15;41473:127;41534:10;41529:3;41525:20;41522:1;41515:31;41565:4;41562:1;41555:15;41589:4;41586:1;41579:15;41605:131;-1:-1:-1;;;;;;41679:32:1;;41669:43;;41659:2;;41726:1;41723;41716:12

Swarm Source

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