ETH Price: $3,565.96 (-1.27%)

Token

Mystic Wizards (MYSTIC)
 

Overview

Max Total Supply

0 MYSTIC

Holders

316

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
nxklas.eth
Balance
1 MYSTIC
0xcba202f6c6684c497c3fb7740a6f6ba14041cde8
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Freaky mages from strange lands. Minting on Hashku! https://app.hashku.com/team/mystic-wizards/main/mint

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MysticWizards

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 13 of 16: MysticWizards.sol
// SPDX-License-Identifier: MIT

/*
*
* Mystic Wizards Contract
* 
* Contract by Matt Casanova [Twitter: @DevGuyThings]
* 
* Launched on Hashku
*
*/

pragma solidity 0.8.10;

import "./Hashku.sol";

// MYSTIC WIZARDS WITHDRAWAL ADDRESS: 0x82d2d60103A9455Efe466831e38d1418927b1358

contract MysticWizards is Hashku {

    uint public presalePrice = 50000000000000000;
    mapping(uint256 => uint256) public tokenAffinities;

    constructor() Hashku(
        "Mystic Wizards", 
        "MYSTIC", 
        "https://storage.hashku.com/api/mystic-wizards/main/", 
        "MYSTIC", 
        7777, 
        10, 
        20, 
        60000000000000000, 
        5, 
        0x82d2d60103A9455Efe466831e38d1418927b1358
    )  {
    }

    // convenience function used by Hashku to check max for UI
    function maxMintPerTransaction() public view override returns (uint256) {
        if (isPublic) {
            return maxMintPerTransactionNumber;
        }

        return 0;
    }

    // convenience function used by Hashku to check max for UI; 0 is unlimited
    function maxMintPerAddress() public view override returns (uint256) {
        if (isPublic) {
            return 0;
        }

        return maxMintPerAddressNumber;
    }

    // convenience function used by Hashku to check max for UI
    function price() public view override returns (uint256) {
        if (isPublic) {
            return priceNumber;
        }

        return presalePrice;
    }

    // public minting: max tokens per transaction only
    function shop(uint256 _amount) external override payable {
        require(_amount <= maxMintPerTransactionNumber, "max_mintable");
        require(nextToken() + _amount <= maxTokens, "not_enough_tokens");
        require(!isClosed, "is_closed");
        require(isPublic, "not_public");
        require(priceNumber * _amount == msg.value, "incorrect_funds");

        for (uint256 i = 0; i < _amount; i++) {
            mint(_msgSender());
        }
    }

    // pre-sale minting: max tokens per address, signature required
    function shop(uint256 _amount, bytes memory _signature) external override payable {
        require(tokensMinted[_msgSender()] + _amount <= maxMintPerAddressNumber, "max_minted");
        require(nextToken() + _amount <= maxTokens, "not_enough_tokens");
        require(!isPublic, "is_public");
        require(!isClosed, "is_closed");
        require(verifySignature(_signature), "invalid_signature");
        require(presalePrice * _amount == msg.value, "incorrect_funds");

        tokensMinted[_msgSender()] += _amount;
        for (uint256 i = 0; i < _amount; i++) {
            mint(_msgSender());
        }
    }

    function setPresalePrice(uint256 _price) external onlyOwner {
        presalePrice = _price;
    }

    function setTokenAffinities(uint256[] calldata _tokenIds, uint256[] calldata _affinityIds) external onlyOwner {
        require(_tokenIds.length == _affinityIds.length, "amount_mismatch");
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            tokenAffinities[_tokenIds[i]] = _affinityIds[i];
        }
    }
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 16: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 16: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 4 of 16: ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "./Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 5 of 16: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 6 of 16: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

File 7 of 16: Hashku.sol
// SPDX-License-Identifier: MIT

/*
*
* Hashku Contract
* 
* Contract by Matt Casanova [Twitter: @DevGuyThings]
* 
* To be used as base contract for ERC721 when minting on Hashku
*
*/

pragma solidity 0.8.10;

import "./ERC721.sol";
import "./IERC2981.sol";
import "./Ownable.sol";
import "./Address.sol";
import "./Strings.sol";
import "./Context.sol";
import "./Counters.sol";
import "./ECDSA.sol";
import "./SafeMath.sol";

contract Hashku is Context, Ownable, ERC721, IERC2981 {
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;
    using ECDSA for bytes32;

    Counters.Counter private tokenIdTracker;

    string public baseTokenURI;
    string public key = "SHOP";
    string public group = "init";
    uint256 internal maxMintPerAddressNumber;
    uint256 internal maxMintPerTransactionNumber;
    uint256 public maxTokens;
    uint256 internal priceNumber;
    bool public isPublic;
    bool public isClosed;
    mapping(address => uint256) public tokensMinted;
    address public withdrawalAddress;
    address public verifySigner;
    uint256 public royaltyPercent;
    address public proxyRegistryAddress;

    event ContractUpdated(string _type);

    modifier onlyWithdrawer() {
        require(withdrawalAddress != address(0), "no_withdrawals");
        require(withdrawalAddress == _msgSender(), "not_allowed");
        _;
    }

    constructor(
        string memory _name, 
        string memory _symbol, 
        string memory _baseTokenURI,
        string memory _key,
        uint256 _maxTokens, 
        uint256 _maxMintPerAddress,
        uint256 _maxMintPerTransaction,
        uint256 _price,
        uint256 _royaltyPercent,
        address _withdrawalAddress
    ) ERC721(_name, _symbol) {
        baseTokenURI = _baseTokenURI;
        key = _key;
        maxTokens = _maxTokens;
        maxMintPerAddressNumber = _maxMintPerAddress;
        maxMintPerTransactionNumber = _maxMintPerTransaction;
        priceNumber = _price;
        royaltyPercent = _royaltyPercent;
        withdrawalAddress = _withdrawalAddress;
        verifySigner = _msgSender();
    }

    // support IERC2981
    function supportsInterface(bytes4 _interfaceId) public view virtual override (ERC721, IERC165) returns (bool) {
        return _interfaceId == type(IERC2981).interfaceId || super.supportsInterface(_interfaceId);
    }

    // return the token URI for a specific token
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "no_token");

        return bytes(baseTokenURI).length > 0 ? string(abi.encodePacked(baseTokenURI, _tokenId.toString())) : "";
    }

    // internal mint function, incrementing token
    function mint(address _to) internal {
        _safeMint(_to, tokenIdTracker.current());
        tokenIdTracker.increment();
    }

    // owner sends NFTs to addresses
    function send(address[] calldata _addresses, uint256[] calldata _amounts) external onlyOwner {
        require(_addresses.length == _amounts.length, "amount_mismatch");

        uint256 total;
        for (uint256 t = 0; t < _amounts.length; t++) {
            total += _amounts[t];
        }

        require(nextToken() + total <= maxTokens, "not_enough_tokens");

        delete total;

        for (uint256 i = 0; i < _addresses.length; i++) {
            for (uint256 a = 0; a < _amounts[i]; a++) {
                mint(_addresses[i]);
            }
        }
    }

    // buy NFTs - version without signature required for public mint
    function shop(uint256 _amount) external virtual payable {
        require(nextToken() + _amount <= maxTokens, "not_enough_tokens");
        if (maxMintPerAddressNumber > 0) {
            require(tokensMinted[_msgSender()] + _amount <= maxMintPerAddressNumber, "max_minted");
        }
        if (maxMintPerTransactionNumber > 0) {
            require(_amount <= maxMintPerTransactionNumber, "max_mintable");
        }
        require(!isClosed, "is_closed");
        require(isPublic, "not_public");
        require(priceNumber * _amount == msg.value, "incorrect_funds");
        for (uint256 i = 0; i < _amount; i++) {
            mint(_msgSender());
        }
    }

    // buy NFTs
    function shop(uint256 _amount, bytes memory _signature) external virtual payable {
        require(nextToken() + _amount <= maxTokens, "not_enough_tokens");
        if (maxMintPerAddressNumber > 0) {
            require(tokensMinted[_msgSender()] + _amount <= maxMintPerAddressNumber, "max_minted");
        }
        if (maxMintPerTransactionNumber > 0) {
            require(_amount <= maxMintPerTransactionNumber, "max_mintable");
        }
        require(!isClosed, "is_closed");
        require(verifySignature(_signature), "invalid_signature");
        require(priceNumber * _amount == msg.value, "incorrect_funds");

        for (uint256 i = 0; i < _amount; i++) {
            mint(_msgSender());
        }
    }

    // return the id for the next token that will be minted
    function nextToken() public view returns (uint256) {
        return tokenIdTracker.current();
    }

    // convenience method for front end to call contract and check if a user can mint
    function canMint(uint256 _amount) public view virtual returns (bool) {
        if (maxTokens > 0) {
            if (nextToken() + _amount > maxTokens) {
                return false;
            }
        }

        if (maxMintPerTransactionNumber > 0) {
            if (_amount > maxMintPerTransactionNumber) {
                return false;
            }
        }

        if (maxMintPerAddressNumber > 0) {
            if (tokensMinted[_msgSender()] + _amount > maxMintPerAddressNumber) {
                return false;
            }
        }

        return true;
    }

    // convenience function used by dapp to check max for interface
    function price() public view virtual returns (uint256) {
        return priceNumber;
    }

    // convenience function used by dapp to check max for interface
    function maxMintPerAddress() public view virtual returns (uint256) {
        return maxMintPerAddressNumber;
    }

    // convenience function used by dapp to check max for interface
    function maxMintPerTransaction() public view virtual returns (uint256) {
        return maxMintPerTransactionNumber;
    }

    // check if a msg sender is eligible to shop - public version without signature required
    function eligible() public view virtual returns (bool) {
        if (isClosed) {
            return false;
        }

        return isPublic;
    }

    // check if a msg sender is eligible to shop
    function eligible(bytes memory _signature) public view virtual returns (bool) {
        if (isClosed) {
            return false;
        }

        if (isPublic) {
            return true;
        }

        return verifySignature(_signature);
    }

    // owner can ONLY decrease the total number of available tokens
    function decreaseMaxTokens(uint256 _amount) external virtual onlyOwner {
        require(_amount < maxTokens, "only_decrease");
        maxTokens = _amount;
        emit ContractUpdated("maxTokens");
    }

    // owner set the contract to public mode
    function setIsPublic(bool _public) external virtual onlyOwner {
        isPublic = _public;
        emit ContractUpdated("isPublic");
    }

    // owner set the contract to closed
    function setIsClosed(bool _closed) external virtual onlyOwner {
        isClosed = _closed;
        emit ContractUpdated("isClosed");
    }

    // owner set the price of minting
    function setPrice(uint256 _price) external virtual onlyOwner {
        priceNumber = _price;
        emit ContractUpdated("price");
    }

    // set the maximum amount an address may mint
    function setMaxMintPerAddress(uint256 _amount) external virtual onlyOwner {
        maxMintPerAddressNumber = _amount;
        emit ContractUpdated("maxMintPerAddress");
    }

    // set the maximum amount an address may mint
    function setMaxMintPerTransaction(uint256 _amount) external virtual onlyOwner {
        maxMintPerTransactionNumber = _amount;
        emit ContractUpdated("maxMintPerTransaction");
    }

    // owner set the contract key for signature verification
    function setKey(string calldata _key) external virtual onlyOwner {
        key = _key;
        emit ContractUpdated("key");
    }

    // set the current contract group for signature verification
    function setGroup(string memory _group) external virtual onlyOwner {
        group = _group;
        emit ContractUpdated("group");
    }

    // owner set a new base token URI
    function setBaseUri(string calldata _baseTokenURI) external virtual onlyOwner {
        baseTokenURI = _baseTokenURI;
        emit ContractUpdated("baseURI");
    }

    // owner set a new address for signature verification
    function setVerifySigner(address _verifySigner) external virtual onlyOwner {
        verifySigner = _verifySigner;
        emit ContractUpdated("verifySigner");
    }

    // verify signature based on contract key, contract group, token amount, and the msg sender
    function verifySignature(
        bytes memory _signature
    ) internal view virtual returns (bool) {
        bytes32 _messageHash = keccak256(abi.encodePacked(key, group, _msgSender()));

        return _messageHash.toEthSignedMessageHash().recover(_signature) == verifySigner;
    }

    // set the royalty percent
    function setRoyaltyPercent(uint256 _amount) external virtual onlyOwner {
        royaltyPercent = _amount;
        emit ContractUpdated("royaltyPercent");
    }

    // EIP-2981 royaltyInfo
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address receiver, uint256 royaltyAmount) {
        require(_exists(_tokenId), "no_token");

        return (address(this), SafeMath.div(SafeMath.mul(_salePrice, royaltyPercent), 100));
    }

    // withdrawal address convenience method for pulling balance of contract
    function seeBalance() external view virtual onlyWithdrawer returns (uint256) {
        return address(this).balance;
    }

    // withdrawal address send an amount to an address
    function withdraw(address payable _to, uint256 _amount) external virtual onlyWithdrawer returns (bool) {
        require(_amount <= address(this).balance, "insufficient_funds");
        _to.transfer(_amount);
        return true;
    }

    // withdrawal address set a new withdrawal address
    function setWithdrawalAddress(address _address) external virtual onlyWithdrawer {
        withdrawalAddress = _address;
        emit ContractUpdated("withdrawalAddress");
    }

    // owner can set the proxy registry access after deploy
    function setProxyRegistryAddress(address _proxy) external virtual onlyOwner {
        // OpenSea Rinkeby Address = "0xf57b2c51ded3a29e6891aba85459d600256cf317";
        // OpenSea Mainnet Address = "0xa5409ec958c83c3f309868babaca7c86dcb077c1";
        proxyRegistryAddress = _proxy;
        emit ContractUpdated("proxyRegistryAddress");
    }

    // override isApprovedForAll to allow proxy address for OpenSea gasless listing
    function isApprovedForAll(address _owner, address _operator) public view virtual override returns (bool) {
        if (proxyRegistryAddress != address(0)) {
            ProxyRegistry _proxyRegistry = ProxyRegistry(proxyRegistryAddress);
            if (address(_proxyRegistry.proxies(_owner)) == _operator) {
                return true;
            }
        }

        return super.isApprovedForAll(_owner, _operator);
    }
}

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

File 8 of 16: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 9 of 16: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 10 of 16: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 11 of 16: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 12 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 14 of 16: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 15 of 16: SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

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 generally not needed starting with Solidity 0.8, since 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 16 of 16: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_type","type":"string"}],"name":"ContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"decreaseMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"eligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"group","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"key","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","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":"nextToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercent","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_group","type":"string"}],"name":"setGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_closed","type":"bool"}],"name":"setIsClosed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_public","type":"bool"}],"name":"setIsPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_key","type":"string"}],"name":"setKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxy","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setRoyaltyPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_affinityIds","type":"uint256[]"}],"name":"setTokenAffinities","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_verifySigner","type":"address"}],"name":"setVerifySigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"shop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"shop","outputs":[],"stateMutability":"payable","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":"","type":"uint256"}],"name":"tokenAffinities","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":"","type":"address"}],"name":"tokensMinted","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":"verifySigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c06040526004608081905263053484f560e41b60a090815262000027916009919062000236565b50604080518082019091526004808252631a5b9a5d60e21b60209092019182526200005591600a9162000236565b5066b1a2bc2ec500006015553480156200006e57600080fd5b506040518060400160405280600e81526020016d4d79737469632057697a6172647360901b815250604051806040016040528060068152602001654d595354494360d01b81525060405180606001604052806033815260200162004b70603391396040805180820190915260068152654d595354494360d01b6020820152611e61600a601466d529ae9e86000060057382d2d60103a9455efe466831e38d1418927b135889896200011f33620001e6565b81516200013490600190602085019062000236565b5080516200014a90600290602084019062000236565b5050885162000162915060089060208b019062000236565b508651620001789060099060208a019062000236565b50600d869055600b859055600c849055600e8390556013829055601180546001600160a01b0319166001600160a01b038316179055620001b53390565b601280546001600160a01b0319166001600160a01b0392909216919091179055506200031998505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200024490620002dc565b90600052602060002090601f016020900481019282620002685760008555620002b3565b82601f106200028357805160ff1916838001178555620002b3565b82800160010185558215620002b3579182015b82811115620002b357825182559160200191906001019062000296565b50620002c1929150620002c5565b5090565b5b80821115620002c15760008155600101620002c6565b600181811c90821680620002f157607f821691505b602082108114156200031357634e487b7160e01b600052602260045260246000fd5b50919050565b61484780620003296000396000f3fe6080604052600436106103755760003560e01c80639499ac54116101d1578063cd7c032611610102578063e0d11a47116100a0578063f2bcd0221161006f578063f2bcd02214610a19578063f2fde38b14610a46578063f3fef3a314610a66578063fdab3b3f14610a8657600080fd5b8063e0d11a4714610996578063e8315742146109b6578063e8c61831146109cc578063e985e9c5146109f957600080fd5b8063d832d92f116100dc578063d832d92f14610941578063d870155414610956578063da69c08314610969578063dc9a15351461097c57600080fd5b8063cd7c0326146108df578063d26ea6c01461090c578063d547cfb71461092c57600080fd5b8063a645ff5f1161016f578063c2b6b58c11610149578063c2b6b58c14610860578063c612879f1461087f578063c87b56dd1461089f578063c97b9730146108bf57600080fd5b8063a645ff5f14610800578063af42d10614610820578063b88d4fde1461084057600080fd5b80639f67756d116101ab5780639f67756d14610795578063a035b1fe146107ab578063a0bcfc7f146107c0578063a22cb465146107e057600080fd5b80639499ac541461074b57806395d89b41146107605780639a4fc6401461077557600080fd5b80633549345e116102ab5780635dd871a311610249578063715018a611610223578063715018a6146106cb5780638da5cb5b146106e05780638edb25a01461070b57806391b7f5ed1461072b57600080fd5b80635dd871a31461066b5780636352211e1461068b57806370a08231146106ab57600080fd5b8063429a1bb011610285578063429a1bb0146105f457806349668b4a146106095780635461048114610629578063572849c41461065657600080fd5b80633549345e1461059f5780633943380c146105bf57806342842e0e146105d457600080fd5b80631e14d44b1161031857806327a9574e116102f257806327a9574e146104fe57806329e7ef2d1461051e5780632a55205a146105335780632e6cebe51461057f57600080fd5b80631e14d44b1461049e57806321b8092e146104be57806323b872dd146104de57600080fd5b806304f928c21161035457806304f928c2146103e857806306fdde0314610415578063081812fc14610437578063095ea7b31461047c57600080fd5b80620e7fa81461037a57806301f56997146103a357806301ffc9a7146103b8575b600080fd5b34801561038657600080fd5b5061039060155481565b6040519081526020015b60405180910390f35b3480156103af57600080fd5b50610390610aa6565b3480156103c457600080fd5b506103d86103d3366004613f0f565b610ac1565b604051901515815260200161039a565b3480156103f457600080fd5b50610390610403366004613f2c565b60166020526000908152604090205481565b34801561042157600080fd5b5061042a610b1d565b60405161039a9190613fbb565b34801561044357600080fd5b50610457610452366004613f2c565b610baf565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039a565b34801561048857600080fd5b5061049c610497366004613ff0565b610c74565b005b3480156104aa57600080fd5b5061049c6104b9366004613f2c565b610dcd565b3480156104ca57600080fd5b5061049c6104d936600461401c565b610ea4565b3480156104ea57600080fd5b5061049c6104f9366004614039565b61100e565b34801561050a57600080fd5b5061049c6105193660046140bf565b611095565b34801561052a57600080fd5b5061042a6111b8565b34801561053f57600080fd5b5061055361054e36600461412b565b611246565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161039a565b34801561058b57600080fd5b5061049c61059a366004613f2c565b6112dc565b3480156105ab57600080fd5b5061049c6105ba366004613f2c565b6113a8565b3480156105cb57600080fd5b5061042a611414565b3480156105e057600080fd5b5061049c6105ef366004614039565b611421565b34801561060057600080fd5b5061039061143c565b34801561061557600080fd5b5061049c610624366004614162565b611510565b34801561063557600080fd5b5061039061064436600461401c565b60106020526000908152604090205481565b34801561066257600080fd5b50610390611609565b34801561067757600080fd5b506103d8610686366004613f2c565b611624565b34801561069757600080fd5b506104576106a6366004613f2c565b6116a9565b3480156106b757600080fd5b506103906106c636600461401c565b611741565b3480156106d757600080fd5b5061049c6117f5565b3480156106ec57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610457565b34801561071757600080fd5b5061049c610726366004613f2c565b611868565b34801561073757600080fd5b5061049c610746366004613f2c565b611985565b34801561075757600080fd5b50610390611a51565b34801561076c57600080fd5b5061042a611a61565b34801561078157600080fd5b5061049c610790366004613f2c565b611a70565b3480156107a157600080fd5b5061039060135481565b3480156107b757600080fd5b50610390611b3c565b3480156107cc57600080fd5b5061049c6107db36600461417d565b611b58565b3480156107ec57600080fd5b5061049c6107fb3660046141ef565b611c37565b34801561080c57600080fd5b5061049c61081b3660046140bf565b611c46565b34801561082c57600080fd5b5061049c61083b36600461417d565b611e31565b34801561084c57600080fd5b5061049c61085b366004614307565b611f04565b34801561086c57600080fd5b50600f546103d890610100900460ff1681565b34801561088b57600080fd5b506103d861089a366004614373565b611f92565b3480156108ab57600080fd5b5061042a6108ba366004613f2c565b611fc9565b3480156108cb57600080fd5b5061049c6108da3660046143a8565b612099565b3480156108eb57600080fd5b506014546104579073ffffffffffffffffffffffffffffffffffffffff1681565b34801561091857600080fd5b5061049c61092736600461401c565b612173565b34801561093857600080fd5b5061042a612278565b34801561094d57600080fd5b506103d8612285565b61049c6109643660046143f1565b6122a8565b61049c610977366004613f2c565b61251f565b34801561098857600080fd5b50600f546103d89060ff1681565b3480156109a257600080fd5b5061049c6109b136600461401c565b612701565b3480156109c257600080fd5b50610390600d5481565b3480156109d857600080fd5b506012546104579073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a0557600080fd5b506103d8610a14366004614438565b61280a565b348015610a2557600080fd5b506011546104579073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a5257600080fd5b5061049c610a6136600461401c565b61292a565b348015610a7257600080fd5b506103d8610a81366004613ff0565b612a26565b348015610a9257600080fd5b5061049c610aa1366004614162565b612b92565b600f5460009060ff1615610abb5750600c5490565b50600090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610b175750610b1782612c87565b92915050565b606060018054610b2c90614471565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5890614471565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610c4b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c7f826116a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b3373ffffffffffffffffffffffffffffffffffffffff82161480610d4c5750610d4c813361280a565b610dbe5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c42565b610dc88383612d6a565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600b8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526011908201527f6d61784d696e7450657241646472657373000000000000000000000000000000604082015260600190565b60405180910390a150565b60115473ffffffffffffffffffffffffffffffffffffffff16610f095760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff163314610f705760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161781556040805160208082528101929092527f7769746864726177616c41646472657373000000000000000000000000000000908201527f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290606001610e99565b6110183382612e0a565b61108a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c42565b610dc8838383612f33565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110fc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b82811461114b5760405162461bcd60e51b815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610c42565b60005b838110156111b157828282818110611168576111686144c5565b9050602002013560166000878785818110611185576111856144c5565b9050602002013581526020019081526020016000208190555080806111a990614523565b91505061114e565b5050505050565b600a80546111c590614471565b80601f01602080910402602001604051908101604052809291908181526020018280546111f190614471565b801561123e5780601f106112135761010080835404028352916020019161123e565b820191906000526020600020905b81548152906001019060200180831161122157829003601f168201915b505050505081565b600082815260036020526040812054819073ffffffffffffffffffffffffffffffffffffffff166112b95760405162461bcd60e51b815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610c42565b306112d06112c985601354613166565b6064613172565b915091505b9250929050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600c8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526015908201527f6d61784d696e745065725472616e73616374696f6e0000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff16331461140f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b601555565b600980546111c590614471565b610dc883838360405180602001604052806000815250611f04565b60115460009073ffffffffffffffffffffffffffffffffffffffff166114a45760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff16331461150b5760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b504790565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600f8054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526008908201527f6973436c6f736564000000000000000000000000000000000000000000000000604082015260600190565b600f5460009060ff161561161d5750600090565b50600b5490565b600d546000901561165357600d548261163b611a51565b611645919061455c565b111561165357506000919050565b600c541561166d57600c5482111561166d57506000919050565b600b54156116a157600b543360009081526010602052604090205461169390849061455c565b11156116a157506000919050565b506001919050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c42565b600073ffffffffffffffffffffffffffffffffffffffff82166117cc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c42565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff16331461185c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611866600061317e565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600d5481106119205760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c795f6465637265617365000000000000000000000000000000000000006044820152606401610c42565b600d8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526009908201527f6d6178546f6b656e730000000000000000000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600e8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526005908201527f7072696365000000000000000000000000000000000000000000000000000000604082015260600190565b6000611a5c60075490565b905090565b606060028054610b2c90614471565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ad75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b60138190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e99906020808252600e908201527f726f79616c747950657263656e74000000000000000000000000000000000000604082015260600190565b600f5460009060ff1615611b515750600e5490565b5060155490565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611bcb60088383613db6565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051611c2b9060208082526007908201527f6261736555524900000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a15050565b611c423383836131f3565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b828114611cfc5760405162461bcd60e51b815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610c42565b6000805b82811015611d4057838382818110611d1a57611d1a6144c5565b9050602002013582611d2c919061455c565b915080611d3881614523565b915050611d00565b50600d5481611d4d611a51565b611d57919061455c565b1115611da55760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b506000805b84811015611e295760005b848483818110611dc757611dc76144c5565b90506020020135811015611e1657611e04878784818110611dea57611dea6144c5565b9050602002016020810190611dff919061401c565b613307565b80611e0e81614523565b915050611db5565b5080611e2181614523565b915050611daa565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611ea460098383613db6565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051611c2b9060208082526003908201527f6b65790000000000000000000000000000000000000000000000000000000000604082015260600190565b611f0e3383612e0a565b611f805760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c42565b611f8c84848484613327565b50505050565b600f54600090610100900460ff1615611fad57506000919050565b600f5460ff1615611fc057506001919050565b610b17826133b0565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661203d5760405162461bcd60e51b815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610c42565b60006008805461204c90614471565b9050116120685760405180602001604052806000815250610b17565b60086120738361349b565b604051602001612084929190614645565b60405160208183030381529060405292915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b805161211390600a906020840190613e58565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051610e999060208082526005908201527f67726f7570000000000000000000000000000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161781556040805160208082528101929092527f70726f7879526567697374727941646472657373000000000000000000000000908201527f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290606001610e99565b600880546111c590614471565b600f54600090610100900460ff161561229e5750600090565b50600f5460ff1690565b600b54336000908152601060205260409020546122c690849061455c565b11156123145760405162461bcd60e51b815260206004820152600a60248201527f6d61785f6d696e746564000000000000000000000000000000000000000000006044820152606401610c42565b600d5482612320611a51565b61232a919061455c565b11156123785760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b600f5460ff16156123cb5760405162461bcd60e51b815260206004820152600960248201527f69735f7075626c696300000000000000000000000000000000000000000000006044820152606401610c42565b600f54610100900460ff16156124235760405162461bcd60e51b815260206004820152600960248201527f69735f636c6f73656400000000000000000000000000000000000000000000006044820152606401610c42565b61242c816133b0565b6124785760405162461bcd60e51b815260206004820152601160248201527f696e76616c69645f7369676e61747572650000000000000000000000000000006044820152606401610c42565b3482601554612487919061466a565b146124d45760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610c42565b33600090815260106020526040812080548492906124f390849061455c565b90915550600090505b82811015610dc85761250d33613307565b8061251781614523565b9150506124fc565b600c548111156125715760405162461bcd60e51b815260206004820152600c60248201527f6d61785f6d696e7461626c6500000000000000000000000000000000000000006044820152606401610c42565b600d548161257d611a51565b612587919061455c565b11156125d55760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b600f54610100900460ff161561262d5760405162461bcd60e51b815260206004820152600960248201527f69735f636c6f73656400000000000000000000000000000000000000000000006044820152606401610c42565b600f5460ff1661267f5760405162461bcd60e51b815260206004820152600a60248201527f6e6f745f7075626c6963000000000000000000000000000000000000000000006044820152606401610c42565b3481600e5461268e919061466a565b146126db5760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610c42565b60005b81811015611c42576126ef33613307565b806126f981614523565b9150506126de565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b6012805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e99906020808252600c908201527f7665726966795369676e65720000000000000000000000000000000000000000604082015260600190565b60145460009073ffffffffffffffffffffffffffffffffffffffff16156128ec576014546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015291821691841690829063c455279190602401602060405180830381865afa1580156128a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c491906146a7565b73ffffffffffffffffffffffffffffffffffffffff1614156128ea576001915050610b17565b505b73ffffffffffffffffffffffffffffffffffffffff80841660009081526006602090815260408083209386168352929052205460ff165b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146129915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff8116612a1a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c42565b612a238161317e565b50565b60115460009073ffffffffffffffffffffffffffffffffffffffff16612a8e5760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff163314612af55760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b47821115612b455760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610c42565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f19350505050158015612b88573d6000803e3d6000fd5b5060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bf95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600f80548215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526008908201527f69735075626c6963000000000000000000000000000000000000000000000000604082015260600190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612d1a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b1757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b17565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612dc4826116a9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16612ea15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c42565b6000612eac836116a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f1b57508373ffffffffffffffffffffffffffffffffffffffff16612f0384610baf565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f2b5750612f2b818561280a565b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16612f53826116a9565b73ffffffffffffffffffffffffffffffffffffffff1614612fdc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c42565b73ffffffffffffffffffffffffffffffffffffffff82166130645760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c42565b61306f600082612d6a565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602052604081208054600192906130a59084906146c4565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906130e090849061455c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612923828461466a565b6000612923828461470a565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561326f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133198161331460075490565b6135cd565b612a23600780546001019055565b613332848484612f33565b61333e848484846135e7565b611f8c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b6000806009600a336040516020016133ca9392919061471e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012060125490915073ffffffffffffffffffffffffffffffffffffffff1661347d84613477846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906137bd565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b6060816134db57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561350557806134ef81614523565b91506134fe9050600a8361470a565b91506134df565b60008167ffffffffffffffff81111561352057613520614224565b6040519080825280601f01601f19166020018201604052801561354a576020820181803683370190505b5090505b8415612f2b5761355f6001836146c4565b915061356c600a86614768565b61357790603061455c565b60f81b81838151811061358c5761358c6144c5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135c6600a8661470a565b945061354e565b611c428282604051806020016040528060008152506137e1565b600073ffffffffffffffffffffffffffffffffffffffff84163b156137b2576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061365e90339089908890889060040161477c565b6020604051808303816000875af19250505080156136b7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526136b4918101906147c5565b60015b613767573d8080156136e5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ea565b606091505b50805161375f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612f2b565b506001949350505050565b60008060006137cc858561386a565b915091506137d9816138d7565b509392505050565b6137eb8383613ac8565b6137f860008484846135e7565b610dc85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b6000808251604114156138a15760208301516040840151606085015160001a61389587828585613c56565b945094505050506112d5565b8251604014156138cb57602083015160408401516138c0868383613d6e565b9350935050506112d5565b506000905060026112d5565b60008160048111156138eb576138eb6147e2565b14156138f45750565b6001816004811115613908576139086147e2565b14156139565760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c42565b600281600481111561396a5761396a6147e2565b14156139b85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c42565b60038160048111156139cc576139cc6147e2565b1415613a405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b6004816004811115613a5457613a546147e2565b1415612a235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b73ffffffffffffffffffffffffffffffffffffffff8216613b2b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c42565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615613b9d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260408120805460019290613bd390849061455c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613c8d5750600090506003613d65565b8460ff16601b14158015613ca557508460ff16601c14155b15613cb65750600090506004613d65565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613d0a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116613d5e57600060019250925050613d65565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01613da887828885613c56565b935093505050935093915050565b828054613dc290614471565b90600052602060002090601f016020900481019282613de45760008555613e48565b82601f10613e1b578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613e48565b82800160010185558215613e48579182015b82811115613e48578235825591602001919060010190613e2d565b50613e54929150613ecc565b5090565b828054613e6490614471565b90600052602060002090601f016020900481019282613e865760008555613e48565b82601f10613e9f57805160ff1916838001178555613e48565b82800160010185558215613e48579182015b82811115613e48578251825591602001919060010190613eb1565b5b80821115613e545760008155600101613ecd565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612a2357600080fd5b600060208284031215613f2157600080fd5b813561292381613ee1565b600060208284031215613f3e57600080fd5b5035919050565b60005b83811015613f60578181015183820152602001613f48565b83811115611f8c5750506000910152565b60008151808452613f89816020860160208601613f45565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129236020830184613f71565b73ffffffffffffffffffffffffffffffffffffffff81168114612a2357600080fd5b6000806040838503121561400357600080fd5b823561400e81613fce565b946020939093013593505050565b60006020828403121561402e57600080fd5b813561292381613fce565b60008060006060848603121561404e57600080fd5b833561405981613fce565b9250602084013561406981613fce565b929592945050506040919091013590565b60008083601f84011261408c57600080fd5b50813567ffffffffffffffff8111156140a457600080fd5b6020830191508360208260051b85010111156112d557600080fd5b600080600080604085870312156140d557600080fd5b843567ffffffffffffffff808211156140ed57600080fd5b6140f98883890161407a565b9096509450602087013591508082111561411257600080fd5b5061411f8782880161407a565b95989497509550505050565b6000806040838503121561413e57600080fd5b50508035926020909101359150565b8035801515811461415d57600080fd5b919050565b60006020828403121561417457600080fd5b6129238261414d565b6000806020838503121561419057600080fd5b823567ffffffffffffffff808211156141a857600080fd5b818501915085601f8301126141bc57600080fd5b8135818111156141cb57600080fd5b8660208285010111156141dd57600080fd5b60209290920196919550909350505050565b6000806040838503121561420257600080fd5b823561420d81613fce565b915061421b6020840161414d565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561426e5761426e614224565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156142b4576142b4614224565b816040528093508581528686860111156142cd57600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126142f857600080fd5b61292383833560208501614253565b6000806000806080858703121561431d57600080fd5b843561432881613fce565b9350602085013561433881613fce565b925060408501359150606085013567ffffffffffffffff81111561435b57600080fd5b614367878288016142e7565b91505092959194509250565b60006020828403121561438557600080fd5b813567ffffffffffffffff81111561439c57600080fd5b612f2b848285016142e7565b6000602082840312156143ba57600080fd5b813567ffffffffffffffff8111156143d157600080fd5b8201601f810184136143e257600080fd5b612f2b84823560208401614253565b6000806040838503121561440457600080fd5b82359150602083013567ffffffffffffffff81111561442257600080fd5b61442e858286016142e7565b9150509250929050565b6000806040838503121561444b57600080fd5b823561445681613fce565b9150602083013561446681613fce565b809150509250929050565b600181811c9082168061448557607f821691505b602082108114156144bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614555576145556144f4565b5060010190565b6000821982111561456f5761456f6144f4565b500190565b8054600090600181811c908083168061458e57607f831692505b60208084108214156145c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8180156145dd576001811461460c57614639565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614639565b60008881526020902060005b868110156146315781548b820152908501908301614618565b505084890196505b50505050505092915050565b60006146518285614574565b8351614661818360208801613f45565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a2576146a26144f4565b500290565b6000602082840312156146b957600080fd5b815161292381613fce565b6000828210156146d6576146d66144f4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614719576147196146db565b500490565b600061473361472d8387614574565b85614574565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168352505060140192915050565b600082614777576147776146db565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526147bb6080830184613f71565b9695505050505050565b6000602082840312156147d757600080fd5b815161292381613ee1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220d7dee0c97a09282bb46671c4128444c97c2900424233e210b350daf5439cb9b164736f6c634300080a003368747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f6d79737469632d77697a617264732f6d61696e2f

Deployed Bytecode

0x6080604052600436106103755760003560e01c80639499ac54116101d1578063cd7c032611610102578063e0d11a47116100a0578063f2bcd0221161006f578063f2bcd02214610a19578063f2fde38b14610a46578063f3fef3a314610a66578063fdab3b3f14610a8657600080fd5b8063e0d11a4714610996578063e8315742146109b6578063e8c61831146109cc578063e985e9c5146109f957600080fd5b8063d832d92f116100dc578063d832d92f14610941578063d870155414610956578063da69c08314610969578063dc9a15351461097c57600080fd5b8063cd7c0326146108df578063d26ea6c01461090c578063d547cfb71461092c57600080fd5b8063a645ff5f1161016f578063c2b6b58c11610149578063c2b6b58c14610860578063c612879f1461087f578063c87b56dd1461089f578063c97b9730146108bf57600080fd5b8063a645ff5f14610800578063af42d10614610820578063b88d4fde1461084057600080fd5b80639f67756d116101ab5780639f67756d14610795578063a035b1fe146107ab578063a0bcfc7f146107c0578063a22cb465146107e057600080fd5b80639499ac541461074b57806395d89b41146107605780639a4fc6401461077557600080fd5b80633549345e116102ab5780635dd871a311610249578063715018a611610223578063715018a6146106cb5780638da5cb5b146106e05780638edb25a01461070b57806391b7f5ed1461072b57600080fd5b80635dd871a31461066b5780636352211e1461068b57806370a08231146106ab57600080fd5b8063429a1bb011610285578063429a1bb0146105f457806349668b4a146106095780635461048114610629578063572849c41461065657600080fd5b80633549345e1461059f5780633943380c146105bf57806342842e0e146105d457600080fd5b80631e14d44b1161031857806327a9574e116102f257806327a9574e146104fe57806329e7ef2d1461051e5780632a55205a146105335780632e6cebe51461057f57600080fd5b80631e14d44b1461049e57806321b8092e146104be57806323b872dd146104de57600080fd5b806304f928c21161035457806304f928c2146103e857806306fdde0314610415578063081812fc14610437578063095ea7b31461047c57600080fd5b80620e7fa81461037a57806301f56997146103a357806301ffc9a7146103b8575b600080fd5b34801561038657600080fd5b5061039060155481565b6040519081526020015b60405180910390f35b3480156103af57600080fd5b50610390610aa6565b3480156103c457600080fd5b506103d86103d3366004613f0f565b610ac1565b604051901515815260200161039a565b3480156103f457600080fd5b50610390610403366004613f2c565b60166020526000908152604090205481565b34801561042157600080fd5b5061042a610b1d565b60405161039a9190613fbb565b34801561044357600080fd5b50610457610452366004613f2c565b610baf565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039a565b34801561048857600080fd5b5061049c610497366004613ff0565b610c74565b005b3480156104aa57600080fd5b5061049c6104b9366004613f2c565b610dcd565b3480156104ca57600080fd5b5061049c6104d936600461401c565b610ea4565b3480156104ea57600080fd5b5061049c6104f9366004614039565b61100e565b34801561050a57600080fd5b5061049c6105193660046140bf565b611095565b34801561052a57600080fd5b5061042a6111b8565b34801561053f57600080fd5b5061055361054e36600461412b565b611246565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161039a565b34801561058b57600080fd5b5061049c61059a366004613f2c565b6112dc565b3480156105ab57600080fd5b5061049c6105ba366004613f2c565b6113a8565b3480156105cb57600080fd5b5061042a611414565b3480156105e057600080fd5b5061049c6105ef366004614039565b611421565b34801561060057600080fd5b5061039061143c565b34801561061557600080fd5b5061049c610624366004614162565b611510565b34801561063557600080fd5b5061039061064436600461401c565b60106020526000908152604090205481565b34801561066257600080fd5b50610390611609565b34801561067757600080fd5b506103d8610686366004613f2c565b611624565b34801561069757600080fd5b506104576106a6366004613f2c565b6116a9565b3480156106b757600080fd5b506103906106c636600461401c565b611741565b3480156106d757600080fd5b5061049c6117f5565b3480156106ec57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610457565b34801561071757600080fd5b5061049c610726366004613f2c565b611868565b34801561073757600080fd5b5061049c610746366004613f2c565b611985565b34801561075757600080fd5b50610390611a51565b34801561076c57600080fd5b5061042a611a61565b34801561078157600080fd5b5061049c610790366004613f2c565b611a70565b3480156107a157600080fd5b5061039060135481565b3480156107b757600080fd5b50610390611b3c565b3480156107cc57600080fd5b5061049c6107db36600461417d565b611b58565b3480156107ec57600080fd5b5061049c6107fb3660046141ef565b611c37565b34801561080c57600080fd5b5061049c61081b3660046140bf565b611c46565b34801561082c57600080fd5b5061049c61083b36600461417d565b611e31565b34801561084c57600080fd5b5061049c61085b366004614307565b611f04565b34801561086c57600080fd5b50600f546103d890610100900460ff1681565b34801561088b57600080fd5b506103d861089a366004614373565b611f92565b3480156108ab57600080fd5b5061042a6108ba366004613f2c565b611fc9565b3480156108cb57600080fd5b5061049c6108da3660046143a8565b612099565b3480156108eb57600080fd5b506014546104579073ffffffffffffffffffffffffffffffffffffffff1681565b34801561091857600080fd5b5061049c61092736600461401c565b612173565b34801561093857600080fd5b5061042a612278565b34801561094d57600080fd5b506103d8612285565b61049c6109643660046143f1565b6122a8565b61049c610977366004613f2c565b61251f565b34801561098857600080fd5b50600f546103d89060ff1681565b3480156109a257600080fd5b5061049c6109b136600461401c565b612701565b3480156109c257600080fd5b50610390600d5481565b3480156109d857600080fd5b506012546104579073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a0557600080fd5b506103d8610a14366004614438565b61280a565b348015610a2557600080fd5b506011546104579073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a5257600080fd5b5061049c610a6136600461401c565b61292a565b348015610a7257600080fd5b506103d8610a81366004613ff0565b612a26565b348015610a9257600080fd5b5061049c610aa1366004614162565b612b92565b600f5460009060ff1615610abb5750600c5490565b50600090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610b175750610b1782612c87565b92915050565b606060018054610b2c90614471565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5890614471565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610c4b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c7f826116a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b3373ffffffffffffffffffffffffffffffffffffffff82161480610d4c5750610d4c813361280a565b610dbe5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c42565b610dc88383612d6a565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600b8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526011908201527f6d61784d696e7450657241646472657373000000000000000000000000000000604082015260600190565b60405180910390a150565b60115473ffffffffffffffffffffffffffffffffffffffff16610f095760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff163314610f705760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161781556040805160208082528101929092527f7769746864726177616c41646472657373000000000000000000000000000000908201527f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290606001610e99565b6110183382612e0a565b61108a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c42565b610dc8838383612f33565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110fc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b82811461114b5760405162461bcd60e51b815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610c42565b60005b838110156111b157828282818110611168576111686144c5565b9050602002013560166000878785818110611185576111856144c5565b9050602002013581526020019081526020016000208190555080806111a990614523565b91505061114e565b5050505050565b600a80546111c590614471565b80601f01602080910402602001604051908101604052809291908181526020018280546111f190614471565b801561123e5780601f106112135761010080835404028352916020019161123e565b820191906000526020600020905b81548152906001019060200180831161122157829003601f168201915b505050505081565b600082815260036020526040812054819073ffffffffffffffffffffffffffffffffffffffff166112b95760405162461bcd60e51b815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610c42565b306112d06112c985601354613166565b6064613172565b915091505b9250929050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600c8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526015908201527f6d61784d696e745065725472616e73616374696f6e0000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff16331461140f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b601555565b600980546111c590614471565b610dc883838360405180602001604052806000815250611f04565b60115460009073ffffffffffffffffffffffffffffffffffffffff166114a45760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff16331461150b5760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b504790565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600f8054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526008908201527f6973436c6f736564000000000000000000000000000000000000000000000000604082015260600190565b600f5460009060ff161561161d5750600090565b50600b5490565b600d546000901561165357600d548261163b611a51565b611645919061455c565b111561165357506000919050565b600c541561166d57600c5482111561166d57506000919050565b600b54156116a157600b543360009081526010602052604090205461169390849061455c565b11156116a157506000919050565b506001919050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c42565b600073ffffffffffffffffffffffffffffffffffffffff82166117cc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c42565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff16331461185c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611866600061317e565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600d5481106119205760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c795f6465637265617365000000000000000000000000000000000000006044820152606401610c42565b600d8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526009908201527f6d6178546f6b656e730000000000000000000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600e8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526005908201527f7072696365000000000000000000000000000000000000000000000000000000604082015260600190565b6000611a5c60075490565b905090565b606060028054610b2c90614471565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ad75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b60138190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e99906020808252600e908201527f726f79616c747950657263656e74000000000000000000000000000000000000604082015260600190565b600f5460009060ff1615611b515750600e5490565b5060155490565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611bcb60088383613db6565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051611c2b9060208082526007908201527f6261736555524900000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a15050565b611c423383836131f3565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b828114611cfc5760405162461bcd60e51b815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610c42565b6000805b82811015611d4057838382818110611d1a57611d1a6144c5565b9050602002013582611d2c919061455c565b915080611d3881614523565b915050611d00565b50600d5481611d4d611a51565b611d57919061455c565b1115611da55760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b506000805b84811015611e295760005b848483818110611dc757611dc76144c5565b90506020020135811015611e1657611e04878784818110611dea57611dea6144c5565b9050602002016020810190611dff919061401c565b613307565b80611e0e81614523565b915050611db5565b5080611e2181614523565b915050611daa565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611ea460098383613db6565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051611c2b9060208082526003908201527f6b65790000000000000000000000000000000000000000000000000000000000604082015260600190565b611f0e3383612e0a565b611f805760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c42565b611f8c84848484613327565b50505050565b600f54600090610100900460ff1615611fad57506000919050565b600f5460ff1615611fc057506001919050565b610b17826133b0565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661203d5760405162461bcd60e51b815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610c42565b60006008805461204c90614471565b9050116120685760405180602001604052806000815250610b17565b60086120738361349b565b604051602001612084929190614645565b60405160208183030381529060405292915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b805161211390600a906020840190613e58565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051610e999060208082526005908201527f67726f7570000000000000000000000000000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161781556040805160208082528101929092527f70726f7879526567697374727941646472657373000000000000000000000000908201527f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290606001610e99565b600880546111c590614471565b600f54600090610100900460ff161561229e5750600090565b50600f5460ff1690565b600b54336000908152601060205260409020546122c690849061455c565b11156123145760405162461bcd60e51b815260206004820152600a60248201527f6d61785f6d696e746564000000000000000000000000000000000000000000006044820152606401610c42565b600d5482612320611a51565b61232a919061455c565b11156123785760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b600f5460ff16156123cb5760405162461bcd60e51b815260206004820152600960248201527f69735f7075626c696300000000000000000000000000000000000000000000006044820152606401610c42565b600f54610100900460ff16156124235760405162461bcd60e51b815260206004820152600960248201527f69735f636c6f73656400000000000000000000000000000000000000000000006044820152606401610c42565b61242c816133b0565b6124785760405162461bcd60e51b815260206004820152601160248201527f696e76616c69645f7369676e61747572650000000000000000000000000000006044820152606401610c42565b3482601554612487919061466a565b146124d45760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610c42565b33600090815260106020526040812080548492906124f390849061455c565b90915550600090505b82811015610dc85761250d33613307565b8061251781614523565b9150506124fc565b600c548111156125715760405162461bcd60e51b815260206004820152600c60248201527f6d61785f6d696e7461626c6500000000000000000000000000000000000000006044820152606401610c42565b600d548161257d611a51565b612587919061455c565b11156125d55760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b600f54610100900460ff161561262d5760405162461bcd60e51b815260206004820152600960248201527f69735f636c6f73656400000000000000000000000000000000000000000000006044820152606401610c42565b600f5460ff1661267f5760405162461bcd60e51b815260206004820152600a60248201527f6e6f745f7075626c6963000000000000000000000000000000000000000000006044820152606401610c42565b3481600e5461268e919061466a565b146126db5760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610c42565b60005b81811015611c42576126ef33613307565b806126f981614523565b9150506126de565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b6012805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e99906020808252600c908201527f7665726966795369676e65720000000000000000000000000000000000000000604082015260600190565b60145460009073ffffffffffffffffffffffffffffffffffffffff16156128ec576014546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015291821691841690829063c455279190602401602060405180830381865afa1580156128a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c491906146a7565b73ffffffffffffffffffffffffffffffffffffffff1614156128ea576001915050610b17565b505b73ffffffffffffffffffffffffffffffffffffffff80841660009081526006602090815260408083209386168352929052205460ff165b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146129915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff8116612a1a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c42565b612a238161317e565b50565b60115460009073ffffffffffffffffffffffffffffffffffffffff16612a8e5760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff163314612af55760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b47821115612b455760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610c42565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f19350505050158015612b88573d6000803e3d6000fd5b5060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bf95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600f80548215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526008908201527f69735075626c6963000000000000000000000000000000000000000000000000604082015260600190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612d1a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b1757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b17565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612dc4826116a9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16612ea15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c42565b6000612eac836116a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f1b57508373ffffffffffffffffffffffffffffffffffffffff16612f0384610baf565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f2b5750612f2b818561280a565b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16612f53826116a9565b73ffffffffffffffffffffffffffffffffffffffff1614612fdc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c42565b73ffffffffffffffffffffffffffffffffffffffff82166130645760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c42565b61306f600082612d6a565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602052604081208054600192906130a59084906146c4565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906130e090849061455c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612923828461466a565b6000612923828461470a565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561326f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133198161331460075490565b6135cd565b612a23600780546001019055565b613332848484612f33565b61333e848484846135e7565b611f8c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b6000806009600a336040516020016133ca9392919061471e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012060125490915073ffffffffffffffffffffffffffffffffffffffff1661347d84613477846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906137bd565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b6060816134db57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561350557806134ef81614523565b91506134fe9050600a8361470a565b91506134df565b60008167ffffffffffffffff81111561352057613520614224565b6040519080825280601f01601f19166020018201604052801561354a576020820181803683370190505b5090505b8415612f2b5761355f6001836146c4565b915061356c600a86614768565b61357790603061455c565b60f81b81838151811061358c5761358c6144c5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135c6600a8661470a565b945061354e565b611c428282604051806020016040528060008152506137e1565b600073ffffffffffffffffffffffffffffffffffffffff84163b156137b2576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061365e90339089908890889060040161477c565b6020604051808303816000875af19250505080156136b7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526136b4918101906147c5565b60015b613767573d8080156136e5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ea565b606091505b50805161375f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612f2b565b506001949350505050565b60008060006137cc858561386a565b915091506137d9816138d7565b509392505050565b6137eb8383613ac8565b6137f860008484846135e7565b610dc85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b6000808251604114156138a15760208301516040840151606085015160001a61389587828585613c56565b945094505050506112d5565b8251604014156138cb57602083015160408401516138c0868383613d6e565b9350935050506112d5565b506000905060026112d5565b60008160048111156138eb576138eb6147e2565b14156138f45750565b6001816004811115613908576139086147e2565b14156139565760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c42565b600281600481111561396a5761396a6147e2565b14156139b85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c42565b60038160048111156139cc576139cc6147e2565b1415613a405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b6004816004811115613a5457613a546147e2565b1415612a235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b73ffffffffffffffffffffffffffffffffffffffff8216613b2b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c42565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615613b9d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260408120805460019290613bd390849061455c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613c8d5750600090506003613d65565b8460ff16601b14158015613ca557508460ff16601c14155b15613cb65750600090506004613d65565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613d0a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116613d5e57600060019250925050613d65565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01613da887828885613c56565b935093505050935093915050565b828054613dc290614471565b90600052602060002090601f016020900481019282613de45760008555613e48565b82601f10613e1b578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613e48565b82800160010185558215613e48579182015b82811115613e48578235825591602001919060010190613e2d565b50613e54929150613ecc565b5090565b828054613e6490614471565b90600052602060002090601f016020900481019282613e865760008555613e48565b82601f10613e9f57805160ff1916838001178555613e48565b82800160010185558215613e48579182015b82811115613e48578251825591602001919060010190613eb1565b5b80821115613e545760008155600101613ecd565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612a2357600080fd5b600060208284031215613f2157600080fd5b813561292381613ee1565b600060208284031215613f3e57600080fd5b5035919050565b60005b83811015613f60578181015183820152602001613f48565b83811115611f8c5750506000910152565b60008151808452613f89816020860160208601613f45565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129236020830184613f71565b73ffffffffffffffffffffffffffffffffffffffff81168114612a2357600080fd5b6000806040838503121561400357600080fd5b823561400e81613fce565b946020939093013593505050565b60006020828403121561402e57600080fd5b813561292381613fce565b60008060006060848603121561404e57600080fd5b833561405981613fce565b9250602084013561406981613fce565b929592945050506040919091013590565b60008083601f84011261408c57600080fd5b50813567ffffffffffffffff8111156140a457600080fd5b6020830191508360208260051b85010111156112d557600080fd5b600080600080604085870312156140d557600080fd5b843567ffffffffffffffff808211156140ed57600080fd5b6140f98883890161407a565b9096509450602087013591508082111561411257600080fd5b5061411f8782880161407a565b95989497509550505050565b6000806040838503121561413e57600080fd5b50508035926020909101359150565b8035801515811461415d57600080fd5b919050565b60006020828403121561417457600080fd5b6129238261414d565b6000806020838503121561419057600080fd5b823567ffffffffffffffff808211156141a857600080fd5b818501915085601f8301126141bc57600080fd5b8135818111156141cb57600080fd5b8660208285010111156141dd57600080fd5b60209290920196919550909350505050565b6000806040838503121561420257600080fd5b823561420d81613fce565b915061421b6020840161414d565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561426e5761426e614224565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156142b4576142b4614224565b816040528093508581528686860111156142cd57600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126142f857600080fd5b61292383833560208501614253565b6000806000806080858703121561431d57600080fd5b843561432881613fce565b9350602085013561433881613fce565b925060408501359150606085013567ffffffffffffffff81111561435b57600080fd5b614367878288016142e7565b91505092959194509250565b60006020828403121561438557600080fd5b813567ffffffffffffffff81111561439c57600080fd5b612f2b848285016142e7565b6000602082840312156143ba57600080fd5b813567ffffffffffffffff8111156143d157600080fd5b8201601f810184136143e257600080fd5b612f2b84823560208401614253565b6000806040838503121561440457600080fd5b82359150602083013567ffffffffffffffff81111561442257600080fd5b61442e858286016142e7565b9150509250929050565b6000806040838503121561444b57600080fd5b823561445681613fce565b9150602083013561446681613fce565b809150509250929050565b600181811c9082168061448557607f821691505b602082108114156144bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614555576145556144f4565b5060010190565b6000821982111561456f5761456f6144f4565b500190565b8054600090600181811c908083168061458e57607f831692505b60208084108214156145c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8180156145dd576001811461460c57614639565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614639565b60008881526020902060005b868110156146315781548b820152908501908301614618565b505084890196505b50505050505092915050565b60006146518285614574565b8351614661818360208801613f45565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a2576146a26144f4565b500290565b6000602082840312156146b957600080fd5b815161292381613fce565b6000828210156146d6576146d66144f4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614719576147196146db565b500490565b600061473361472d8387614574565b85614574565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168352505060140192915050565b600082614777576147776146db565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526147bb6080830184613f71565b9695505050505050565b6000602082840312156147d757600080fd5b815161292381613ee1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220d7dee0c97a09282bb46671c4128444c97c2900424233e210b350daf5439cb9b164736f6c634300080a0033

Deployed Bytecode Sourcemap

281:2822:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;321:44;;;;;;;;;;;;;;;;;;;160:25:16;;;148:2;133:18;321:44:12;;;;;;;;794:180;;;;;;;;;;;;;:::i;2170:217:6:-;;;;;;;;;;-1:-1:-1;2170:217:6;;;;;:::i;:::-;;:::i;:::-;;;793:14:16;;786:22;768:41;;756:2;741:18;2170:217:6;628:187:16;371:50:12;;;;;;;;;;-1:-1:-1;371:50:12;;;;;:::i;:::-;;;;;;;;;;;;;;2408:98:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:5;;;;;:::i;:::-;;:::i;:::-;;;1991:42:16;1979:55;;;1961:74;;1949:2;1934:18;3919:217:5;1815:226:16;3457:401:5;;;;;;;;;;-1:-1:-1;3457:401:5;;;;;:::i;:::-;;:::i;:::-;;7805:175:6;;;;;;;;;;-1:-1:-1;7805:175:6;;;;;:::i;:::-;;:::i;10534:176::-;;;;;;;;;;-1:-1:-1;10534:176:6;;;;;:::i;:::-;;:::i;4646:330:5:-;;;;;;;;;;-1:-1:-1;4646:330:5;;;;;:::i;:::-;;:::i;2779:322:12:-;;;;;;;;;;-1:-1:-1;2779:322:12;;;;;:::i;:::-;;:::i;730:28:6:-;;;;;;;;;;;;;:::i;9683:289::-;;;;;;;;;;-1:-1:-1;9683:289:6;;;;;:::i;:::-;;:::i;:::-;;;;4845:42:16;4833:55;;;4815:74;;4920:2;4905:18;;4898:34;;;;4788:18;9683:289:6;4641:297:16;8036:187:6;;;;;;;;;;-1:-1:-1;8036:187:6;;;;;:::i;:::-;;:::i;2675:98:12:-;;;;;;;;;;-1:-1:-1;2675:98:12;;;;;:::i;:::-;;:::i;698:26:6:-;;;;;;;;;;;;;:::i;5042:179:5:-;;;;;;;;;;-1:-1:-1;5042:179:5;;;;;:::i;:::-;;:::i;10055:122:6:-;;;;;;;;;;;;;:::i;7429:139::-;;;;;;;;;;-1:-1:-1;7429:139:6;;;;;:::i;:::-;;:::i;976:47::-;;;;;;;;;;-1:-1:-1;976:47:6;;;;;:::i;:::-;;;;;;;;;;;;;;1059:172:12;;;;;;;;;;;;;:::i;5241:573:6:-;;;;;;;;;;-1:-1:-1;5241:573:6;;;;;:::i;:::-;;:::i;2111:235:5:-;;;;;;;;;;-1:-1:-1;2111:235:5;;;;;:::i;:::-;;:::i;1849:205::-;;;;;;;;;;-1:-1:-1;1849:205:5;;;;;:::i;:::-;;:::i;1661:101:13:-;;;;;;;;;;;;;:::i;1029:85::-;;;;;;;;;;-1:-1:-1;1075:7:13;1101:6;;;1029:85;;6988:205:6;;;;;;;;;;-1:-1:-1;6988:205:6;;;;;:::i;:::-;;:::i;7612:137::-;;;;;;;;;;-1:-1:-1;7612:137:6;;;;;:::i;:::-;;:::i;5050:99::-;;;;;;;;;;;;;:::i;2570:102:5:-;;;;;;;;;;;;;:::i;9489:160:6:-;;;;;;;;;;-1:-1:-1;9489:160:6;;;;;:::i;:::-;;:::i;1100:29::-;;;;;;;;;;;;;;;;1300:159:12;;;;;;;;;;;;;:::i;8671:164:6:-;;;;;;;;;;-1:-1:-1;8671:164:6;;;;;:::i;:::-;;:::i;4203:153:5:-;;;;;;;;;;-1:-1:-1;4203:153:5;;;;;:::i;:::-;;:::i;2929:570:6:-;;;;;;;;;;-1:-1:-1;2929:570:6;;;;;:::i;:::-;;:::i;8290:129::-;;;;;;;;;;-1:-1:-1;8290:129:6;;;;;:::i;:::-;;:::i;5287:320:5:-;;;;;;;;;;-1:-1:-1;5287:320:5;;;;;:::i;:::-;;:::i;950:20:6:-;;;;;;;;;;-1:-1:-1;950:20:6;;;;;;;;;;;6664:250;;;;;;;;;;-1:-1:-1;6664:250:6;;;;;:::i;:::-;;:::i;2442:259::-;;;;;;;;;;-1:-1:-1;2442:259:6;;;;;:::i;:::-;;:::i;8490:137::-;;;;;;;;;;-1:-1:-1;8490:137:6;;;;;:::i;:::-;;:::i;1135:35::-;;;;;;;;;;-1:-1:-1;1135:35:6;;;;;;;;10776:342;;;;;;;;;;-1:-1:-1;10776:342:6;;;;;:::i;:::-;;:::i;666:26::-;;;;;;;;;;;;;:::i;6461:148::-;;;;;;;;;;;;;:::i;2050:619:12:-;;;;;;:::i;:::-;;:::i;1520:456::-;;;;;;:::i;:::-;;:::i;924:20:6:-;;;;;;;;;;-1:-1:-1;924:20:6;;;;;;;;8899:166;;;;;;;;;;-1:-1:-1;8899:166:6;;;;;:::i;:::-;;:::i;860:24::-;;;;;;;;;;;;;;;;1067:27;;;;;;;;;;-1:-1:-1;1067:27:6;;;;;;;;11208:426;;;;;;;;;;-1:-1:-1;11208:426:6;;;;;:::i;:::-;;:::i;1029:32::-;;;;;;;;;;-1:-1:-1;1029:32:6;;;;;;;;1911:198:13;;;;;;;;;;-1:-1:-1;1911:198:13;;;;;:::i;:::-;;:::i;10238:235:6:-;;;;;;;;;;-1:-1:-1;10238:235:6;;;;;:::i;:::-;;:::i;7244:139::-;;;;;;;;;;-1:-1:-1;7244:139:6;;;;;:::i;:::-;;:::i;794:180:12:-;880:8;;857:7;;880:8;;876:73;;;-1:-1:-1;911:27:12;;;794:180::o;876:73::-;-1:-1:-1;966:1:12;;794:180::o;2170:217:6:-;2274:4;2297:42;;;2313:26;2297:42;;:83;;;2343:37;2367:12;2343:23;:37::i;:::-;2290:90;2170:217;-1:-1:-1;;2170:217:6:o;2408:98:5:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;7167:16;;;:7;:16;;;;;;:30;:16;4014:73;;;;-1:-1:-1;;;4014:73:5;;11305:2:16;4014:73:5;;;11287:21:16;11344:2;11324:18;;;11317:30;11383:34;11363:18;;;11356:62;11454:14;11434:18;;;11427:42;11486:19;;4014:73:5;;;;;;;;;-1:-1:-1;4105:24:5;;;;:15;:24;;;;;;;;;3919:217::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;-1:-1:-1;;;3586:57:5;;11718:2:16;3586:57:5;;;11700:21:16;11757:2;11737:18;;;11730:30;11796:34;11776:18;;;11769:62;11867:3;11847:18;;;11840:31;11888:19;;3586:57:5;11516:397:16;3586:57:5;719:10:1;3675:21:5;;;;;:62;;-1:-1:-1;3700:37:5;3717:5;719:10:1;11208:426:6;:::i;3700:37:5:-;3654:165;;;;-1:-1:-1;;;3654:165:5;;12120:2:16;3654:165:5;;;12102:21:16;12159:2;12139:18;;;12132:30;12198:34;12178:18;;;12171:62;12269:26;12249:18;;;12242:54;12313:19;;3654:165:5;11918:420:16;3654:165:5;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;7805:175:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7889:23:6::1;:33:::0;;;7937:36:::1;::::0;::::1;::::0;::::1;::::0;12906:2:16;12888:21;;;12945:2;12925:18;;;12918:30;12984:19;12979:2;12964:18;;12957:47;13036:2;13021:18;;12704:341;7937:36:6::1;;;;;;;;7805:175:::0;:::o;10534:176::-;1263:17;;:31;:17;1255:58;;;;-1:-1:-1;;;1255:58:6;;13252:2:16;1255:58:6;;;13234:21:16;13291:2;13271:18;;;13264:30;13330:16;13310:18;;;13303:44;13364:18;;1255:58:6;13050:338:16;1255:58:6;1331:17;;:33;:17;719:10:1;1331:33:6;1323:57;;;;-1:-1:-1;;;1323:57:6;;13595:2:16;1323:57:6;;;13577:21:16;13634:2;13614:18;;;13607:30;13673:13;13653:18;;;13646:41;13704:18;;1323:57:6;13393:335:16;1323:57:6;10624:17:::1;:28:::0;;;::::1;;::::0;::::1;;::::0;;10667:36:::1;::::0;;13935:2:16;13917:21;;;13954:18;;13947:30;;;;14013:19;13993:18;;;13986:47;10667:36:6::1;::::0;14065:2:16;14050:18;10667:36:6::1;13733:341:16::0;4646:330:5;4835:41;719:10:1;4868:7:5;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:5;;14281:2:16;4827:103:5;;;14263:21:16;14320:2;14300:18;;;14293:30;14359:34;14339:18;;;14332:62;14430:19;14410:18;;;14403:47;14467:19;;4827:103:5;14079:413:16;4827:103:5;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;2779:322:12:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;2907:39:12;;::::1;2899:67;;;::::0;-1:-1:-1;;;2899:67:12;;14699:2:16;2899:67:12::1;::::0;::::1;14681:21:16::0;14738:2;14718:18;;;14711:30;14777:17;14757:18;;;14750:45;14812:18;;2899:67:12::1;14497:339:16::0;2899:67:12::1;2981:9;2976:119;2996:20:::0;;::::1;2976:119;;;3069:12;;3082:1;3069:15;;;;;;;:::i;:::-;;;;;;;3037;:29;3053:9;;3063:1;3053:12;;;;;;;:::i;:::-;;;;;;;3037:29;;;;;;;;;;;:47;;;;3018:3;;;;;:::i;:::-;;;;2976:119;;;;2779:322:::0;;;;:::o;730:28:6:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9683:289::-;9782:16;7167::5;;;:7;:16;;;;;;9782::6;;7167:30:5;:16;9833:38:6;;;;-1:-1:-1;;;9833:38:6;;15621:2:16;9833:38:6;;;15603:21:16;15660:1;15640:18;;;15633:29;15698:10;15678:18;;;15671:38;15726:18;;9833:38:6;15419:331:16;9833:38:6;9898:4;9905:59;9918:40;9931:10;9943:14;;9918:12;:40::i;:::-;9960:3;9905:12;:59::i;:::-;9882:83;;;;9683:289;;;;;;:::o;8036:187::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8124:27:6::1;:37:::0;;;8176:40:::1;::::0;::::1;::::0;::::1;::::0;15957:2:16;15939:21;;;15996:2;15976:18;;;15969:30;16035:23;16030:2;16015:18;;16008:51;16091:2;16076:18;;15755:345;2675:98:12;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;2745:12:12::1;:21:::0;2675:98::o;698:26:6:-;;;;;;;:::i;5042:179:5:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;10055:122:6:-;1263:17;;10123:7;;1263:31;:17;1255:58;;;;-1:-1:-1;;;1255:58:6;;13252:2:16;1255:58:6;;;13234:21:16;13291:2;13271:18;;;13264:30;13330:16;13310:18;;;13303:44;13364:18;;1255:58:6;13050:338:16;1255:58:6;1331:17;;:33;:17;719:10:1;1331:33:6;1323:57;;;;-1:-1:-1;;;1323:57:6;;13595:2:16;1323:57:6;;;13577:21:16;13634:2;13614:18;;;13607:30;13673:13;13653:18;;;13646:41;13704:18;;1323:57:6;13393:335:16;1323:57:6;-1:-1:-1;10149:21:6::1;10055:122:::0;:::o;7429:139::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7501:8:6::1;:18:::0;;;::::1;;;;::::0;;;::::1;;::::0;;7534:27:::1;::::0;::::1;::::0;::::1;::::0;16307:2:16;16289:21;;;16346:1;16326:18;;;16319:29;16384:10;16379:2;16364:18;;16357:38;16427:2;16412:18;;16105:331;1059:172:12;1141:8;;1118:7;;1141:8;;1137:47;;;-1:-1:-1;1172:1:12;;1059:172::o;1137:47::-;-1:-1:-1;1201:23:12;;;1059:172::o;5241:573:6:-;5324:9;;5304:4;;5324:13;5320:127;;5381:9;;5371:7;5357:11;:9;:11::i;:::-;:21;;;;:::i;:::-;:33;5353:84;;;-1:-1:-1;5417:5:6;;5241:573;-1:-1:-1;5241:573:6:o;5353:84::-;5461:27;;:31;5457:149;;5522:27;;5512:7;:37;5508:88;;;-1:-1:-1;5576:5:6;;5241:573;-1:-1:-1;5241:573:6:o;5508:88::-;5620:23;;:27;5616:170;;5706:23;;719:10:1;5667:26:6;;;;:12;:26;;;;;;:36;;5696:7;;5667:36;:::i;:::-;:62;5663:113;;;-1:-1:-1;5756:5:6;;5241:573;-1:-1:-1;5241:573:6:o;5663:113::-;-1:-1:-1;5803:4:6;;5241:573;-1:-1:-1;5241:573:6:o;2111:235:5:-;2183:7;2218:16;;;:7;:16;;;;;;;;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:5;;16776:2:16;2244:73:5;;;16758:21:16;16815:2;16795:18;;;16788:30;16854:34;16834:18;;;16827:62;16925:11;16905:18;;;16898:39;16954:19;;2244:73:5;16574:405:16;1849:205:5;1921:7;1948:19;;;1940:74;;;;-1:-1:-1;;;1940:74:5;;17186:2:16;1940:74:5;;;17168:21:16;17225:2;17205:18;;;17198:30;17264:34;17244:18;;;17237:62;17335:12;17315:18;;;17308:40;17365:19;;1940:74:5;16984:406:16;1940:74:5;-1:-1:-1;2031:16:5;;;;;;:9;:16;;;;;;;1849:205::o;1661:101:13:-;1075:7;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;6988:205:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7087:9:6::1;;7077:7;:19;7069:45;;;::::0;-1:-1:-1;;;7069:45:6;;17597:2:16;7069:45:6::1;::::0;::::1;17579:21:16::0;17636:2;17616:18;;;17609:30;17675:15;17655:18;;;17648:43;17708:18;;7069:45:6::1;17395:337:16::0;7069:45:6::1;7124:9;:19:::0;;;7158:28:::1;::::0;::::1;::::0;::::1;::::0;17939:2:16;17921:21;;;17978:1;17958:18;;;17951:29;18016:11;18011:2;17996:18;;17989:39;18060:2;18045:18;;17737:332;7612:137:6;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7683:11:6::1;:20:::0;;;7718:24:::1;::::0;::::1;::::0;::::1;::::0;18276:2:16;18258:21;;;18315:1;18295:18;;;18288:29;18353:7;18348:2;18333:18;;18326:35;18393:2;18378:18;;18074:328;5050:99:6;5092:7;5118:24;:14;918::2;;827:112;5118:24:6;5111:31;;5050:99;:::o;2570:102:5:-;2626:13;2658:7;2651:14;;;;;:::i;9489:160:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;9570:14:6::1;:24:::0;;;9609:33:::1;::::0;::::1;::::0;::::1;::::0;18609:2:16;18591:21;;;18648:2;18628:18;;;18621:30;18687:16;18682:2;18667:18;;18660:44;18736:2;18721:18;;18407:338;1300:159:12;1370:8;;1347:7;;1370:8;;1366:57;;;-1:-1:-1;1401:11:12;;;1300:159::o;1366:57::-;-1:-1:-1;1440:12:12;;;1300:159::o;8671:164:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8759:28:6::1;:12;8774:13:::0;;8759:28:::1;:::i;:::-;;8802:26;;;;;18952:2:16::0;18934:21;;;18991:1;18971:18;;;18964:29;19029:9;19024:2;19009:18;;19002:37;19071:2;19056:18;;18750:330;8802:26:6::1;;;;;;;;8671:164:::0;;:::o;4203:153:5:-;4297:52;719:10:1;4330:8:5;4340;4297:18;:52::i;:::-;4203:153;;:::o;2929:570:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;3040:36:6;;::::1;3032:64;;;::::0;-1:-1:-1;;;3032:64:6;;14699:2:16;3032:64:6::1;::::0;::::1;14681:21:16::0;14738:2;14718:18;;;14711:30;14777:17;14757:18;;;14750:45;14812:18;;3032:64:6::1;14497:339:16::0;3032:64:6::1;3107:13;::::0;3130:91:::1;3150:19:::0;;::::1;3130:91;;;3199:8;;3208:1;3199:11;;;;;;;:::i;:::-;;;;;;;3190:20;;;;;:::i;:::-;::::0;-1:-1:-1;3171:3:6;::::1;::::0;::::1;:::i;:::-;;;;3130:91;;;;3262:9;;3253:5;3239:11;:9;:11::i;:::-;:19;;;;:::i;:::-;:32;;3231:62;;;::::0;-1:-1:-1;;;3231:62:6;;19287:2:16;3231:62:6::1;::::0;::::1;19269:21:16::0;19326:2;19306:18;;;19299:30;19365:19;19345:18;;;19338:47;19402:18;;3231:62:6::1;19085:341:16::0;3231:62:6::1;-1:-1:-1::0;3304:12:6::1;::::0;3327:166:::1;3347:21:::0;;::::1;3327:166;;;3394:9;3389:94;3413:8;;3422:1;3413:11;;;;;;;:::i;:::-;;;;;;;3409:1;:15;3389:94;;;3449:19;3454:10;;3465:1;3454:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3449:4;:19::i;:::-;3426:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3389:94;;;-1:-1:-1::0;3370:3:6;::::1;::::0;::::1;:::i;:::-;;;;3327:166;;;;3022:477;2929:570:::0;;;;:::o;8290:129::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8365:10:6::1;:3;8371:4:::0;;8365:10:::1;:::i;:::-;;8390:22;;;;;19633:2:16::0;19615:21;;;19672:1;19652:18;;;19645:29;19710:5;19705:2;19690:18;;19683:33;19748:2;19733:18;;19431:326;5287:320:5;5456:41;719:10:1;5489:7:5;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:5;;14281:2:16;5448:103:5;;;14263:21:16;14320:2;14300:18;;;14293:30;14359:34;14339:18;;;14332:62;14430:19;14410:18;;;14403:47;14467:19;;5448:103:5;14079:413:16;5448:103:5;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;6664:250:6:-;6756:8;;6736:4;;6756:8;;;;;6752:51;;;-1:-1:-1;6787:5:6;;6664:250;-1:-1:-1;6664:250:6:o;6752:51::-;6817:8;;;;6813:50;;;-1:-1:-1;6848:4:6;;6664:250;-1:-1:-1;6664:250:6:o;6813:50::-;6880:27;6896:10;6880:15;:27::i;2442:259::-;7144:4:5;7167:16;;;:7;:16;;;;;;2516:13:6;;7167:30:5;:16;2541:38:6;;;;-1:-1:-1;;;2541:38:6;;15621:2:16;2541:38:6;;;15603:21:16;15660:1;15640:18;;;15633:29;15698:10;15678:18;;;15671:38;15726:18;;2541:38:6;15419:331:16;2541:38:6;2626:1;2603:12;2597:26;;;;;:::i;:::-;;;:30;:97;;;;;;;;;;;;;;;;;2654:12;2668:19;:8;:17;:19::i;:::-;2637:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2590:104;2442:259;-1:-1:-1;;2442:259:6:o;8490:137::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8567:14:6;;::::1;::::0;:5:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;8596:24;;;;;21564:2:16::0;21546:21;;;21603:1;21583:18;;;21576:29;21641:7;21636:2;21621:18;;21614:35;21681:2;21666:18;;21362:328;10776:342:6;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;11028:20:6::1;:29:::0;;;::::1;;::::0;::::1;;::::0;;11072:39:::1;::::0;;21897:2:16;21879:21;;;21916:18;;21909:30;;;;21975:22;21955:18;;;21948:50;11072:39:6::1;::::0;22030:2:16;22015:18;11072:39:6::1;21695:344:16::0;666:26:6;;;;;;;:::i;6461:148::-;6530:8;;6510:4;;6530:8;;;;;6526:51;;;-1:-1:-1;6561:5:6;;6461:148::o;6526:51::-;-1:-1:-1;6594:8:6;;;;;6461:148::o;2050:619:12:-;2190:23;;719:10:1;2150:26:12;;;;:12;:26;;;;;;:36;;2179:7;;2150:36;:::i;:::-;:63;;2142:86;;;;-1:-1:-1;;;2142:86:12;;22246:2:16;2142:86:12;;;22228:21:16;22285:2;22265:18;;;22258:30;22324:12;22304:18;;;22297:40;22354:18;;2142:86:12;22044:334:16;2142:86:12;2271:9;;2260:7;2246:11;:9;:11::i;:::-;:21;;;;:::i;:::-;:34;;2238:64;;;;-1:-1:-1;;;2238:64:12;;19287:2:16;2238:64:12;;;19269:21:16;19326:2;19306:18;;;19299:30;19365:19;19345:18;;;19338:47;19402:18;;2238:64:12;19085:341:16;2238:64:12;2321:8;;;;2320:9;2312:31;;;;-1:-1:-1;;;2312:31:12;;22585:2:16;2312:31:12;;;22567:21:16;22624:1;22604:18;;;22597:29;22662:11;22642:18;;;22635:39;22691:18;;2312:31:12;22383:332:16;2312:31:12;2362:8;;;;;;;2361:9;2353:31;;;;-1:-1:-1;;;2353:31:12;;22922:2:16;2353:31:12;;;22904:21:16;22961:1;22941:18;;;22934:29;22999:11;22979:18;;;22972:39;23028:18;;2353:31:12;22720:332:16;2353:31:12;2402:27;2418:10;2402:15;:27::i;:::-;2394:57;;;;-1:-1:-1;;;2394:57:12;;23259:2:16;2394:57:12;;;23241:21:16;23298:2;23278:18;;;23271:30;23337:19;23317:18;;;23310:47;23374:18;;2394:57:12;23057:341:16;2394:57:12;2495:9;2484:7;2469:12;;:22;;;;:::i;:::-;:35;2461:63;;;;-1:-1:-1;;;2461:63:12;;23838:2:16;2461:63:12;;;23820:21:16;23877:2;23857:18;;;23850:30;23916:17;23896:18;;;23889:45;23951:18;;2461:63:12;23636:339:16;2461:63:12;719:10:1;2535:26:12;;;;:12;:26;;;;;:37;;2565:7;;2535:26;:37;;2565:7;;2535:37;:::i;:::-;;;;-1:-1:-1;2587:9:12;;-1:-1:-1;2582:81:12;2606:7;2602:1;:11;2582:81;;;2634:18;719:10:1;3449:4:6::1;:19::i;2634:18:12:-:0;2615:3;;;;:::i;:::-;;;;2582:81;;1520:456;1606:27;;1595:7;:38;;1587:63;;;;-1:-1:-1;;;1587:63:12;;24182:2:16;1587:63:12;;;24164:21:16;24221:2;24201:18;;;24194:30;24260:14;24240:18;;;24233:42;24292:18;;1587:63:12;23980:336:16;1587:63:12;1693:9;;1682:7;1668:11;:9;:11::i;:::-;:21;;;;:::i;:::-;:34;;1660:64;;;;-1:-1:-1;;;1660:64:12;;19287:2:16;1660:64:12;;;19269:21:16;19326:2;19306:18;;;19299:30;19365:19;19345:18;;;19338:47;19402:18;;1660:64:12;19085:341:16;1660:64:12;1743:8;;;;;;;1742:9;1734:31;;;;-1:-1:-1;;;1734:31:12;;22922:2:16;1734:31:12;;;22904:21:16;22961:1;22941:18;;;22934:29;22999:11;22979:18;;;22972:39;23028:18;;1734:31:12;22720:332:16;1734:31:12;1783:8;;;;1775:31;;;;-1:-1:-1;;;1775:31:12;;24523:2:16;1775:31:12;;;24505:21:16;24562:2;24542:18;;;24535:30;24601:12;24581:18;;;24574:40;24631:18;;1775:31:12;24321:334:16;1775:31:12;1849:9;1838:7;1824:11;;:21;;;;:::i;:::-;:34;1816:62;;;;-1:-1:-1;;;1816:62:12;;23838:2:16;1816:62:12;;;23820:21:16;23877:2;23857:18;;;23850:30;23916:17;23896:18;;;23889:45;23951:18;;1816:62:12;23636:339:16;1816:62:12;1894:9;1889:81;1913:7;1909:1;:11;1889:81;;;1941:18;719:10:1;3449:4:6::1;:19::i;1941:18:12:-:0;1922:3;;;;:::i;:::-;;;;1889:81;;8899:166:6;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8984:12:6::1;:28:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;9027:31:::1;::::0;::::1;::::0;::::1;::::0;24862:2:16;24844:21;;;24901:2;24881:18;;;24874:30;24940:14;24935:2;24920:18;;24913:42;24987:2;24972:18;;24660:336;11208:426:6;11327:20;;11307:4;;11327:34;:20;:34;11323:246;;11422:20;;11469:30;;;;;11422:20;1979:55:16;;;11469:30:6;;;1961:74:16;11422:20:6;;;;11461:52;;;11422:20;;11469:22;;1934:18:16;;11469:30:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11461:52;;;11457:102;;;11540:4;11533:11;;;;;11457:102;11363:206;11323:246;4542:25:5;;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;11586:41:6;11579:48;11208:426;-1:-1:-1;;;11208:426:6:o;1911:198:13:-;1075:7;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;1999:22:::1;::::0;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:13;;25488:2:16;1991:73:13::1;::::0;::::1;25470:21:16::0;25527:2;25507:18;;;25500:30;25566:34;25546:18;;;25539:62;25637:8;25617:18;;;25610:36;25663:19;;1991:73:13::1;25286:402:16::0;1991:73:13::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;10238:235:6:-;1263:17;;10335:4;;1263:31;:17;1255:58;;;;-1:-1:-1;;;1255:58:6;;13252:2:16;1255:58:6;;;13234:21:16;13291:2;13271:18;;;13264:30;13330:16;13310:18;;;13303:44;13364:18;;1255:58:6;13050:338:16;1255:58:6;1331:17;;:33;:17;719:10:1;1331:33:6;1323:57;;;;-1:-1:-1;;;1323:57:6;;13595:2:16;1323:57:6;;;13577:21:16;13634:2;13614:18;;;13607:30;13673:13;13653:18;;;13646:41;13704:18;;1323:57:6;13393:335:16;1323:57:6;10370:21:::1;10359:7;:32;;10351:63;;;::::0;-1:-1:-1;;;10351:63:6;;25895:2:16;10351:63:6::1;::::0;::::1;25877:21:16::0;25934:2;25914:18;;;25907:30;25973:20;25953:18;;;25946:48;26011:18;;10351:63:6::1;25693:342:16::0;10351:63:6::1;10424:21;::::0;:12:::1;::::0;::::1;::::0;:21;::::1;;;::::0;10437:7;;10424:21:::1;::::0;;;10437:7;10424:12;:21;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;10462:4:6::1;::::0;10238:235;-1:-1:-1;;;10238:235:6:o;7244:139::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7316:8:6::1;:18:::0;;;::::1;;::::0;;;::::1;;::::0;;7349:27:::1;::::0;::::1;::::0;::::1;::::0;26242:2:16;26224:21;;;26281:1;26261:18;;;26254:29;26319:10;26314:2;26299:18;;26292:38;26362:2;26347:18;;26040:331;1490:300:5;1592:4;1627:40;;;1642:25;1627:40;;:104;;-1:-1:-1;1683:48:5;;;1698:33;1683:48;1627:104;:156;;;-1:-1:-1;952:25:4;937:40;;;;1747:36:5;829:155:4;10930:171:5;11004:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;11057:23;11004:24;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;7362:344::-;7455:4;7167:16;;;:7;:16;;;;;;:30;:16;7471:73;;;;-1:-1:-1;;;7471:73:5;;26578:2:16;7471:73:5;;;26560:21:16;26617:2;26597:18;;;26590:30;26656:34;26636:18;;;26629:62;26727:14;26707:18;;;26700:42;26759:19;;7471:73:5;26376:408:16;7471:73:5;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7603:96;7362:344;-1:-1:-1;;;;7362:344:5:o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;-1:-1:-1;;;10378:85:5;;26991:2:16;10378:85:5;;;26973:21:16;27030:2;27010:18;;;27003:30;27069:34;27049:18;;;27042:62;27140:11;27120:18;;;27113:39;27169:19;;10378:85:5;26789:405:16;10378:85:5;10481:16;;;10473:65;;;;-1:-1:-1;;;10473:65:5;;27401:2:16;10473:65:5;;;27383:21:16;27440:2;27420:18;;;27413:30;27479:34;27459:18;;;27452:62;27550:6;27530:18;;;27523:34;27574:19;;10473:65:5;27199:400:16;10473:65:5;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10690:15;;;;;;;:9;:15;;;;;:20;;10709:1;;10690:15;:20;;10709:1;;10690:20;:::i;:::-;;;;-1:-1:-1;;10720:13:5;;;;;;;:9;:13;;;;;:18;;10737:1;;10720:13;:18;;10737:1;;10720:18;:::i;:::-;;;;-1:-1:-1;;10748:16:5;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;10785:27;;10748:16;;10785:27;;;;;;;10259:560;;;:::o;3451:96:14:-;3509:7;3535:5;3539:1;3535;:5;:::i;3836:96::-;3894:7;3920:5;3924:1;3920;:5;:::i;2263:187:13:-;2336:16;2355:6;;;2371:17;;;;;;;;;;2403:40;;2355:6;;;;;;;2403:40;;2336:16;2403:40;2326:124;2263:187;:::o;11236:307:5:-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;-1:-1:-1;;;11369:55:5;;28250:2:16;11369:55:5;;;28232:21:16;28289:2;28269:18;;;28262:30;28328:27;28308:18;;;28301:55;28373:18;;11369:55:5;28048:349:16;11369:55:5;11434:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;11495:41;;768::16;;;11495::5;;741:18:16;11495:41:5;;;;;;;11236:307;;;:::o;2757:129:6:-;2803:40;2813:3;2818:24;:14;918::2;;827:112;2818:24:6;2803:9;:40::i;:::-;2853:26;:14;1032:19:2;;1050:1;1032:19;;;945:123;6469:307:5;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:5;;28604:2:16;6658:111:5;;;28586:21:16;28643:2;28623:18;;;28616:30;28682:34;28662:18;;;28655:62;28753:20;28733:18;;;28726:48;28791:19;;6658:111:5;28402:414:16;9167:285:6;9262:4;;9328:3;9333:5;719:10:1;9311:42:6;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;9301:53;;9311:42;9301:53;;;;9433:12;;9301:53;;-1:-1:-1;9433:12:6;;9372:57;9418:10;9372:37;9301:53;8238:58:3;;30409:66:16;8238:58:3;;;30397:79:16;30492:12;;;30485:28;;;8108:7:3;;30529:12:16;;8238:58:3;;;;;;;;;;;;8228:69;;;;;;8221:76;;8039:265;;;;9372:37:6;:45;;:57::i;:::-;:73;;;;9167:285;-1:-1:-1;;;9167:285:6:o;328:703:15:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:15;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:15;;-1:-1:-1;773:2:15;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:15;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:15;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:15;981:2;972:11;;:::i;:::-;;;844:150;;8036:108:5;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;12096:778::-;12246:4;12266:13;;;1087:20:0;1133:8;12262:606:5;;12301:72;;;;;:36;;;;;;:72;;719:10:1;;12352:4:5;;12358:7;;12367:5;;12301:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12301:72:5;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12540:13:5;;12536:266;;12582:60;;-1:-1:-1;;;12582:60:5;;28604:2:16;12582:60:5;;;28586:21:16;28643:2;28623:18;;;28616:30;28682:34;28662:18;;;28655:62;28753:20;28733:18;;;28726:48;28791:19;;12582:60:5;28402:414:16;12536:266:5;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12423:51;;12433:41;12423:51;;-1:-1:-1;12416:58:5;;12262:606;-1:-1:-1;12853:4:5;12096:778;;;;;;:::o;4292:227:3:-;4370:7;4390:17;4409:18;4431:27;4442:4;4448:9;4431:10;:27::i;:::-;4389:69;;;;4468:18;4480:5;4468:11;:18::i;:::-;-1:-1:-1;4503:9:3;4292:227;-1:-1:-1;;;4292:227:3:o;8365:311:5:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;-1:-1:-1;;;8518:151:5;;28604:2:16;8518:151:5;;;28586:21:16;28643:2;28623:18;;;28616:30;28682:34;28662:18;;;28655:62;28753:20;28733:18;;;28726:48;28791:19;;8518:151:5;28402:414:16;2227:1279:3;2308:7;2317:12;2538:9;:16;2558:2;2538:22;2534:966;;;2827:4;2812:20;;2806:27;2876:4;2861:20;;2855:27;2933:4;2918:20;;2912:27;2576:9;2904:36;2974:25;2985:4;2904:36;2806:27;2855;2974:10;:25::i;:::-;2967:32;;;;;;;;;2534:966;3020:9;:16;3040:2;3020:22;3016:484;;;3289:4;3274:20;;3268:27;3339:4;3324:20;;3318:27;3379:23;3390:4;3268:27;3318;3379:10;:23::i;:::-;3372:30;;;;;;;;3016:484;-1:-1:-1;3449:1:3;;-1:-1:-1;3453:35:3;3433:56;;532:631;609:20;600:5;:29;;;;;;;;:::i;:::-;;596:561;;;532:631;:::o;596:561::-;705:29;696:5;:38;;;;;;;;:::i;:::-;;692:465;;;750:34;;-1:-1:-1;;;750:34:3;;30943:2:16;750:34:3;;;30925:21:16;30982:2;30962:18;;;30955:30;31021:26;31001:18;;;30994:54;31065:18;;750:34:3;30741:348:16;692:465:3;814:35;805:5;:44;;;;;;;;:::i;:::-;;801:356;;;865:41;;-1:-1:-1;;;865:41:3;;31296:2:16;865:41:3;;;31278:21:16;31335:2;31315:18;;;31308:30;31374:33;31354:18;;;31347:61;31425:18;;865:41:3;31094:355:16;801:356:3;936:30;927:5;:39;;;;;;;;:::i;:::-;;923:234;;;982:44;;-1:-1:-1;;;982:44:3;;31656:2:16;982:44:3;;;31638:21:16;31695:2;31675:18;;;31668:30;31734:34;31714:18;;;31707:62;31805:4;31785:18;;;31778:32;31827:19;;982:44:3;31454:398:16;923:234:3;1056:30;1047:5;:39;;;;;;;;:::i;:::-;;1043:114;;;1102:44;;-1:-1:-1;;;1102:44:3;;32059:2:16;1102:44:3;;;32041:21:16;32098:2;32078:18;;;32071:30;32137:34;32117:18;;;32110:62;32208:4;32188:18;;;32181:32;32230:19;;1102:44:3;31857:398:16;8998:372:5;9077:16;;;9069:61;;;;-1:-1:-1;;;9069:61:5;;32462:2:16;9069:61:5;;;32444:21:16;;;32481:18;;;32474:30;32540:34;32520:18;;;32513:62;32592:18;;9069:61:5;32260:356:16;9069:61:5;7144:4;7167:16;;;:7;:16;;;;;;:30;:16;:30;9140:58;;;;-1:-1:-1;;;9140:58:5;;32823:2:16;9140:58:5;;;32805:21:16;32862:2;32842:18;;;32835:30;32901;32881:18;;;32874:58;32949:18;;9140:58:5;32621:352:16;9140:58:5;9265:13;;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:5;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;8998:372;;:::o;5743:1603:3:-;5869:7;;6793:66;6780:79;;6776:161;;;-1:-1:-1;6891:1:3;;-1:-1:-1;6895:30:3;6875:51;;6776:161;6950:1;:7;;6955:2;6950:7;;:18;;;;;6961:1;:7;;6966:2;6961:7;;6950:18;6946:100;;;-1:-1:-1;7000:1:3;;-1:-1:-1;7004:30:3;6984:51;;6946:100;7157:24;;;7140:14;7157:24;;;;;;;;;33205:25:16;;;33278:4;33266:17;;33246:18;;;33239:45;;;;33300:18;;;33293:34;;;33343:18;;;33336:34;;;7157:24:3;;33177:19:16;;7157:24:3;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7157:24:3;;;;;;-1:-1:-1;;7195:20:3;;;7191:101;;7247:1;7251:29;7231:50;;;;;;;7191:101;7310:6;-1:-1:-1;7318:20:3;;-1:-1:-1;5743:1603:3;;;;;;;;:::o;4773:379::-;4883:7;;4988:66;4980:75;;5081:3;5077:12;;;5091:2;5073:21;5120:25;5131:4;5073:21;5140:1;4980:75;5120:10;:25::i;:::-;5113:32;;;;;;4773:379;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:177:16;281:66;274:5;270:78;263:5;260:89;250:117;;363:1;360;353:12;378:245;436:6;489:2;477:9;468:7;464:23;460:32;457:52;;;505:1;502;495:12;457:52;544:9;531:23;563:30;587:5;563:30;:::i;820:180::-;879:6;932:2;920:9;911:7;907:23;903:32;900:52;;;948:1;945;938:12;900:52;-1:-1:-1;971:23:16;;820:180;-1:-1:-1;820:180:16:o;1005:258::-;1077:1;1087:113;1101:6;1098:1;1095:13;1087:113;;;1177:11;;;1171:18;1158:11;;;1151:39;1123:2;1116:10;1087:113;;;1218:6;1215:1;1212:13;1209:48;;;-1:-1:-1;;1253:1:16;1235:16;;1228:27;1005:258::o;1268:317::-;1310:3;1348:5;1342:12;1375:6;1370:3;1363:19;1391:63;1447:6;1440:4;1435:3;1431:14;1424:4;1417:5;1413:16;1391:63;:::i;:::-;1499:2;1487:15;1504:66;1483:88;1474:98;;;;1574:4;1470:109;;1268:317;-1:-1:-1;;1268:317:16:o;1590:220::-;1739:2;1728:9;1721:21;1702:4;1759:45;1800:2;1789:9;1785:18;1777:6;1759:45;:::i;2046:154::-;2132:42;2125:5;2121:54;2114:5;2111:65;2101:93;;2190:1;2187;2180:12;2205:315;2273:6;2281;2334:2;2322:9;2313:7;2309:23;2305:32;2302:52;;;2350:1;2347;2340:12;2302:52;2389:9;2376:23;2408:31;2433:5;2408:31;:::i;:::-;2458:5;2510:2;2495:18;;;;2482:32;;-1:-1:-1;;;2205:315:16:o;2525:247::-;2584:6;2637:2;2625:9;2616:7;2612:23;2608:32;2605:52;;;2653:1;2650;2643:12;2605:52;2692:9;2679:23;2711:31;2736:5;2711:31;:::i;2777:456::-;2854:6;2862;2870;2923:2;2911:9;2902:7;2898:23;2894:32;2891:52;;;2939:1;2936;2929:12;2891:52;2978:9;2965:23;2997:31;3022:5;2997:31;:::i;:::-;3047:5;-1:-1:-1;3104:2:16;3089:18;;3076:32;3117:33;3076:32;3117:33;:::i;:::-;2777:456;;3169:7;;-1:-1:-1;;;3223:2:16;3208:18;;;;3195:32;;2777:456::o;3238:367::-;3301:8;3311:6;3365:3;3358:4;3350:6;3346:17;3342:27;3332:55;;3383:1;3380;3373:12;3332:55;-1:-1:-1;3406:20:16;;3449:18;3438:30;;3435:50;;;3481:1;3478;3471:12;3435:50;3518:4;3510:6;3506:17;3494:29;;3578:3;3571:4;3561:6;3558:1;3554:14;3546:6;3542:27;3538:38;3535:47;3532:67;;;3595:1;3592;3585:12;3610:773;3732:6;3740;3748;3756;3809:2;3797:9;3788:7;3784:23;3780:32;3777:52;;;3825:1;3822;3815:12;3777:52;3865:9;3852:23;3894:18;3935:2;3927:6;3924:14;3921:34;;;3951:1;3948;3941:12;3921:34;3990:70;4052:7;4043:6;4032:9;4028:22;3990:70;:::i;:::-;4079:8;;-1:-1:-1;3964:96:16;-1:-1:-1;4167:2:16;4152:18;;4139:32;;-1:-1:-1;4183:16:16;;;4180:36;;;4212:1;4209;4202:12;4180:36;;4251:72;4315:7;4304:8;4293:9;4289:24;4251:72;:::i;:::-;3610:773;;;;-1:-1:-1;4342:8:16;-1:-1:-1;;;;3610:773:16:o;4388:248::-;4456:6;4464;4517:2;4505:9;4496:7;4492:23;4488:32;4485:52;;;4533:1;4530;4523:12;4485:52;-1:-1:-1;;4556:23:16;;;4626:2;4611:18;;;4598:32;;-1:-1:-1;4388:248:16:o;4943:160::-;5008:20;;5064:13;;5057:21;5047:32;;5037:60;;5093:1;5090;5083:12;5037:60;4943:160;;;:::o;5108:180::-;5164:6;5217:2;5205:9;5196:7;5192:23;5188:32;5185:52;;;5233:1;5230;5223:12;5185:52;5256:26;5272:9;5256:26;:::i;5293:592::-;5364:6;5372;5425:2;5413:9;5404:7;5400:23;5396:32;5393:52;;;5441:1;5438;5431:12;5393:52;5481:9;5468:23;5510:18;5551:2;5543:6;5540:14;5537:34;;;5567:1;5564;5557:12;5537:34;5605:6;5594:9;5590:22;5580:32;;5650:7;5643:4;5639:2;5635:13;5631:27;5621:55;;5672:1;5669;5662:12;5621:55;5712:2;5699:16;5738:2;5730:6;5727:14;5724:34;;;5754:1;5751;5744:12;5724:34;5799:7;5794:2;5785:6;5781:2;5777:15;5773:24;5770:37;5767:57;;;5820:1;5817;5810:12;5767:57;5851:2;5843:11;;;;;5873:6;;-1:-1:-1;5293:592:16;;-1:-1:-1;;;;5293:592:16:o;5890:315::-;5955:6;5963;6016:2;6004:9;5995:7;5991:23;5987:32;5984:52;;;6032:1;6029;6022:12;5984:52;6071:9;6058:23;6090:31;6115:5;6090:31;:::i;:::-;6140:5;-1:-1:-1;6164:35:16;6195:2;6180:18;;6164:35;:::i;:::-;6154:45;;5890:315;;;;;:::o;6988:184::-;7040:77;7037:1;7030:88;7137:4;7134:1;7127:15;7161:4;7158:1;7151:15;7177:690;7241:5;7271:18;7312:2;7304:6;7301:14;7298:40;;;7318:18;;:::i;:::-;7452:2;7446:9;7518:2;7506:15;;7357:66;7502:24;;;7528:2;7498:33;7494:42;7482:55;;;7552:18;;;7572:22;;;7549:46;7546:72;;;7598:18;;:::i;:::-;7638:10;7634:2;7627:22;7667:6;7658:15;;7697:6;7689;7682:22;7737:3;7728:6;7723:3;7719:16;7716:25;7713:45;;;7754:1;7751;7744:12;7713:45;7804:6;7799:3;7792:4;7784:6;7780:17;7767:44;7859:1;7852:4;7843:6;7835;7831:19;7827:30;7820:41;;;;7177:690;;;;;:::o;7872:220::-;7914:5;7967:3;7960:4;7952:6;7948:17;7944:27;7934:55;;7985:1;7982;7975:12;7934:55;8007:79;8082:3;8073:6;8060:20;8053:4;8045:6;8041:17;8007:79;:::i;8097:665::-;8192:6;8200;8208;8216;8269:3;8257:9;8248:7;8244:23;8240:33;8237:53;;;8286:1;8283;8276:12;8237:53;8325:9;8312:23;8344:31;8369:5;8344:31;:::i;:::-;8394:5;-1:-1:-1;8451:2:16;8436:18;;8423:32;8464:33;8423:32;8464:33;:::i;:::-;8516:7;-1:-1:-1;8570:2:16;8555:18;;8542:32;;-1:-1:-1;8625:2:16;8610:18;;8597:32;8652:18;8641:30;;8638:50;;;8684:1;8681;8674:12;8638:50;8707:49;8748:7;8739:6;8728:9;8724:22;8707:49;:::i;:::-;8697:59;;;8097:665;;;;;;;:::o;8767:320::-;8835:6;8888:2;8876:9;8867:7;8863:23;8859:32;8856:52;;;8904:1;8901;8894:12;8856:52;8944:9;8931:23;8977:18;8969:6;8966:30;8963:50;;;9009:1;9006;8999:12;8963:50;9032:49;9073:7;9064:6;9053:9;9049:22;9032:49;:::i;9092:450::-;9161:6;9214:2;9202:9;9193:7;9189:23;9185:32;9182:52;;;9230:1;9227;9220:12;9182:52;9270:9;9257:23;9303:18;9295:6;9292:30;9289:50;;;9335:1;9332;9325:12;9289:50;9358:22;;9411:4;9403:13;;9399:27;-1:-1:-1;9389:55:16;;9440:1;9437;9430:12;9389:55;9463:73;9528:7;9523:2;9510:16;9505:2;9501;9497:11;9463:73;:::i;9547:388::-;9624:6;9632;9685:2;9673:9;9664:7;9660:23;9656:32;9653:52;;;9701:1;9698;9691:12;9653:52;9737:9;9724:23;9714:33;;9798:2;9787:9;9783:18;9770:32;9825:18;9817:6;9814:30;9811:50;;;9857:1;9854;9847:12;9811:50;9880:49;9921:7;9912:6;9901:9;9897:22;9880:49;:::i;:::-;9870:59;;;9547:388;;;;;:::o;9940:::-;10008:6;10016;10069:2;10057:9;10048:7;10044:23;10040:32;10037:52;;;10085:1;10082;10075:12;10037:52;10124:9;10111:23;10143:31;10168:5;10143:31;:::i;:::-;10193:5;-1:-1:-1;10250:2:16;10235:18;;10222:32;10263:33;10222:32;10263:33;:::i;:::-;10315:7;10305:17;;;9940:388;;;;;:::o;10661:437::-;10740:1;10736:12;;;;10783;;;10804:61;;10858:4;10850:6;10846:17;10836:27;;10804:61;10911:2;10903:6;10900:14;10880:18;10877:38;10874:218;;;10948:77;10945:1;10938:88;11049:4;11046:1;11039:15;11077:4;11074:1;11067:15;10874:218;;10661:437;;;:::o;14841:184::-;14893:77;14890:1;14883:88;14990:4;14987:1;14980:15;15014:4;15011:1;15004:15;15030:184;15082:77;15079:1;15072:88;15179:4;15176:1;15169:15;15203:4;15200:1;15193:15;15219:195;15258:3;15289:66;15282:5;15279:77;15276:103;;;15359:18;;:::i;:::-;-1:-1:-1;15406:1:16;15395:13;;15219:195::o;16441:128::-;16481:3;16512:1;16508:6;16505:1;16502:13;16499:39;;;16518:18;;:::i;:::-;-1:-1:-1;16554:9:16;;16441:128::o;19888:1088::-;19973:12;;19938:3;;20028:1;20048:18;;;;20101;;;;20128:61;;20182:4;20174:6;20170:17;20160:27;;20128:61;20208:2;20256;20248:6;20245:14;20225:18;20222:38;20219:218;;;20293:77;20290:1;20283:88;20394:4;20391:1;20384:15;20422:4;20419:1;20412:15;20219:218;20453:18;20480:162;;;;20656:1;20651:319;;;;20446:524;;20480:162;20528:66;20517:9;20513:82;20508:3;20501:95;20625:6;20620:3;20616:16;20609:23;;20480:162;;20651:319;19835:1;19828:14;;;19872:4;19859:18;;20745:1;20759:165;20773:6;20770:1;20767:13;20759:165;;;20851:14;;20838:11;;;20831:35;20894:16;;;;20788:10;;20759:165;;;20763:3;;20953:6;20948:3;20944:16;20937:23;;20446:524;;;;;;;19888:1088;;;;:::o;20981:376::-;21157:3;21185:38;21219:3;21211:6;21185:38;:::i;:::-;21252:6;21246:13;21268:52;21313:6;21309:2;21302:4;21294:6;21290:17;21268:52;:::i;:::-;21336:15;;20981:376;-1:-1:-1;;;;20981:376:16:o;23403:228::-;23443:7;23569:1;23501:66;23497:74;23494:1;23491:81;23486:1;23479:9;23472:17;23468:105;23465:131;;;23576:18;;:::i;:::-;-1:-1:-1;23616:9:16;;23403:228::o;25001:280::-;25100:6;25153:2;25141:9;25132:7;25128:23;25124:32;25121:52;;;25169:1;25166;25159:12;25121:52;25201:9;25195:16;25220:31;25245:5;25220:31;:::i;27604:125::-;27644:4;27672:1;27669;27666:8;27663:34;;;27677:18;;:::i;:::-;-1:-1:-1;27714:9:16;;27604:125::o;27734:184::-;27786:77;27783:1;27776:88;27883:4;27880:1;27873:15;27907:4;27904:1;27897:15;27923:120;27963:1;27989;27979:35;;27994:18;;:::i;:::-;-1:-1:-1;28028:9:16;;27923:120::o;28821:453::-;29022:3;29053:73;29087:38;29121:3;29113:6;29087:38;:::i;:::-;29079:6;29053:73;:::i;:::-;29157:2;29153:15;;;;29170:66;29149:88;29135:103;;-1:-1:-1;;29265:2:16;29254:14;;28821:453;-1:-1:-1;;28821:453:16:o;29279:112::-;29311:1;29337;29327:35;;29342:18;;:::i;:::-;-1:-1:-1;29376:9:16;;29279:112::o;29396:512::-;29590:4;29619:42;29700:2;29692:6;29688:15;29677:9;29670:34;29752:2;29744:6;29740:15;29735:2;29724:9;29720:18;29713:43;;29792:6;29787:2;29776:9;29772:18;29765:34;29835:3;29830:2;29819:9;29815:18;29808:31;29856:46;29897:3;29886:9;29882:19;29874:6;29856:46;:::i;:::-;29848:54;29396:512;-1:-1:-1;;;;;;29396:512:16:o;29913:249::-;29982:6;30035:2;30023:9;30014:7;30010:23;30006:32;30003:52;;;30051:1;30048;30041:12;30003:52;30083:9;30077:16;30102:30;30126:5;30102:30;:::i;30552:184::-;30604:77;30601:1;30594:88;30701:4;30698:1;30691:15;30725:4;30722:1;30715:15

Swarm Source

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