ETH Price: $3,163.21 (-8.86%)
Gas: 4 Gwei

Token

Suntur - 8760 hours (1B1ST1)
 

Overview

Max Total Supply

1,329 1B1ST1

Holders

607

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
0x0789.eth
0x8d160063e641252f4b424a9af89e88b24e04e444
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Collection

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (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);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @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, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: Collection.sol

//SPDX-License-Identifier: Unlicense
pragma solidity 0.8.10;






contract Collection is ERC1155, Ownable, PaymentSplitter, EIP712 {
    string private constant SIGNING_DOMAIN = "LazyNFT-Voucher";
    string private constant SIGNATURE_VERSION = "1";

    string public name;
    string public symbol;
    uint256 public maxSupply;
    uint256 public totalSupply;

    uint256 private startingAt;
    uint256 private initialPrice;

    // Mapping from token ID to copies
    mapping(uint256 => uint256) private copiesOf;

    // Mapping from token ID to initial price
    mapping(uint256 => uint256) private price;

    struct NFTVoucher {
        uint256 tokenId;
        uint256 maxSupply;
        string uri;
        bytes signature;
    }

    event NFTMinted(address, address, uint256, string);
    event NFTTransfered(address, address, uint256);

    constructor(
        uint256 _startingAt,
        uint256 _maxSupply,
        uint256 _initialPrice,
        string memory _uri,
        string memory _name,
        string memory _symbol,
        address _artist,
        address[] memory _payees,
        uint256[] memory _shares
    ) payable ERC1155(_uri) PaymentSplitter(_payees, _shares) EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION) {
        name = _name;
        symbol = _symbol;
        maxSupply = _maxSupply;
        startingAt = _startingAt;
        initialPrice = _initialPrice;

        transferOwnership(_artist);
    }

    function mint(address _redeemer, NFTVoucher calldata _voucher) public payable {
        require(startingAt < block.timestamp, "Not started");
        require(copiesOf[_voucher.tokenId] < 1, "Already minted");

        // make sure signature is valid and get the address of the signer
        address signer = _verify(_voucher);

        // make sure that the signer is authorized to mint NFTs
        require(signer == owner(), "Signature invalid or unauthorized");

        // make sure that the redeemer is paying enough to cover the buyer's cost
        require(msg.value >= initialPrice, "Insufficient funds to mint");

        copiesOf[_voucher.tokenId] = 1;
        totalSupply = totalSupply + 1;

        // first assign the token to the signer, to establish provenance on-chain
        _mint(signer, _voucher.tokenId, 0, "");

        // transfer the token to the redeemer
        _mint(_redeemer, _voucher.tokenId, 1, "");

        emit NFTMinted(signer, _redeemer, _voucher.tokenId, _voucher.uri);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public override {
        _safeTransferFrom(from, to, id, amount, data);

        emit NFTTransfered(from, to, id);
    }

    function _verify(NFTVoucher calldata voucher) private view returns (address) {
        bytes32 digest = _hash(voucher);
        return ECDSA.recover(digest, voucher.signature);
    }

    function _hash(NFTVoucher calldata voucher) private view returns (bytes32) {
        return
            _hashTypedDataV4(
                keccak256(
                    abi.encode(
                        keccak256("NFTVoucher(uint256 tokenId,uint256 maxSupply,string uri)"),
                        voucher.tokenId,
                        voucher.maxSupply,
                        keccak256(bytes(voucher.uri))
                    )
                )
            );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_startingAt","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_initialPrice","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_artist","type":"address"},{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"string","name":"","type":"string"}],"name":"NFTMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"NFTTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_redeemer","type":"address"},{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct Collection.NFTVoucher","name":"_voucher","type":"tuple"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

610140604052604051620038d3380380620038d3833981016040819052620000279162000872565b6040518060400160405280600f81526020016e2630bd3ca7232a16ab37bab1b432b960891b815250604051806040016040528060018152602001603160f81b8152508383896200007d81620002a360201b60201c565b506200008933620002bc565b8051825114620000fb5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b60008251116200014e5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620000f2565b60005b8251811015620001ba57620001a583828151811062000174576200017462000985565b602002602001015183838151811062000191576200019162000985565b60200260200101516200030e60201b60201c565b80620001b181620009b1565b91505062000151565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060c0526101205250508651620002639250600b91506020880190620005cd565b5083516200027990600c906020870190620005cd565b50600d889055600f89905560108790556200029483620004fc565b50505050505050505062000a27565b8051620002b8906002906020840190620005cd565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166200037b5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620000f2565b60008111620003cd5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620000f2565b6001600160a01b03821660009081526006602052604090205415620004495760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620000f2565b60088054600181019091557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0384169081179091556000908152600660205260409020819055600454620004b3908290620009cf565b600455604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6003546001600160a01b03163314620005585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000f2565b6001600160a01b038116620005bf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620000f2565b620005ca81620002bc565b50565b828054620005db90620009ea565b90600052602060002090601f016020900481019282620005ff57600085556200064a565b82601f106200061a57805160ff19168380011785556200064a565b828001600101855582156200064a579182015b828111156200064a5782518255916020019190600101906200062d565b50620006589291506200065c565b5090565b5b808211156200065857600081556001016200065d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620006b457620006b462000673565b604052919050565b600082601f830112620006ce57600080fd5b81516001600160401b03811115620006ea57620006ea62000673565b602062000700601f8301601f1916820162000689565b82815285828487010111156200071557600080fd5b60005b838110156200073557858101830151828201840152820162000718565b83811115620007475760008385840101525b5095945050505050565b80516001600160a01b03811681146200076957600080fd5b919050565b60006001600160401b038211156200078a576200078a62000673565b5060051b60200190565b600082601f830112620007a657600080fd5b81516020620007bf620007b9836200076e565b62000689565b82815260059290921b84018101918181019086841115620007df57600080fd5b8286015b848110156200080557620007f78162000751565b8352918301918301620007e3565b509695505050505050565b600082601f8301126200082257600080fd5b8151602062000835620007b9836200076e565b82815260059290921b840181019181810190868411156200085557600080fd5b8286015b8481101562000805578051835291830191830162000859565b60008060008060008060008060006101208a8c0312156200089257600080fd5b895160208b015160408c015160608d0151929b5090995097506001600160401b0380821115620008c157600080fd5b620008cf8d838e01620006bc565b975060808c0151915080821115620008e657600080fd5b620008f48d838e01620006bc565b965060a08c01519150808211156200090b57600080fd5b620009198d838e01620006bc565b95506200092960c08d0162000751565b945060e08c01519150808211156200094057600080fd5b6200094e8d838e0162000794565b93506101008c01519150808211156200096657600080fd5b50620009758c828d0162000810565b9150509295985092959850929598565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415620009c857620009c86200099b565b5060010190565b60008219821115620009e557620009e56200099b565b500190565b600181811c90821680620009ff57607f821691505b6020821081141562000a2157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051612e5c62000a776000396000612335015260006123840152600061235f015260006122b8015260006122e20152600061230c0152612e5c6000f3fe6080604052600436106101995760003560e01c80638b83209b116100e1578063ce7c2ac21161008a578063e33b7de311610064578063e33b7de3146104f7578063e985e9c51461050c578063f242432a14610555578063f2fde38b1461057557600080fd5b8063ce7c2ac214610475578063d5abeb01146104ab578063d79779b2146104c157600080fd5b80639852595c116100bb5780639852595c1461040c5780639c49365814610442578063a22cb4651461045557600080fd5b80638b83209b146103a15780638da5cb5b146103d957806395d89b41146103f757600080fd5b80632eb2c2d61161014357806348b750441161011d57806348b750441461033f5780634e1273f41461035f578063715018a61461038c57600080fd5b80632eb2c2d6146102c45780633a98ef39146102e4578063406072a9146102f957600080fd5b80630e89341c116101745780630e89341c1461026c57806318160ddd1461028c57806319165587146102a257600080fd5b8062fdd58e146101e757806301ffc9a71461021a57806306fdde031461024a57600080fd5b366101e2577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156101f357600080fd5b50610207610202366004612558565b610595565b6040519081526020015b60405180910390f35b34801561022657600080fd5b5061023a61023536600461259a565b61063e565b6040519015158152602001610211565b34801561025657600080fd5b5061025f610690565b6040516102119190612613565b34801561027857600080fd5b5061025f610287366004612626565b61071e565b34801561029857600080fd5b50610207600e5481565b3480156102ae57600080fd5b506102c26102bd36600461263f565b6107b2565b005b3480156102d057600080fd5b506102c26102df3660046127a8565b610964565b3480156102f057600080fd5b50600454610207565b34801561030557600080fd5b50610207610314366004612856565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b34801561034b57600080fd5b506102c261035a366004612856565b610a06565b34801561036b57600080fd5b5061037f61037a36600461288f565b610c62565b6040516102119190612997565b34801561039857600080fd5b506102c2610da0565b3480156103ad57600080fd5b506103c16103bc366004612626565b610e06565b6040516001600160a01b039091168152602001610211565b3480156103e557600080fd5b506003546001600160a01b03166103c1565b34801561040357600080fd5b5061025f610e36565b34801561041857600080fd5b5061020761042736600461263f565b6001600160a01b031660009081526007602052604090205490565b6102c26104503660046129aa565b610e43565b34801561046157600080fd5b506102c2610470366004612a04565b611075565b34801561048157600080fd5b5061020761049036600461263f565b6001600160a01b031660009081526006602052604090205490565b3480156104b757600080fd5b50610207600d5481565b3480156104cd57600080fd5b506102076104dc36600461263f565b6001600160a01b031660009081526009602052604090205490565b34801561050357600080fd5b50600554610207565b34801561051857600080fd5b5061023a610527366004612856565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561056157600080fd5b506102c2610570366004612a32565b611084565b34801561058157600080fd5b506102c261059036600461263f565b6110e3565b60006001600160a01b0383166106185760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061066f57506001600160e01b031982166303a24d0760e21b145b8061068a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600b805461069d90612a9b565b80601f01602080910402602001604051908101604052809291908181526020018280546106c990612a9b565b80156107165780601f106106eb57610100808354040283529160200191610716565b820191906000526020600020905b8154815290600101906020018083116106f957829003601f168201915b505050505081565b60606002805461072d90612a9b565b80601f016020809104026020016040519081016040528092919081815260200182805461075990612a9b565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b50505050509050919050565b6001600160a01b0381166000908152600660205260409020546108265760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b606482015260840161060f565b600061083160055490565b61083b9047612aec565b905060006108688383610863866001600160a01b031660009081526007602052604090205490565b6111c5565b9050806108cb5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b606482015260840161060f565b6001600160a01b038316600090815260076020526040812080548392906108f3908490612aec565b92505081905550806005600082825461090c9190612aec565b9091555061091c9050838261120d565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a1505050565b6001600160a01b03851633148061098057506109808533610527565b6109f25760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161060f565b6109ff858585858561132b565b5050505050565b6001600160a01b038116600090815260066020526040902054610a7a5760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b606482015260840161060f565b6001600160a01b0382166000908152600960205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb9190612b04565b610b059190612aec565b90506000610b3e838361086387876001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b905080610ba15760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b606482015260840161060f565b6001600160a01b038085166000908152600a6020908152604080832093871683529290529081208054839290610bd8908490612aec565b90915550506001600160a01b03841660009081526009602052604081208054839290610c05908490612aec565b90915550610c16905084848361159e565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60608151835114610cdb5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161060f565b6000835167ffffffffffffffff811115610cf757610cf761265c565b604051908082528060200260200182016040528015610d20578160200160208202803683370190505b50905060005b8451811015610d9857610d6b858281518110610d4457610d44612b1d565b6020026020010151858381518110610d5e57610d5e612b1d565b6020026020010151610595565b828281518110610d7d57610d7d612b1d565b6020908102919091010152610d9181612b33565b9050610d26565b509392505050565b6003546001600160a01b03163314610dfa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161060f565b610e046000611605565b565b600060088281548110610e1b57610e1b612b1d565b6000918252602090912001546001600160a01b031692915050565b600c805461069d90612a9b565b42600f5410610e945760405162461bcd60e51b815260206004820152600b60248201527f4e6f742073746172746564000000000000000000000000000000000000000000604482015260640161060f565b8035600090815260116020526040902054600111610ef45760405162461bcd60e51b815260206004820152600e60248201527f416c7265616479206d696e746564000000000000000000000000000000000000604482015260640161060f565b6000610eff8261166f565b9050610f136003546001600160a01b031690565b6001600160a01b0316816001600160a01b031614610f7d5760405162461bcd60e51b815260206004820152602160248201527f5369676e617475726520696e76616c6964206f7220756e617574686f72697a656044820152601960fa1b606482015260840161060f565b601054341015610fcf5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742066756e647320746f206d696e74000000000000604482015260640161060f565b81356000908152601160205260409020600190819055600e54610ff191612aec565b600e55604080516020810190915260008082526110129183918535916116c8565b6110328383600001356001604051806020016040528060008152506116c8565b7f62e892e3122007df811ddcdf33dc70fd7c6c1d0301fba644e97cbbcdb71c88a9818484356110646040870187612b4e565b604051610957959493929190612b95565b6110803383836117d2565b5050565b61109185858585856118c7565b604080516001600160a01b038088168252861660208201529081018490527fe803da0b7e6c523ad7e47d8266044be56d50f0ca83a550c0605ccbbc6d4168a09060600160405180910390a15050505050565b6003546001600160a01b0316331461113d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161060f565b6001600160a01b0381166111b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161060f565b6111c281611605565b50565b6004546001600160a01b038416600090815260066020526040812054909183916111ef9086612be9565b6111f99190612c08565b6112039190612c2a565b90505b9392505050565b8047101561125d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161060f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146112aa576040519150601f19603f3d011682016040523d82523d6000602084013e6112af565b606091505b50509050806113265760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161060f565b505050565b81518351146113a25760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161060f565b6001600160a01b0384166114065760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161060f565b3360005b845181101561153057600085828151811061142757611427612b1d565b60200260200101519050600085838151811061144557611445612b1d565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114d85760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161060f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611515908490612aec565b925050819055505050508061152990612b33565b905061140a565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611580929190612c41565b60405180910390a4611596818787878787611a65565b505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052611326908490611c0b565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061167b83611cf0565b90506112068161168e6060860186612b4e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d8192505050565b6001600160a01b0384166117285760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161060f565b336117428160008761173988611d9d565b6109ff88611d9d565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611772908490612aec565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46109ff81600087878787611de8565b816001600160a01b0316836001600160a01b0316141561185a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161060f565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661192b5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161060f565b3361193b81878761173988611d9d565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156119bf5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161060f565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906119fc908490612aec565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611a5c828888888888611de8565b50505050505050565b6001600160a01b0384163b156115965760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611aa99089908990889088908890600401612c6f565b6020604051808303816000875af1925050508015611ae4575060408051601f3d908101601f19168201909252611ae191810190612ccd565b60015b611b9a57611af0612cea565b806308c379a01415611b2a5750611b05612d05565b80611b105750611b2c565b8060405162461bcd60e51b815260040161060f9190612613565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161060f565b6001600160e01b0319811663bc197c8160e01b14611a5c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161060f565b6000611c60826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ee49092919063ffffffff16565b8051909150156113265780806020019051810190611c7e9190612d8f565b6113265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161060f565b600061068a7f489a4f9a9e1d28d4c3fc6c2da36171eb868361a1a7fdb3abb1030d7894c0a37b83356020850135611d2a6040870187612b4e565b604051611d38929190612dac565b604051908190038120611d669493929160200193845260208401929092526040830152606082015260800190565b60405160208183030381529060405280519060200120611ef3565b6000806000611d908585611f41565b91509150610d9881611fb1565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611dd757611dd7612b1d565b602090810291909101015292915050565b6001600160a01b0384163b156115965760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e2c9089908990889088908890600401612dbc565b6020604051808303816000875af1925050508015611e67575060408051601f3d908101601f19168201909252611e6491810190612ccd565b60015b611e7357611af0612cea565b6001600160e01b0319811663f23a6e6160e01b14611a5c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161060f565b6060611203848460008561216c565b600061068a611f006122ab565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080825160411415611f785760208301516040840151606085015160001a611f6c878285856123d5565b94509450505050611faa565b825160401415611fa25760208301516040840151611f978683836124c2565b935093505050611faa565b506000905060025b9250929050565b6000816004811115611fc557611fc5612df4565b1415611fce5750565b6001816004811115611fe257611fe2612df4565b14156120305760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161060f565b600281600481111561204457612044612df4565b14156120925760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161060f565b60038160048111156120a6576120a6612df4565b14156120ff5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161060f565b600481600481111561211357612113612df4565b14156111c25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161060f565b6060824710156121e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161060f565b843b6122325760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161060f565b600080866001600160a01b0316858760405161224e9190612e0a565b60006040518083038185875af1925050503d806000811461228b576040519150601f19603f3d011682016040523d82523d6000602084013e612290565b606091505b50915091506122a082828661250a565b979650505050505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561230457507f000000000000000000000000000000000000000000000000000000000000000046145b1561232e57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b90565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561240c57506000905060036124b9565b8460ff16601b1415801561242457508460ff16601c14155b1561243557506000905060046124b9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612489573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166124b2576000600192509250506124b9565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016124fc878288856123d5565b935093505050935093915050565b60608315612519575081611206565b8251156125295782518084602001fd5b8160405162461bcd60e51b815260040161060f9190612613565b6001600160a01b03811681146111c257600080fd5b6000806040838503121561256b57600080fd5b823561257681612543565b946020939093013593505050565b6001600160e01b0319811681146111c257600080fd5b6000602082840312156125ac57600080fd5b813561120681612584565b60005b838110156125d25781810151838201526020016125ba565b838111156125e1576000848401525b50505050565b600081518084526125ff8160208601602086016125b7565b601f01601f19169290920160200192915050565b60208152600061120660208301846125e7565b60006020828403121561263857600080fd5b5035919050565b60006020828403121561265157600080fd5b813561120681612543565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156126985761269861265c565b6040525050565b600067ffffffffffffffff8211156126b9576126b961265c565b5060051b60200190565b600082601f8301126126d457600080fd5b813560206126e18261269f565b6040516126ee8282612672565b83815260059390931b850182019282810191508684111561270e57600080fd5b8286015b848110156127295780358352918301918301612712565b509695505050505050565b600082601f83011261274557600080fd5b813567ffffffffffffffff81111561275f5761275f61265c565b604051612776601f8301601f191660200182612672565b81815284602083860101111561278b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156127c057600080fd5b85356127cb81612543565b945060208601356127db81612543565b9350604086013567ffffffffffffffff808211156127f857600080fd5b61280489838a016126c3565b9450606088013591508082111561281a57600080fd5b61282689838a016126c3565b9350608088013591508082111561283c57600080fd5b5061284988828901612734565b9150509295509295909350565b6000806040838503121561286957600080fd5b823561287481612543565b9150602083013561288481612543565b809150509250929050565b600080604083850312156128a257600080fd5b823567ffffffffffffffff808211156128ba57600080fd5b818501915085601f8301126128ce57600080fd5b813560206128db8261269f565b6040516128e88282612672565b83815260059390931b850182019282810191508984111561290857600080fd5b948201945b8386101561292f57853561292081612543565b8252948201949082019061290d565b9650508601359250508082111561294557600080fd5b50612952858286016126c3565b9150509250929050565b600081518084526020808501945080840160005b8381101561298c57815187529582019590820190600101612970565b509495945050505050565b602081526000611206602083018461295c565b600080604083850312156129bd57600080fd5b82356129c881612543565b9150602083013567ffffffffffffffff8111156129e457600080fd5b83016080818603121561288457600080fd5b80151581146111c257600080fd5b60008060408385031215612a1757600080fd5b8235612a2281612543565b91506020830135612884816129f6565b600080600080600060a08688031215612a4a57600080fd5b8535612a5581612543565b94506020860135612a6581612543565b93506040860135925060608601359150608086013567ffffffffffffffff811115612a8f57600080fd5b61284988828901612734565b600181811c90821680612aaf57607f821691505b60208210811415612ad057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115612aff57612aff612ad6565b500190565b600060208284031215612b1657600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612b4757612b47612ad6565b5060010190565b6000808335601e19843603018112612b6557600080fd5b83018035915067ffffffffffffffff821115612b8057600080fd5b602001915036819003821315611faa57600080fd5b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000816000190483118215151615612c0357612c03612ad6565b500290565b600082612c2557634e487b7160e01b600052601260045260246000fd5b500490565b600082821015612c3c57612c3c612ad6565b500390565b604081526000612c54604083018561295c565b8281036020840152612c66818561295c565b95945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152612c9b60a083018661295c565b8281036060840152612cad818661295c565b90508281036080840152612cc181856125e7565b98975050505050505050565b600060208284031215612cdf57600080fd5b815161120681612584565b600060033d11156123d25760046000803e5060005160e01c90565b600060443d1015612d135790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612d4357505050505090565b8285019150815181811115612d5b5750505050505090565b843d8701016020828501011115612d755750505050505090565b612d8460208286010187612672565b509095945050505050565b600060208284031215612da157600080fd5b8151611206816129f6565b8183823760009101908152919050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526122a060a08301846125e7565b634e487b7160e01b600052602160045260246000fd5b60008251612e1c8184602087016125b7565b919091019291505056fea26469706673582212203a2aa8e8d1d29d83dd5d237fbda66573b7cd301df1a7df7afa2c8cee6062efaa64736f6c634300080a00330000000000000000000000000000000000000000000000000000000061e02cd4000000000000000000000000000000000000000000000000000000000000223800000000000000000000000000000000000000000000000000d529ae9e8600000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000001b4fbfb1fd99d00128afeb4dc25fc1d6608b113400000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d55524d673843517242486a6e326a50725a67583566596a396832366637707a6e6136507847505142386371702f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000001353756e747572202d203837363020686f7572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063142315354310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000012ccce08ee9cdaa564ae6b025a21e01e75948a81000000000000000000000000dee12ff8f1f2aa5b3ba5e7ba68d0033fc08c6b28000000000000000000000000a9b37c8eeaad39fd914ac63d6887241a916a45fc00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e

Deployed Bytecode

0x6080604052600436106101995760003560e01c80638b83209b116100e1578063ce7c2ac21161008a578063e33b7de311610064578063e33b7de3146104f7578063e985e9c51461050c578063f242432a14610555578063f2fde38b1461057557600080fd5b8063ce7c2ac214610475578063d5abeb01146104ab578063d79779b2146104c157600080fd5b80639852595c116100bb5780639852595c1461040c5780639c49365814610442578063a22cb4651461045557600080fd5b80638b83209b146103a15780638da5cb5b146103d957806395d89b41146103f757600080fd5b80632eb2c2d61161014357806348b750441161011d57806348b750441461033f5780634e1273f41461035f578063715018a61461038c57600080fd5b80632eb2c2d6146102c45780633a98ef39146102e4578063406072a9146102f957600080fd5b80630e89341c116101745780630e89341c1461026c57806318160ddd1461028c57806319165587146102a257600080fd5b8062fdd58e146101e757806301ffc9a71461021a57806306fdde031461024a57600080fd5b366101e2577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156101f357600080fd5b50610207610202366004612558565b610595565b6040519081526020015b60405180910390f35b34801561022657600080fd5b5061023a61023536600461259a565b61063e565b6040519015158152602001610211565b34801561025657600080fd5b5061025f610690565b6040516102119190612613565b34801561027857600080fd5b5061025f610287366004612626565b61071e565b34801561029857600080fd5b50610207600e5481565b3480156102ae57600080fd5b506102c26102bd36600461263f565b6107b2565b005b3480156102d057600080fd5b506102c26102df3660046127a8565b610964565b3480156102f057600080fd5b50600454610207565b34801561030557600080fd5b50610207610314366004612856565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b34801561034b57600080fd5b506102c261035a366004612856565b610a06565b34801561036b57600080fd5b5061037f61037a36600461288f565b610c62565b6040516102119190612997565b34801561039857600080fd5b506102c2610da0565b3480156103ad57600080fd5b506103c16103bc366004612626565b610e06565b6040516001600160a01b039091168152602001610211565b3480156103e557600080fd5b506003546001600160a01b03166103c1565b34801561040357600080fd5b5061025f610e36565b34801561041857600080fd5b5061020761042736600461263f565b6001600160a01b031660009081526007602052604090205490565b6102c26104503660046129aa565b610e43565b34801561046157600080fd5b506102c2610470366004612a04565b611075565b34801561048157600080fd5b5061020761049036600461263f565b6001600160a01b031660009081526006602052604090205490565b3480156104b757600080fd5b50610207600d5481565b3480156104cd57600080fd5b506102076104dc36600461263f565b6001600160a01b031660009081526009602052604090205490565b34801561050357600080fd5b50600554610207565b34801561051857600080fd5b5061023a610527366004612856565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561056157600080fd5b506102c2610570366004612a32565b611084565b34801561058157600080fd5b506102c261059036600461263f565b6110e3565b60006001600160a01b0383166106185760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061066f57506001600160e01b031982166303a24d0760e21b145b8061068a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600b805461069d90612a9b565b80601f01602080910402602001604051908101604052809291908181526020018280546106c990612a9b565b80156107165780601f106106eb57610100808354040283529160200191610716565b820191906000526020600020905b8154815290600101906020018083116106f957829003601f168201915b505050505081565b60606002805461072d90612a9b565b80601f016020809104026020016040519081016040528092919081815260200182805461075990612a9b565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b50505050509050919050565b6001600160a01b0381166000908152600660205260409020546108265760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b606482015260840161060f565b600061083160055490565b61083b9047612aec565b905060006108688383610863866001600160a01b031660009081526007602052604090205490565b6111c5565b9050806108cb5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b606482015260840161060f565b6001600160a01b038316600090815260076020526040812080548392906108f3908490612aec565b92505081905550806005600082825461090c9190612aec565b9091555061091c9050838261120d565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a1505050565b6001600160a01b03851633148061098057506109808533610527565b6109f25760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161060f565b6109ff858585858561132b565b5050505050565b6001600160a01b038116600090815260066020526040902054610a7a5760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b606482015260840161060f565b6001600160a01b0382166000908152600960205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb9190612b04565b610b059190612aec565b90506000610b3e838361086387876001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b905080610ba15760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b606482015260840161060f565b6001600160a01b038085166000908152600a6020908152604080832093871683529290529081208054839290610bd8908490612aec565b90915550506001600160a01b03841660009081526009602052604081208054839290610c05908490612aec565b90915550610c16905084848361159e565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60608151835114610cdb5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161060f565b6000835167ffffffffffffffff811115610cf757610cf761265c565b604051908082528060200260200182016040528015610d20578160200160208202803683370190505b50905060005b8451811015610d9857610d6b858281518110610d4457610d44612b1d565b6020026020010151858381518110610d5e57610d5e612b1d565b6020026020010151610595565b828281518110610d7d57610d7d612b1d565b6020908102919091010152610d9181612b33565b9050610d26565b509392505050565b6003546001600160a01b03163314610dfa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161060f565b610e046000611605565b565b600060088281548110610e1b57610e1b612b1d565b6000918252602090912001546001600160a01b031692915050565b600c805461069d90612a9b565b42600f5410610e945760405162461bcd60e51b815260206004820152600b60248201527f4e6f742073746172746564000000000000000000000000000000000000000000604482015260640161060f565b8035600090815260116020526040902054600111610ef45760405162461bcd60e51b815260206004820152600e60248201527f416c7265616479206d696e746564000000000000000000000000000000000000604482015260640161060f565b6000610eff8261166f565b9050610f136003546001600160a01b031690565b6001600160a01b0316816001600160a01b031614610f7d5760405162461bcd60e51b815260206004820152602160248201527f5369676e617475726520696e76616c6964206f7220756e617574686f72697a656044820152601960fa1b606482015260840161060f565b601054341015610fcf5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742066756e647320746f206d696e74000000000000604482015260640161060f565b81356000908152601160205260409020600190819055600e54610ff191612aec565b600e55604080516020810190915260008082526110129183918535916116c8565b6110328383600001356001604051806020016040528060008152506116c8565b7f62e892e3122007df811ddcdf33dc70fd7c6c1d0301fba644e97cbbcdb71c88a9818484356110646040870187612b4e565b604051610957959493929190612b95565b6110803383836117d2565b5050565b61109185858585856118c7565b604080516001600160a01b038088168252861660208201529081018490527fe803da0b7e6c523ad7e47d8266044be56d50f0ca83a550c0605ccbbc6d4168a09060600160405180910390a15050505050565b6003546001600160a01b0316331461113d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161060f565b6001600160a01b0381166111b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161060f565b6111c281611605565b50565b6004546001600160a01b038416600090815260066020526040812054909183916111ef9086612be9565b6111f99190612c08565b6112039190612c2a565b90505b9392505050565b8047101561125d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161060f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146112aa576040519150601f19603f3d011682016040523d82523d6000602084013e6112af565b606091505b50509050806113265760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161060f565b505050565b81518351146113a25760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161060f565b6001600160a01b0384166114065760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161060f565b3360005b845181101561153057600085828151811061142757611427612b1d565b60200260200101519050600085838151811061144557611445612b1d565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114d85760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161060f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611515908490612aec565b925050819055505050508061152990612b33565b905061140a565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611580929190612c41565b60405180910390a4611596818787878787611a65565b505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052611326908490611c0b565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061167b83611cf0565b90506112068161168e6060860186612b4e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d8192505050565b6001600160a01b0384166117285760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161060f565b336117428160008761173988611d9d565b6109ff88611d9d565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611772908490612aec565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46109ff81600087878787611de8565b816001600160a01b0316836001600160a01b0316141561185a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161060f565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661192b5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161060f565b3361193b81878761173988611d9d565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156119bf5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161060f565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906119fc908490612aec565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611a5c828888888888611de8565b50505050505050565b6001600160a01b0384163b156115965760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611aa99089908990889088908890600401612c6f565b6020604051808303816000875af1925050508015611ae4575060408051601f3d908101601f19168201909252611ae191810190612ccd565b60015b611b9a57611af0612cea565b806308c379a01415611b2a5750611b05612d05565b80611b105750611b2c565b8060405162461bcd60e51b815260040161060f9190612613565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161060f565b6001600160e01b0319811663bc197c8160e01b14611a5c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161060f565b6000611c60826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ee49092919063ffffffff16565b8051909150156113265780806020019051810190611c7e9190612d8f565b6113265760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161060f565b600061068a7f489a4f9a9e1d28d4c3fc6c2da36171eb868361a1a7fdb3abb1030d7894c0a37b83356020850135611d2a6040870187612b4e565b604051611d38929190612dac565b604051908190038120611d669493929160200193845260208401929092526040830152606082015260800190565b60405160208183030381529060405280519060200120611ef3565b6000806000611d908585611f41565b91509150610d9881611fb1565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611dd757611dd7612b1d565b602090810291909101015292915050565b6001600160a01b0384163b156115965760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e2c9089908990889088908890600401612dbc565b6020604051808303816000875af1925050508015611e67575060408051601f3d908101601f19168201909252611e6491810190612ccd565b60015b611e7357611af0612cea565b6001600160e01b0319811663f23a6e6160e01b14611a5c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161060f565b6060611203848460008561216c565b600061068a611f006122ab565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080825160411415611f785760208301516040840151606085015160001a611f6c878285856123d5565b94509450505050611faa565b825160401415611fa25760208301516040840151611f978683836124c2565b935093505050611faa565b506000905060025b9250929050565b6000816004811115611fc557611fc5612df4565b1415611fce5750565b6001816004811115611fe257611fe2612df4565b14156120305760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161060f565b600281600481111561204457612044612df4565b14156120925760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161060f565b60038160048111156120a6576120a6612df4565b14156120ff5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161060f565b600481600481111561211357612113612df4565b14156111c25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161060f565b6060824710156121e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161060f565b843b6122325760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161060f565b600080866001600160a01b0316858760405161224e9190612e0a565b60006040518083038185875af1925050503d806000811461228b576040519150601f19603f3d011682016040523d82523d6000602084013e612290565b606091505b50915091506122a082828661250a565b979650505050505050565b6000306001600160a01b037f000000000000000000000000d13a6031f450bc2755e76123098e5d4331ed56431614801561230457507f000000000000000000000000000000000000000000000000000000000000000146145b1561232e57507f400a8b1ed4a6cf8fc8223a26ee05be95ea063bff1b989d8482dcda66ff91803890565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff052f95a33109dff431ea69dec1a0c175842c11488c5ee2a81e41c1a7b77d09b828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b90565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561240c57506000905060036124b9565b8460ff16601b1415801561242457508460ff16601c14155b1561243557506000905060046124b9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612489573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166124b2576000600192509250506124b9565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016124fc878288856123d5565b935093505050935093915050565b60608315612519575081611206565b8251156125295782518084602001fd5b8160405162461bcd60e51b815260040161060f9190612613565b6001600160a01b03811681146111c257600080fd5b6000806040838503121561256b57600080fd5b823561257681612543565b946020939093013593505050565b6001600160e01b0319811681146111c257600080fd5b6000602082840312156125ac57600080fd5b813561120681612584565b60005b838110156125d25781810151838201526020016125ba565b838111156125e1576000848401525b50505050565b600081518084526125ff8160208601602086016125b7565b601f01601f19169290920160200192915050565b60208152600061120660208301846125e7565b60006020828403121561263857600080fd5b5035919050565b60006020828403121561265157600080fd5b813561120681612543565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156126985761269861265c565b6040525050565b600067ffffffffffffffff8211156126b9576126b961265c565b5060051b60200190565b600082601f8301126126d457600080fd5b813560206126e18261269f565b6040516126ee8282612672565b83815260059390931b850182019282810191508684111561270e57600080fd5b8286015b848110156127295780358352918301918301612712565b509695505050505050565b600082601f83011261274557600080fd5b813567ffffffffffffffff81111561275f5761275f61265c565b604051612776601f8301601f191660200182612672565b81815284602083860101111561278b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156127c057600080fd5b85356127cb81612543565b945060208601356127db81612543565b9350604086013567ffffffffffffffff808211156127f857600080fd5b61280489838a016126c3565b9450606088013591508082111561281a57600080fd5b61282689838a016126c3565b9350608088013591508082111561283c57600080fd5b5061284988828901612734565b9150509295509295909350565b6000806040838503121561286957600080fd5b823561287481612543565b9150602083013561288481612543565b809150509250929050565b600080604083850312156128a257600080fd5b823567ffffffffffffffff808211156128ba57600080fd5b818501915085601f8301126128ce57600080fd5b813560206128db8261269f565b6040516128e88282612672565b83815260059390931b850182019282810191508984111561290857600080fd5b948201945b8386101561292f57853561292081612543565b8252948201949082019061290d565b9650508601359250508082111561294557600080fd5b50612952858286016126c3565b9150509250929050565b600081518084526020808501945080840160005b8381101561298c57815187529582019590820190600101612970565b509495945050505050565b602081526000611206602083018461295c565b600080604083850312156129bd57600080fd5b82356129c881612543565b9150602083013567ffffffffffffffff8111156129e457600080fd5b83016080818603121561288457600080fd5b80151581146111c257600080fd5b60008060408385031215612a1757600080fd5b8235612a2281612543565b91506020830135612884816129f6565b600080600080600060a08688031215612a4a57600080fd5b8535612a5581612543565b94506020860135612a6581612543565b93506040860135925060608601359150608086013567ffffffffffffffff811115612a8f57600080fd5b61284988828901612734565b600181811c90821680612aaf57607f821691505b60208210811415612ad057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115612aff57612aff612ad6565b500190565b600060208284031215612b1657600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612b4757612b47612ad6565b5060010190565b6000808335601e19843603018112612b6557600080fd5b83018035915067ffffffffffffffff821115612b8057600080fd5b602001915036819003821315611faa57600080fd5b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000816000190483118215151615612c0357612c03612ad6565b500290565b600082612c2557634e487b7160e01b600052601260045260246000fd5b500490565b600082821015612c3c57612c3c612ad6565b500390565b604081526000612c54604083018561295c565b8281036020840152612c66818561295c565b95945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152612c9b60a083018661295c565b8281036060840152612cad818661295c565b90508281036080840152612cc181856125e7565b98975050505050505050565b600060208284031215612cdf57600080fd5b815161120681612584565b600060033d11156123d25760046000803e5060005160e01c90565b600060443d1015612d135790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612d4357505050505090565b8285019150815181811115612d5b5750505050505090565b843d8701016020828501011115612d755750505050505090565b612d8460208286010187612672565b509095945050505050565b600060208284031215612da157600080fd5b8151611206816129f6565b8183823760009101908152919050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526122a060a08301846125e7565b634e487b7160e01b600052602160045260246000fd5b60008251612e1c8184602087016125b7565b919091019291505056fea26469706673582212203a2aa8e8d1d29d83dd5d237fbda66573b7cd301df1a7df7afa2c8cee6062efaa64736f6c634300080a0033

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

0000000000000000000000000000000000000000000000000000000061e02cd4000000000000000000000000000000000000000000000000000000000000223800000000000000000000000000000000000000000000000000d529ae9e8600000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000001b4fbfb1fd99d00128afeb4dc25fc1d6608b113400000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d55524d673843517242486a6e326a50725a67583566596a396832366637707a6e6136507847505142386371702f7b69647d2e6a736f6e00000000000000000000000000000000000000000000000000000000000000001353756e747572202d203837363020686f7572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063142315354310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000012ccce08ee9cdaa564ae6b025a21e01e75948a81000000000000000000000000dee12ff8f1f2aa5b3ba5e7ba68d0033fc08c6b28000000000000000000000000a9b37c8eeaad39fd914ac63d6887241a916a45fc00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e

-----Decoded View---------------
Arg [0] : _startingAt (uint256): 1642081492
Arg [1] : _maxSupply (uint256): 8760
Arg [2] : _initialPrice (uint256): 60000000000000000
Arg [3] : _uri (string): ipfs://QmURMg8CQrBHjn2jPrZgX5fYj9h26f7pzna6PxGPQB8cqp/{id}.json
Arg [4] : _name (string): Suntur - 8760 hours
Arg [5] : _symbol (string): 1B1ST1
Arg [6] : _artist (address): 0x1b4fBfb1FD99d00128afEB4Dc25Fc1D6608b1134
Arg [7] : _payees (address[]): 0x12cCcE08EE9CDaA564ae6B025a21E01e75948a81,0xdeE12Ff8f1f2aa5b3ba5E7ba68d0033Fc08C6b28,0xa9B37C8eeAAd39fd914aC63d6887241a916a45fc
Arg [8] : _shares (uint256[]): 40,30,30

-----Encoded View---------------
24 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000061e02cd4
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002238
Arg [2] : 00000000000000000000000000000000000000000000000000d529ae9e860000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [6] : 0000000000000000000000001b4fbfb1fd99d00128afeb4dc25fc1d6608b1134
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [9] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [10] : 697066733a2f2f516d55524d673843517242486a6e326a50725a67583566596a
Arg [11] : 396832366637707a6e6136507847505142386371702f7b69647d2e6a736f6e00
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [13] : 53756e747572202d203837363020686f75727300000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [15] : 3142315354310000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [17] : 00000000000000000000000012ccce08ee9cdaa564ae6b025a21e01e75948a81
Arg [18] : 000000000000000000000000dee12ff8f1f2aa5b3ba5e7ba68d0033fc08c6b28
Arg [19] : 000000000000000000000000a9b37c8eeaad39fd914ac63d6887241a916a45fc
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [22] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [23] : 000000000000000000000000000000000000000000000000000000000000001e


Deployed Bytecode Sourcemap

67396:3435:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38028:40;19976:10;38028:40;;;-1:-1:-1;;;;;206:55:1;;;188:74;;38058:9:0;293:2:1;278:18;;271:34;161:18;38028:40:0;;;;;;;67396:3435;;;;;53791:231;;;;;;;;;;-1:-1:-1;53791:231:0;;;;;:::i;:::-;;:::i;:::-;;;941:25:1;;;929:2;914:18;53791:231:0;;;;;;;;52814:310;;;;;;;;;;-1:-1:-1;52814:310:0;;;;;:::i;:::-;;:::i;:::-;;;1528:14:1;;1521:22;1503:41;;1491:2;1476:18;52814:310:0;1363:187:1;67589:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53535:105::-;;;;;;;;;;-1:-1:-1;53535:105:0;;;;;:::i;:::-;;:::i;67672:26::-;;;;;;;;;;;;;;;;39814:566;;;;;;;;;;-1:-1:-1;39814:566:0;;;;;:::i;:::-;;:::i;:::-;;55730:442;;;;;;;;;;-1:-1:-1;55730:442:0;;;;;:::i;:::-;;:::i;38159:91::-;;;;;;;;;;-1:-1:-1;38230:12:0;;38159:91;;39288:135;;;;;;;;;;-1:-1:-1;39288:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;39385:21:0;;;39358:7;39385:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;39288:135;40648:641;;;;;;;;;;-1:-1:-1;40648:641:0;;;;;:::i;:::-;;:::i;54188:524::-;;;;;;;;;;-1:-1:-1;54188:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21823:103::-;;;;;;;;;;;;;:::i;39514:100::-;;;;;;;;;;-1:-1:-1;39514:100:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8248:55:1;;;8230:74;;8218:2;8203:18;39514:100:0;8084:226:1;21172:87:0;;;;;;;;;;-1:-1:-1;21245:6:0;;-1:-1:-1;;;;;21245:6:0;21172:87;;67614:20;;;;;;;;;;;;;:::i;39010:109::-;;;;;;;;;;-1:-1:-1;39010:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;39093:18:0;39066:7;39093:18;;;:9;:18;;;;;;;39010:109;68821:1036;;;;;;:::i;:::-;;:::i;54785:155::-;;;;;;;;;;-1:-1:-1;54785:155:0;;;;;:::i;:::-;;:::i;38806:105::-;;;;;;;;;;-1:-1:-1;38806:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;38887:16:0;38860:7;38887:16;;;:7;:16;;;;;;;38806:105;67641:24;;;;;;;;;;;;;;;;38596:119;;;;;;;;;;-1:-1:-1;38596:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;38681:26:0;38654:7;38681:26;;;:19;:26;;;;;;;38596:119;38344:95;;;;;;;;;;-1:-1:-1;38417:14:0;;38344:95;;55012:168;;;;;;;;;;-1:-1:-1;55012:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;55135:27:0;;;55111:4;55135:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;55012:168;69865:276;;;;;;;;;;-1:-1:-1;69865:276:0;;;;;:::i;:::-;;:::i;22081:201::-;;;;;;;;;;-1:-1:-1;22081:201:0;;;;;:::i;:::-;;:::i;53791:231::-;53877:7;-1:-1:-1;;;;;53905:21:0;;53897:77;;;;-1:-1:-1;;;53897:77:0;;11206:2:1;53897:77:0;;;11188:21:1;11245:2;11225:18;;;11218:30;11284:34;11264:18;;;11257:62;11355:13;11335:18;;;11328:41;11386:19;;53897:77:0;;;;;;;;;-1:-1:-1;53992:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;53992:22:0;;;;;;;;;;;;53791:231::o;52814:310::-;52916:4;-1:-1:-1;;;;;;52953:41:0;;-1:-1:-1;;;52953:41:0;;:110;;-1:-1:-1;;;;;;;53011:52:0;;-1:-1:-1;;;53011:52:0;52953:110;:163;;;-1:-1:-1;;;;;;;;;;44278:40:0;;;53080:36;52933:183;52814:310;-1:-1:-1;;52814:310:0:o;67589:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53535:105::-;53595:13;53628:4;53621:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53535:105;;;:::o;39814:566::-;-1:-1:-1;;;;;39890:16:0;;39909:1;39890:16;;;:7;:16;;;;;;39882:71;;;;-1:-1:-1;;;39882:71:0;;12003:2:1;39882:71:0;;;11985:21:1;12042:2;12022:18;;;12015:30;12081:34;12061:18;;;12054:62;-1:-1:-1;;;12132:18:1;;;12125:36;12178:19;;39882:71:0;11801:402:1;39882:71:0;39966:21;40014:15;38417:14;;;38344:95;40014:15;39990:39;;:21;:39;:::i;:::-;39966:63;;40040:15;40058:58;40074:7;40083:13;40098:17;40107:7;-1:-1:-1;;;;;39093:18:0;39066:7;39093:18;;;:9;:18;;;;;;;39010:109;40098:17;40058:15;:58::i;:::-;40040:76;-1:-1:-1;40137:12:0;40129:68;;;;-1:-1:-1;;;40129:68:0;;12675:2:1;40129:68:0;;;12657:21:1;12714:2;12694:18;;;12687:30;12753:34;12733:18;;;12726:62;-1:-1:-1;;;12804:18:1;;;12797:41;12855:19;;40129:68:0;12473:407:1;40129:68:0;-1:-1:-1;;;;;40210:18:0;;;;;;:9;:18;;;;;:29;;40232:7;;40210:18;:29;;40232:7;;40210:29;:::i;:::-;;;;;;;;40268:7;40250:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;40288:35:0;;-1:-1:-1;40306:7:0;40315;40288:17;:35::i;:::-;40339:33;;;-1:-1:-1;;;;;206:55:1;;188:74;;293:2;278:18;;271:34;;;40339:33:0;;161:18:1;40339:33:0;;;;;;;;39871:509;;39814:566;:::o;55730:442::-;-1:-1:-1;;;;;55963:20:0;;19976:10;55963:20;;:60;;-1:-1:-1;55987:36:0;56004:4;19976:10;55012:168;:::i;55987:36::-;55941:160;;;;-1:-1:-1;;;55941:160:0;;13397:2:1;55941:160:0;;;13379:21:1;13436:2;13416:18;;;13409:30;13475:34;13455:18;;;13448:62;13546:20;13526:18;;;13519:48;13584:19;;55941:160:0;13195:414:1;55941:160:0;56112:52;56135:4;56141:2;56145:3;56150:7;56159:4;56112:22;:52::i;:::-;55730:442;;;;;:::o;40648:641::-;-1:-1:-1;;;;;40730:16:0;;40749:1;40730:16;;;:7;:16;;;;;;40722:71;;;;-1:-1:-1;;;40722:71:0;;12003:2:1;40722:71:0;;;11985:21:1;12042:2;12022:18;;;12015:30;12081:34;12061:18;;;12054:62;-1:-1:-1;;;12132:18:1;;;12125:36;12178:19;;40722:71:0;11801:402:1;40722:71:0;-1:-1:-1;;;;;38681:26:0;;40806:21;38681:26;;;:19;:26;;;;;;40830:30;;-1:-1:-1;;;40830:30:0;;40854:4;40830:30;;;8230:74:1;-1:-1:-1;;;;;40830:15:0;;;;;8203:18:1;;40830:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;40806:77;;40894:15;40912:65;40928:7;40937:13;40952:24;40961:5;40968:7;-1:-1:-1;;;;;39385:21:0;;;39358:7;39385:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;39288:135;40912:65;40894:83;-1:-1:-1;40998:12:0;40990:68;;;;-1:-1:-1;;;40990:68:0;;12675:2:1;40990:68:0;;;12657:21:1;12714:2;12694:18;;;12687:30;12753:34;12733:18;;;12726:62;-1:-1:-1;;;12804:18:1;;;12797:41;12855:19;;40990:68:0;12473:407:1;40990:68:0;-1:-1:-1;;;;;41071:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;41105:7;;41071:21;:41;;41105:7;;41071:41;:::i;:::-;;;;-1:-1:-1;;;;;;;41123:26:0;;;;;;:19;:26;;;;;:37;;41153:7;;41123:26;:37;;41153:7;;41123:37;:::i;:::-;;;;-1:-1:-1;41173:47:0;;-1:-1:-1;41196:5:0;41203:7;41212;41173:22;:47::i;:::-;41236:45;;;-1:-1:-1;;;;;206:55:1;;;188:74;;293:2;278:18;;271:34;;;41236:45:0;;;;;161:18:1;41236:45:0;;;;;;;40711:578;;40648:641;;:::o;54188:524::-;54344:16;54405:3;:10;54386:8;:15;:29;54378:83;;;;-1:-1:-1;;;54378:83:0;;14005:2:1;54378:83:0;;;13987:21:1;14044:2;14024:18;;;14017:30;14083:34;14063:18;;;14056:62;14154:11;14134:18;;;14127:39;14183:19;;54378:83:0;13803:405:1;54378:83:0;54474:30;54521:8;:15;54507:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54507:30:0;;54474:63;;54555:9;54550:122;54574:8;:15;54570:1;:19;54550:122;;;54630:30;54640:8;54649:1;54640:11;;;;;;;;:::i;:::-;;;;;;;54653:3;54657:1;54653:6;;;;;;;;:::i;:::-;;;;;;;54630:9;:30::i;:::-;54611:13;54625:1;54611:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;54591:3;;;:::i;:::-;;;54550:122;;;-1:-1:-1;54691:13:0;54188:524;-1:-1:-1;;;54188:524:0:o;21823:103::-;21245:6;;-1:-1:-1;;;;;21245:6:0;19976:10;21392:23;21384:68;;;;-1:-1:-1;;;21384:68:0;;14687:2:1;21384:68:0;;;14669:21:1;;;14706:18;;;14699:30;14765:34;14745:18;;;14738:62;14817:18;;21384:68:0;14485:356:1;21384:68:0;21888:30:::1;21915:1;21888:18;:30::i;:::-;21823:103::o:0;39514:100::-;39565:7;39592;39600:5;39592:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;39592:14:0;;39514:100;-1:-1:-1;;39514:100:0:o;67614:20::-;;;;;;;:::i;68821:1036::-;68931:15;68918:10;;:28;68910:52;;;;-1:-1:-1;;;68910:52:0;;15048:2:1;68910:52:0;;;15030:21:1;15087:2;15067:18;;;15060:30;15126:13;15106:18;;;15099:41;15157:18;;68910:52:0;14846:335:1;68910:52:0;68990:16;;68981:26;;;;:8;:26;;;;;;69010:1;-1:-1:-1;68973:57:0;;;;-1:-1:-1;;;68973:57:0;;15388:2:1;68973:57:0;;;15370:21:1;15427:2;15407:18;;;15400:30;15466:16;15446:18;;;15439:44;15500:18;;68973:57:0;15186:338:1;68973:57:0;69118:14;69135:17;69143:8;69135:7;:17::i;:::-;69118:34;;69248:7;21245:6;;-1:-1:-1;;;;;21245:6:0;;21172:87;69248:7;-1:-1:-1;;;;;69238:17:0;:6;-1:-1:-1;;;;;69238:17:0;;69230:63;;;;-1:-1:-1;;;69230:63:0;;15731:2:1;69230:63:0;;;15713:21:1;15770:2;15750:18;;;15743:30;15809:34;15789:18;;;15782:62;-1:-1:-1;;;15860:18:1;;;15853:31;15901:19;;69230:63:0;15529:397:1;69230:63:0;69410:12;;69397:9;:25;;69389:64;;;;-1:-1:-1;;;69389:64:0;;16133:2:1;69389:64:0;;;16115:21:1;16172:2;16152:18;;;16145:30;16211:28;16191:18;;;16184:56;16257:18;;69389:64:0;15931:350:1;69389:64:0;69475:16;;69466:26;;;;:8;:26;;;;;69495:1;69466:30;;;;69521:11;;:15;;;:::i;:::-;69507:11;:29;69632:38;;;;;;;;;69646:16;69632:38;;;;;69638:6;;69646:16;;;69632:5;:38::i;:::-;69730:41;69736:9;69747:8;:16;;;69765:1;69730:41;;;;;;;;;;;;:5;:41::i;:::-;69789:60;69799:6;69807:9;69818:16;;69836:12;;;;69818:8;69836:12;:::i;:::-;69789:60;;;;;;;;;;:::i;54785:155::-;54880:52;19976:10;54913:8;54923;54880:18;:52::i;:::-;54785:155;;:::o;69865:276::-;70043:45;70061:4;70067:2;70071;70075:6;70083:4;70043:17;:45::i;:::-;70106:27;;;-1:-1:-1;;;;;17786:15:1;;;17768:34;;17838:15;;17833:2;17818:18;;17811:43;17870:18;;;17863:34;;;70106:27:0;;17695:2:1;17680:18;70106:27:0;;;;;;;69865:276;;;;;:::o;22081:201::-;21245:6;;-1:-1:-1;;;;;21245:6:0;19976:10;21392:23;21384:68;;;;-1:-1:-1;;;21384:68:0;;14687:2:1;21384:68:0;;;14669:21:1;;;14706:18;;;14699:30;14765:34;14745:18;;;14738:62;14817:18;;21384:68:0;14485:356:1;21384:68:0;-1:-1:-1;;;;;22170:22:0;::::1;22162:73;;;::::0;-1:-1:-1;;;22162:73:0;;18110:2:1;22162:73:0::1;::::0;::::1;18092:21:1::0;18149:2;18129:18;;;18122:30;18188:34;18168:18;;;18161:62;18259:8;18239:18;;;18232:36;18285:19;;22162:73:0::1;17908:402:1::0;22162:73:0::1;22246:28;22265:8;22246:18;:28::i;:::-;22081:201:::0;:::o;41467:248::-;41677:12;;-1:-1:-1;;;;;41657:16:0;;41613:7;41657:16;;;:7;:16;;;;;;41613:7;;41692:15;;41641:32;;:13;:32;:::i;:::-;41640:49;;;;:::i;:::-;:67;;;;:::i;:::-;41633:74;;41467:248;;;;;;:::o;24782:317::-;24897:6;24872:21;:31;;24864:73;;;;-1:-1:-1;;;24864:73:0;;19042:2:1;24864:73:0;;;19024:21:1;19081:2;19061:18;;;19054:30;19120:31;19100:18;;;19093:59;19169:18;;24864:73:0;18840:353:1;24864:73:0;24951:12;24969:9;-1:-1:-1;;;;;24969:14:0;24991:6;24969:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24950:52;;;25021:7;25013:78;;;;-1:-1:-1;;;25013:78:0;;19610:2:1;25013:78:0;;;19592:21:1;19649:2;19629:18;;;19622:30;19688:34;19668:18;;;19661:62;19759:28;19739:18;;;19732:56;19805:19;;25013:78:0;19408:422:1;25013:78:0;24853:246;24782:317;;:::o;57814:1074::-;58041:7;:14;58027:3;:10;:28;58019:81;;;;-1:-1:-1;;;58019:81:0;;20037:2:1;58019:81:0;;;20019:21:1;20076:2;20056:18;;;20049:30;20115:34;20095:18;;;20088:62;20186:10;20166:18;;;20159:38;20214:19;;58019:81:0;19835:404:1;58019:81:0;-1:-1:-1;;;;;58119:16:0;;58111:66;;;;-1:-1:-1;;;58111:66:0;;20446:2:1;58111:66:0;;;20428:21:1;20485:2;20465:18;;;20458:30;20524:34;20504:18;;;20497:62;-1:-1:-1;;;20575:18:1;;;20568:35;20620:19;;58111:66:0;20244:401:1;58111:66:0;19976:10;58190:16;58307:421;58331:3;:10;58327:1;:14;58307:421;;;58363:10;58376:3;58380:1;58376:6;;;;;;;;:::i;:::-;;;;;;;58363:19;;58397:14;58414:7;58422:1;58414:10;;;;;;;;:::i;:::-;;;;;;;;;;;;58441:19;58463:13;;;;;;;;;;-1:-1:-1;;;;;58463:19:0;;;;;;;;;;;;58414:10;;-1:-1:-1;58505:21:0;;;;58497:76;;;;-1:-1:-1;;;58497:76:0;;20852:2:1;58497:76:0;;;20834:21:1;20891:2;20871:18;;;20864:30;20930:34;20910:18;;;20903:62;-1:-1:-1;;;20981:18:1;;;20974:40;21031:19;;58497:76:0;20650:406:1;58497:76:0;58617:9;:13;;;;;;;;;;;-1:-1:-1;;;;;58617:19:0;;;;;;;;;;58639:20;;;58617:42;;58689:17;;;;;;;:27;;58639:20;;58617:9;58689:27;;58639:20;;58689:27;:::i;:::-;;;;;;;;58348:380;;;58343:3;;;;:::i;:::-;;;58307:421;;;;58775:2;-1:-1:-1;;;;;58745:47:0;58769:4;-1:-1:-1;;;;;58745:47:0;58759:8;-1:-1:-1;;;;;58745:47:0;;58779:3;58784:7;58745:47;;;;;;;:::i;:::-;;;;;;;;58805:75;58841:8;58851:4;58857:2;58861:3;58866:7;58875:4;58805:35;:75::i;:::-;58008:880;57814:1074;;;;;:::o;31488:211::-;31632:58;;;-1:-1:-1;;;;;206:55:1;;31632:58:0;;;188:74:1;278:18;;;;271:34;;;31632:58:0;;;;;;;;;;161:18:1;;;;31632:58:0;;;;;;;;;;-1:-1:-1;;;31632:58:0;;;31605:86;;31625:5;;31605:19;:86::i;22442:191::-;22535:6;;;-1:-1:-1;;;;;22552:17:0;;;;;;;;;;;22585:40;;22535:6;;;22552:17;22535:6;;22585:40;;22516:16;;22585:40;22505:128;22442:191;:::o;70149:185::-;70217:7;70237:14;70254;70260:7;70254:5;:14::i;:::-;70237:31;-1:-1:-1;70286:40:0;70237:31;70308:17;;;;:7;:17;:::i;:::-;70286:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70286:13:0;;-1:-1:-1;;;70286:40:0:i;60206:569::-;-1:-1:-1;;;;;60359:16:0;;60351:62;;;;-1:-1:-1;;;60351:62:0;;22259:2:1;60351:62:0;;;22241:21:1;22298:2;22278:18;;;22271:30;22337:34;22317:18;;;22310:62;-1:-1:-1;;;22388:18:1;;;22381:31;22429:19;;60351:62:0;22057:397:1;60351:62:0;19976:10;60470:102;19976:10;60426:16;60513:2;60517:21;60535:2;60517:17;:21::i;:::-;60540:25;60558:6;60540:17;:25::i;60470:102::-;60585:9;:13;;;;;;;;;;;-1:-1:-1;;;;;60585:17:0;;;;;;;;;:27;;60606:6;;60585:9;:27;;60606:6;;60585:27;:::i;:::-;;;;-1:-1:-1;;60628:52:0;;;22633:25:1;;;22689:2;22674:18;;22667:34;;;-1:-1:-1;;;;;60628:52:0;;;;60661:1;;60628:52;;;;;;22606:18:1;60628:52:0;;;;;;;60693:74;60724:8;60742:1;60746:2;60750;60754:6;60762:4;60693:30;:74::i;64000:331::-;64155:8;-1:-1:-1;;;;;64146:17:0;:5;-1:-1:-1;;;;;64146:17:0;;;64138:71;;;;-1:-1:-1;;;64138:71:0;;22914:2:1;64138:71:0;;;22896:21:1;22953:2;22933:18;;;22926:30;22992:34;22972:18;;;22965:62;23063:11;23043:18;;;23036:39;23092:19;;64138:71:0;22712:405:1;64138:71:0;-1:-1:-1;;;;;64220:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;64220:46:0;;;;;;;;;;64282:41;;1503::1;;;64282::0;;1476:18:1;64282:41:0;;;;;;;64000:331;;;:::o;56636:820::-;-1:-1:-1;;;;;56824:16:0;;56816:66;;;;-1:-1:-1;;;56816:66:0;;20446:2:1;56816:66:0;;;20428:21:1;20485:2;20465:18;;;20458:30;20524:34;20504:18;;;20497:62;-1:-1:-1;;;20575:18:1;;;20568:35;20620:19;;56816:66:0;20244:401:1;56816:66:0;19976:10;56939:96;19976:10;56970:4;56976:2;56980:21;56998:2;56980:17;:21::i;56939:96::-;57048:19;57070:13;;;;;;;;;;;-1:-1:-1;;;;;57070:19:0;;;;;;;;;;57108:21;;;;57100:76;;;;-1:-1:-1;;;57100:76:0;;20852:2:1;57100:76:0;;;20834:21:1;20891:2;20871:18;;;20864:30;20930:34;20910:18;;;20903:62;-1:-1:-1;;;20981:18:1;;;20974:40;21031:19;;57100:76:0;20650:406:1;57100:76:0;57212:9;:13;;;;;;;;;;;-1:-1:-1;;;;;57212:19:0;;;;;;;;;;57234:20;;;57212:42;;57276:17;;;;;;;:27;;57234:20;;57212:9;57276:27;;57234:20;;57276:27;:::i;:::-;;;;-1:-1:-1;;57321:46:0;;;22633:25:1;;;22689:2;22674:18;;22667:34;;;-1:-1:-1;;;;;57321:46:0;;;;;;;;;;;;;;22606:18:1;57321:46:0;;;;;;;57380:68;57411:8;57421:4;57427:2;57431;57435:6;57443:4;57380:30;:68::i;:::-;56805:651;;56636:820;;;;;:::o;66268:813::-;-1:-1:-1;;;;;66508:13:0;;23783:20;23831:8;66504:570;;66544:79;;-1:-1:-1;;;66544:79:0;;-1:-1:-1;;;;;66544:43:0;;;;;:79;;66588:8;;66598:4;;66604:3;;66609:7;;66618:4;;66544:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66544:79:0;;;;;;;;-1:-1:-1;;66544:79:0;;;;;;;;;;;;:::i;:::-;;;66540:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;66936:6;66929:14;;-1:-1:-1;;;66929:14:0;;;;;;;;:::i;66540:523::-;;;66985:62;;-1:-1:-1;;;66985:62:0;;25293:2:1;66985:62:0;;;25275:21:1;25332:2;25312:18;;;25305:30;25371:34;25351:18;;;25344:62;25442:22;25422:18;;;25415:50;25482:19;;66985:62:0;25091:416:1;66540:523:0;-1:-1:-1;;;;;;66705:60:0;;-1:-1:-1;;;66705:60:0;66701:159;;66790:50;;-1:-1:-1;;;66790:50:0;;25714:2:1;66790:50:0;;;25696:21:1;25753:2;25733:18;;;25726:30;25792:34;25772:18;;;25765:62;-1:-1:-1;;;25843:18:1;;;25836:38;25891:19;;66790:50:0;25512:404:1;34061:716:0;34485:23;34511:69;34539:4;34511:69;;;;;;;;;;;;;;;;;34519:5;-1:-1:-1;;;;;34511:27:0;;;:69;;;;;:::i;:::-;34595:17;;34485:95;;-1:-1:-1;34595:21:0;34591:179;;34692:10;34681:30;;;;;;;;;;;;:::i;:::-;34673:85;;;;-1:-1:-1;;;34673:85:0;;26373:2:1;34673:85:0;;;26355:21:1;26412:2;26392:18;;;26385:30;26451:34;26431:18;;;26424:62;26522:12;26502:18;;;26495:40;26552:19;;34673:85:0;26171:406:1;70342:486:0;70408:7;70448:372;70552:69;70648:15;;70690:17;;;;70750:11;;;;70648:7;70750:11;:::i;:::-;70734:29;;;;;;;:::i;:::-;;;;;;;;;70515:271;;;;;;;27089:25:1;;;27145:2;27130:18;;27123:34;;;;27188:2;27173:18;;27166:34;27231:2;27216:18;;27209:34;27076:3;27061:19;;26858:391;70515:271:0;;;;;;;;;;;;;70483:322;;;;;;70448:16;:372::i;9422:231::-;9500:7;9521:17;9540:18;9562:27;9573:4;9579:9;9562:10;:27::i;:::-;9520:69;;;;9600:18;9612:5;9600:11;:18::i;67089:198::-;67209:16;;;67223:1;67209:16;;;;;;;;;67155;;67184:22;;67209:16;;;;;;;;;;;;-1:-1:-1;67209:16:0;67184:41;;67247:7;67236:5;67242:1;67236:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;67274:5;67089:198;-1:-1:-1;;67089:198:0:o;65516:744::-;-1:-1:-1;;;;;65731:13:0;;23783:20;23831:8;65727:526;;65767:72;;-1:-1:-1;;;65767:72:0;;-1:-1:-1;;;;;65767:38:0;;;;;:72;;65806:8;;65816:4;;65822:2;;65826:6;;65834:4;;65767:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65767:72:0;;;;;;;;-1:-1:-1;;65767:72:0;;;;;;;;;;;;:::i;:::-;;;65763:479;;;;:::i;:::-;-1:-1:-1;;;;;;65889:55:0;;-1:-1:-1;;;65889:55:0;65885:154;;65969:50;;-1:-1:-1;;;65969:50:0;;25714:2:1;65969:50:0;;;25696:21:1;25753:2;25733:18;;;25726:30;25792:34;25772:18;;;25765:62;-1:-1:-1;;;25843:18:1;;;25836:38;25891:19;;65969:50:0;25512:404:1;26266:229:0;26403:12;26435:52;26457:6;26465:4;26471:1;26474:12;26435:21;:52::i;19043:167::-;19120:7;19147:55;19169:20;:18;:20::i;:::-;19191:10;14513:57;;-1:-1:-1;;;14513:57:0;;;30796:27:1;30839:11;;;30832:27;;;30875:12;;;30868:28;;;14476:7:0;;30912:12:1;;14513:57:0;;;;;;;;;;;;14503:68;;;;;;14496:75;;14383:196;;;;;7312:1308;7393:7;7402:12;7627:9;:16;7647:2;7627:22;7623:990;;;7923:4;7908:20;;7902:27;7973:4;7958:20;;7952:27;8031:4;8016:20;;8010:27;7666:9;8002:36;8074:25;8085:4;8002:36;7902:27;7952;8074:10;:25::i;:::-;8067:32;;;;;;;;;7623:990;8121:9;:16;8141:2;8121:22;8117:496;;;8396:4;8381:20;;8375:27;8447:4;8432:20;;8426:27;8489:23;8500:4;8375:27;8426;8489:10;:23::i;:::-;8482:30;;;;;;;;8117:496;-1:-1:-1;8561:1:0;;-1:-1:-1;8565:35:0;8117:496;7312:1308;;;;;:::o;5583:643::-;5661:20;5652:5;:29;;;;;;;;:::i;:::-;;5648:571;;;5583:643;:::o;5648:571::-;5759:29;5750:5;:38;;;;;;;;:::i;:::-;;5746:473;;;5805:34;;-1:-1:-1;;;5805:34:0;;28177:2:1;5805:34:0;;;28159:21:1;28216:2;28196:18;;;28189:30;28255:26;28235:18;;;28228:54;28299:18;;5805:34:0;27975:348:1;5746:473:0;5870:35;5861:5;:44;;;;;;;;:::i;:::-;;5857:362;;;5922:41;;-1:-1:-1;;;5922:41:0;;28530:2:1;5922:41:0;;;28512:21:1;28569:2;28549:18;;;28542:30;28608:33;28588:18;;;28581:61;28659:18;;5922:41:0;28328:355:1;5857:362:0;5994:30;5985:5;:39;;;;;;;;:::i;:::-;;5981:238;;;6041:44;;-1:-1:-1;;;6041:44:0;;28890:2:1;6041:44:0;;;28872:21:1;28929:2;28909:18;;;28902:30;28968:34;28948:18;;;28941:62;-1:-1:-1;;;29019:18:1;;;29012:32;29061:19;;6041:44:0;28688:398:1;5981:238:0;6116:30;6107:5;:39;;;;;;;;:::i;:::-;;6103:116;;;6163:44;;-1:-1:-1;;;6163:44:0;;29293:2:1;6163:44:0;;;29275:21:1;29332:2;29312:18;;;29305:30;29371:34;29351:18;;;29344:62;-1:-1:-1;;;29422:18:1;;;29415:32;29464:19;;6163:44:0;29091:398:1;27386:510:0;27556:12;27614:5;27589:21;:30;;27581:81;;;;-1:-1:-1;;;27581:81:0;;29696:2:1;27581:81:0;;;29678:21:1;29735:2;29715:18;;;29708:30;29774:34;29754:18;;;29747:62;29845:8;29825:18;;;29818:36;29871:19;;27581:81:0;29494:402:1;27581:81:0;23783:20;;27673:60;;;;-1:-1:-1;;;27673:60:0;;30103:2:1;27673:60:0;;;30085:21:1;30142:2;30122:18;;;30115:30;30181:31;30161:18;;;30154:59;30230:18;;27673:60:0;29901:353:1;27673:60:0;27747:12;27761:23;27788:6;-1:-1:-1;;;;;27788:11:0;27807:5;27814:4;27788:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27746:73;;;;27837:51;27854:7;27863:10;27875:12;27837:16;:51::i;:::-;27830:58;27386:510;-1:-1:-1;;;;;;;27386:510:0:o;17816:314::-;17869:7;17901:4;-1:-1:-1;;;;;17910:12:0;17893:29;;:66;;;;;17943:16;17926:13;:33;17893:66;17889:234;;;-1:-1:-1;17983:24:0;;17816:314::o;17889:234::-;-1:-1:-1;18319:73:0;;;18069:10;18319:73;;;;31597:25:1;;;;18081:12:0;31638:18:1;;;31631:34;18095:15:0;31681:18:1;;;31674:34;18363:13:0;31724:18:1;;;31717:34;18386:4:0;31767:19:1;;;;31760:84;;;;18319:73:0;;;;;;;;;;31569:19:1;;;;18319:73:0;;;18309:84;;;;;;17816:314::o;17889:234::-;17816:314;:::o;10921:1632::-;11052:7;;11986:66;11973:79;;11969:163;;;-1:-1:-1;12085:1:0;;-1:-1:-1;12089:30:0;12069:51;;11969:163;12146:1;:7;;12151:2;12146:7;;:18;;;;;12157:1;:7;;12162:2;12157:7;;12146:18;12142:102;;;-1:-1:-1;12197:1:0;;-1:-1:-1;12201:30:0;12181:51;;12142:102;12358:24;;;12341:14;12358:24;;;;;;;;;31162:25:1;;;31235:4;31223:17;;31203:18;;;31196:45;;;;31257:18;;;31250:34;;;31300:18;;;31293:34;;;12358:24:0;;31134:19:1;;12358:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12358:24:0;;-1:-1:-1;;12358:24:0;;;-1:-1:-1;;;;;;;12397:20:0;;12393:103;;12450:1;12454:29;12434:50;;;;;;;12393:103;12516:6;-1:-1:-1;12524:20:0;;-1:-1:-1;10921:1632:0;;;;;;;;:::o;9916:391::-;10030:7;;10139:66;10131:75;;10233:3;10229:12;;;10243:2;10225:21;10274:25;10285:4;10225:21;10294:1;10131:75;10274:10;:25::i;:::-;10267:32;;;;;;9916:391;;;;;;:::o;30072:712::-;30222:12;30251:7;30247:530;;;-1:-1:-1;30282:10:0;30275:17;;30247:530;30396:17;;:21;30392:374;;30594:10;30588:17;30655:15;30642:10;30638:2;30634:19;30627:44;30392:374;30737:12;30730:20;;-1:-1:-1;;;30730:20:0;;;;;;;;:::i;316:154:1:-;-1:-1:-1;;;;;395:5:1;391:54;384:5;381:65;371:93;;460:1;457;450:12;475:315;543:6;551;604:2;592:9;583:7;579:23;575:32;572:52;;;620:1;617;610:12;572:52;659:9;646:23;678:31;703:5;678:31;:::i;:::-;728:5;780:2;765:18;;;;752:32;;-1:-1:-1;;;475:315:1:o;977:131::-;-1:-1:-1;;;;;;1051:32:1;;1041:43;;1031:71;;1098:1;1095;1088:12;1113:245;1171:6;1224:2;1212:9;1203:7;1199:23;1195:32;1192:52;;;1240:1;1237;1230:12;1192:52;1279:9;1266:23;1298:30;1322:5;1298:30;:::i;1555:258::-;1627:1;1637:113;1651:6;1648:1;1645:13;1637:113;;;1727:11;;;1721:18;1708:11;;;1701:39;1673:2;1666:10;1637:113;;;1768:6;1765:1;1762:13;1759:48;;;1803:1;1794:6;1789:3;1785:16;1778:27;1759:48;;1555:258;;;:::o;1818:::-;1860:3;1898:5;1892:12;1925:6;1920:3;1913:19;1941:63;1997:6;1990:4;1985:3;1981:14;1974:4;1967:5;1963:16;1941:63;:::i;:::-;2058:2;2037:15;-1:-1:-1;;2033:29:1;2024:39;;;;2065:4;2020:50;;1818:258;-1:-1:-1;;1818:258:1:o;2081:220::-;2230:2;2219:9;2212:21;2193:4;2250:45;2291:2;2280:9;2276:18;2268:6;2250:45;:::i;2306:180::-;2365:6;2418:2;2406:9;2397:7;2393:23;2389:32;2386:52;;;2434:1;2431;2424:12;2386:52;-1:-1:-1;2457:23:1;;2306:180;-1:-1:-1;2306:180:1:o;2491:255::-;2558:6;2611:2;2599:9;2590:7;2586:23;2582:32;2579:52;;;2627:1;2624;2617:12;2579:52;2666:9;2653:23;2685:31;2710:5;2685:31;:::i;2751:127::-;2812:10;2807:3;2803:20;2800:1;2793:31;2843:4;2840:1;2833:15;2867:4;2864:1;2857:15;2883:249;2993:2;2974:13;;-1:-1:-1;;2970:27:1;2958:40;;3028:18;3013:34;;3049:22;;;3010:62;3007:88;;;3075:18;;:::i;:::-;3111:2;3104:22;-1:-1:-1;;2883:249:1:o;3137:183::-;3197:4;3230:18;3222:6;3219:30;3216:56;;;3252:18;;:::i;:::-;-1:-1:-1;3297:1:1;3293:14;3309:4;3289:25;;3137:183::o;3325:724::-;3379:5;3432:3;3425:4;3417:6;3413:17;3409:27;3399:55;;3450:1;3447;3440:12;3399:55;3486:6;3473:20;3512:4;3535:43;3575:2;3535:43;:::i;:::-;3607:2;3601:9;3619:31;3647:2;3639:6;3619:31;:::i;:::-;3685:18;;;3777:1;3773:10;;;;3761:23;;3757:32;;;3719:15;;;;-1:-1:-1;3801:15:1;;;3798:35;;;3829:1;3826;3819:12;3798:35;3865:2;3857:6;3853:15;3877:142;3893:6;3888:3;3885:15;3877:142;;;3959:17;;3947:30;;3997:12;;;;3910;;3877:142;;;-1:-1:-1;4037:6:1;3325:724;-1:-1:-1;;;;;;3325:724:1:o;4054:555::-;4096:5;4149:3;4142:4;4134:6;4130:17;4126:27;4116:55;;4167:1;4164;4157:12;4116:55;4203:6;4190:20;4229:18;4225:2;4222:26;4219:52;;;4251:18;;:::i;:::-;4300:2;4294:9;4312:67;4367:2;4348:13;;-1:-1:-1;;4344:27:1;4373:4;4340:38;4294:9;4312:67;:::i;:::-;4403:2;4395:6;4388:18;4449:3;4442:4;4437:2;4429:6;4425:15;4421:26;4418:35;4415:55;;;4466:1;4463;4456:12;4415:55;4530:2;4523:4;4515:6;4511:17;4504:4;4496:6;4492:17;4479:54;4577:1;4553:15;;;4570:4;4549:26;4542:37;;;;4557:6;4054:555;-1:-1:-1;;;4054:555:1:o;4614:1071::-;4768:6;4776;4784;4792;4800;4853:3;4841:9;4832:7;4828:23;4824:33;4821:53;;;4870:1;4867;4860:12;4821:53;4909:9;4896:23;4928:31;4953:5;4928:31;:::i;:::-;4978:5;-1:-1:-1;5035:2:1;5020:18;;5007:32;5048:33;5007:32;5048:33;:::i;:::-;5100:7;-1:-1:-1;5158:2:1;5143:18;;5130:32;5181:18;5211:14;;;5208:34;;;5238:1;5235;5228:12;5208:34;5261:61;5314:7;5305:6;5294:9;5290:22;5261:61;:::i;:::-;5251:71;;5375:2;5364:9;5360:18;5347:32;5331:48;;5404:2;5394:8;5391:16;5388:36;;;5420:1;5417;5410:12;5388:36;5443:63;5498:7;5487:8;5476:9;5472:24;5443:63;:::i;:::-;5433:73;;5559:3;5548:9;5544:19;5531:33;5515:49;;5589:2;5579:8;5576:16;5573:36;;;5605:1;5602;5595:12;5573:36;;5628:51;5671:7;5660:8;5649:9;5645:24;5628:51;:::i;:::-;5618:61;;;4614:1071;;;;;;;;:::o;5690:401::-;5771:6;5779;5832:2;5820:9;5811:7;5807:23;5803:32;5800:52;;;5848:1;5845;5838:12;5800:52;5887:9;5874:23;5906:31;5931:5;5906:31;:::i;:::-;5956:5;-1:-1:-1;6013:2:1;5998:18;;5985:32;6026:33;5985:32;6026:33;:::i;:::-;6078:7;6068:17;;;5690:401;;;;;:::o;6096:1277::-;6214:6;6222;6275:2;6263:9;6254:7;6250:23;6246:32;6243:52;;;6291:1;6288;6281:12;6243:52;6331:9;6318:23;6360:18;6401:2;6393:6;6390:14;6387:34;;;6417:1;6414;6407:12;6387:34;6455:6;6444:9;6440:22;6430:32;;6500:7;6493:4;6489:2;6485:13;6481:27;6471:55;;6522:1;6519;6512:12;6471:55;6558:2;6545:16;6580:4;6603:43;6643:2;6603:43;:::i;:::-;6675:2;6669:9;6687:31;6715:2;6707:6;6687:31;:::i;:::-;6753:18;;;6841:1;6837:10;;;;6829:19;;6825:28;;;6787:15;;;;-1:-1:-1;6865:19:1;;;6862:39;;;6897:1;6894;6887:12;6862:39;6921:11;;;;6941:217;6957:6;6952:3;6949:15;6941:217;;;7037:3;7024:17;7054:31;7079:5;7054:31;:::i;:::-;7098:18;;6974:12;;;;7136;;;;6941:217;;;7177:6;-1:-1:-1;;7221:18:1;;7208:32;;-1:-1:-1;;7252:16:1;;;7249:36;;;7281:1;7278;7271:12;7249:36;;7304:63;7359:7;7348:8;7337:9;7333:24;7304:63;:::i;:::-;7294:73;;;6096:1277;;;;;:::o;7378:435::-;7431:3;7469:5;7463:12;7496:6;7491:3;7484:19;7522:4;7551:2;7546:3;7542:12;7535:19;;7588:2;7581:5;7577:14;7609:1;7619:169;7633:6;7630:1;7627:13;7619:169;;;7694:13;;7682:26;;7728:12;;;;7763:15;;;;7655:1;7648:9;7619:169;;;-1:-1:-1;7804:3:1;;7378:435;-1:-1:-1;;;;;7378:435:1:o;7818:261::-;7997:2;7986:9;7979:21;7960:4;8017:56;8069:2;8058:9;8054:18;8046:6;8017:56;:::i;8567:525::-;8665:6;8673;8726:2;8714:9;8705:7;8701:23;8697:32;8694:52;;;8742:1;8739;8732:12;8694:52;8781:9;8768:23;8800:31;8825:5;8800:31;:::i;:::-;8850:5;-1:-1:-1;8906:2:1;8891:18;;8878:32;8933:18;8922:30;;8919:50;;;8965:1;8962;8955:12;8919:50;8988:22;;9044:3;9026:16;;;9022:26;9019:46;;;9061:1;9058;9051:12;9097:118;9183:5;9176:13;9169:21;9162:5;9159:32;9149:60;;9205:1;9202;9195:12;9220:382;9285:6;9293;9346:2;9334:9;9325:7;9321:23;9317:32;9314:52;;;9362:1;9359;9352:12;9314:52;9401:9;9388:23;9420:31;9445:5;9420:31;:::i;:::-;9470:5;-1:-1:-1;9527:2:1;9512:18;;9499:32;9540:30;9499:32;9540:30;:::i;10265:734::-;10369:6;10377;10385;10393;10401;10454:3;10442:9;10433:7;10429:23;10425:33;10422:53;;;10471:1;10468;10461:12;10422:53;10510:9;10497:23;10529:31;10554:5;10529:31;:::i;:::-;10579:5;-1:-1:-1;10636:2:1;10621:18;;10608:32;10649:33;10608:32;10649:33;:::i;:::-;10701:7;-1:-1:-1;10755:2:1;10740:18;;10727:32;;-1:-1:-1;10806:2:1;10791:18;;10778:32;;-1:-1:-1;10861:3:1;10846:19;;10833:33;10889:18;10878:30;;10875:50;;;10921:1;10918;10911:12;10875:50;10944:49;10985:7;10976:6;10965:9;10961:22;10944:49;:::i;11416:380::-;11495:1;11491:12;;;;11538;;;11559:61;;11613:4;11605:6;11601:17;11591:27;;11559:61;11666:2;11658:6;11655:14;11635:18;11632:38;11629:161;;;11712:10;11707:3;11703:20;11700:1;11693:31;11747:4;11744:1;11737:15;11775:4;11772:1;11765:15;11629:161;;11416:380;;;:::o;12208:127::-;12269:10;12264:3;12260:20;12257:1;12250:31;12300:4;12297:1;12290:15;12324:4;12321:1;12314:15;12340:128;12380:3;12411:1;12407:6;12404:1;12401:13;12398:39;;;12417:18;;:::i;:::-;-1:-1:-1;12453:9:1;;12340:128::o;13614:184::-;13684:6;13737:2;13725:9;13716:7;13712:23;13708:32;13705:52;;;13753:1;13750;13743:12;13705:52;-1:-1:-1;13776:16:1;;13614:184;-1:-1:-1;13614:184:1:o;14213:127::-;14274:10;14269:3;14265:20;14262:1;14255:31;14305:4;14302:1;14295:15;14329:4;14326:1;14319:15;14345:135;14384:3;-1:-1:-1;;14405:17:1;;14402:43;;;14425:18;;:::i;:::-;-1:-1:-1;14472:1:1;14461:13;;14345:135::o;16286:522::-;16364:4;16370:6;16430:11;16417:25;16524:2;16520:7;16509:8;16493:14;16489:29;16485:43;16465:18;16461:68;16451:96;;16543:1;16540;16533:12;16451:96;16570:33;;16622:20;;;-1:-1:-1;16665:18:1;16654:30;;16651:50;;;16697:1;16694;16687:12;16651:50;16730:4;16718:17;;-1:-1:-1;16761:14:1;16757:27;;;16747:38;;16744:58;;;16798:1;16795;16788:12;16813:687;17019:4;-1:-1:-1;;;;;17129:2:1;17121:6;17117:15;17106:9;17099:34;17181:2;17173:6;17169:15;17164:2;17153:9;17149:18;17142:43;;17221:6;17216:2;17205:9;17201:18;17194:34;17264:3;17259:2;17248:9;17244:18;17237:31;17305:6;17299:3;17288:9;17284:19;17277:35;17363:6;17355;17349:3;17338:9;17334:19;17321:49;17420:1;17414:3;17405:6;17394:9;17390:22;17386:32;17379:43;17490:3;17483:2;17479:7;17474:2;17466:6;17462:15;17458:29;17447:9;17443:45;17439:55;17431:63;;16813:687;;;;;;;;:::o;18315:168::-;18355:7;18421:1;18417;18413:6;18409:14;18406:1;18403:21;18398:1;18391:9;18384:17;18380:45;18377:71;;;18428:18;;:::i;:::-;-1:-1:-1;18468:9:1;;18315:168::o;18488:217::-;18528:1;18554;18544:132;;18598:10;18593:3;18589:20;18586:1;18579:31;18633:4;18630:1;18623:15;18661:4;18658:1;18651:15;18544:132;-1:-1:-1;18690:9:1;;18488:217::o;18710:125::-;18750:4;18778:1;18775;18772:8;18769:34;;;18783:18;;:::i;:::-;-1:-1:-1;18820:9:1;;18710:125::o;21061:465::-;21318:2;21307:9;21300:21;21281:4;21344:56;21396:2;21385:9;21381:18;21373:6;21344:56;:::i;:::-;21448:9;21440:6;21436:22;21431:2;21420:9;21416:18;21409:50;21476:44;21513:6;21505;21476:44;:::i;:::-;21468:52;21061:465;-1:-1:-1;;;;;21061:465:1:o;23122:850::-;23444:4;-1:-1:-1;;;;;23554:2:1;23546:6;23542:15;23531:9;23524:34;23606:2;23598:6;23594:15;23589:2;23578:9;23574:18;23567:43;;23646:3;23641:2;23630:9;23626:18;23619:31;23673:57;23725:3;23714:9;23710:19;23702:6;23673:57;:::i;:::-;23778:9;23770:6;23766:22;23761:2;23750:9;23746:18;23739:50;23812:44;23849:6;23841;23812:44;:::i;:::-;23798:58;;23905:9;23897:6;23893:22;23887:3;23876:9;23872:19;23865:51;23933:33;23959:6;23951;23933:33;:::i;:::-;23925:41;23122:850;-1:-1:-1;;;;;;;;23122:850:1:o;23977:249::-;24046:6;24099:2;24087:9;24078:7;24074:23;24070:32;24067:52;;;24115:1;24112;24105:12;24067:52;24147:9;24141:16;24166:30;24190:5;24166:30;:::i;24231:179::-;24266:3;24308:1;24290:16;24287:23;24284:120;;;24354:1;24351;24348;24333:23;-1:-1:-1;24391:1:1;24385:8;24380:3;24376:18;24231:179;:::o;24415:671::-;24454:3;24496:4;24478:16;24475:26;24472:39;;;24415:671;:::o;24472:39::-;24538:2;24532:9;-1:-1:-1;;24603:16:1;24599:25;;24596:1;24532:9;24575:50;24654:4;24648:11;24678:16;24713:18;24784:2;24777:4;24769:6;24765:17;24762:25;24757:2;24749:6;24746:14;24743:45;24740:58;;;24791:5;;;;;24415:671;:::o;24740:58::-;24828:6;24822:4;24818:17;24807:28;;24864:3;24858:10;24891:2;24883:6;24880:14;24877:27;;;24897:5;;;;;;24415:671;:::o;24877:27::-;24981:2;24962:16;24956:4;24952:27;24948:36;24941:4;24932:6;24927:3;24923:16;24919:27;24916:69;24913:82;;;24988:5;;;;;;24415:671;:::o;24913:82::-;25004:57;25055:4;25046:6;25038;25034:19;25030:30;25024:4;25004:57;:::i;:::-;-1:-1:-1;25077:3:1;;24415:671;-1:-1:-1;;;;;24415:671:1:o;25921:245::-;25988:6;26041:2;26029:9;26020:7;26016:23;26012:32;26009:52;;;26057:1;26054;26047:12;26009:52;26089:9;26083:16;26108:28;26130:5;26108:28;:::i;26582:271::-;26765:6;26757;26752:3;26739:33;26721:3;26791:16;;26816:13;;;26791:16;26582:271;-1:-1:-1;26582:271:1:o;27254:584::-;27476:4;-1:-1:-1;;;;;27586:2:1;27578:6;27574:15;27563:9;27556:34;27638:2;27630:6;27626:15;27621:2;27610:9;27606:18;27599:43;;27678:6;27673:2;27662:9;27658:18;27651:34;27721:6;27716:2;27705:9;27701:18;27694:34;27765:3;27759;27748:9;27744:19;27737:32;27786:46;27827:3;27816:9;27812:19;27804:6;27786:46;:::i;27843:127::-;27904:10;27899:3;27895:20;27892:1;27885:31;27935:4;27932:1;27925:15;27959:4;27956:1;27949:15;30259:274;30388:3;30426:6;30420:13;30442:53;30488:6;30483:3;30476:4;30468:6;30464:17;30442:53;:::i;:::-;30511:16;;;;;30259:274;-1:-1:-1;;30259:274:1:o

Swarm Source

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