ETH Price: $3,176.73 (+2.34%)

Token

Pinballer1 (PIN)
 

Overview

Max Total Supply

766 PIN

Holders

305

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ajehrenberg.eth
Balance
5 PIN
0x9F2880427F86a15DAEdC4C6f3185e8AfFE2Ba761
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Pinballer is a sci-fi/adventure/comedy comic book set in a far flung future. Join Pinballer as he meets the beautiful (but insane!) Voola, who leads him into the mouth of madness, and into a whole universe of trouble!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PinballerComic1

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0

// File: default_workspace/IPinballerItem.sol

pragma solidity ^0.8.12;

interface IPinballerItem 
{
    function mintForAddress(address _sender, uint _toBurn) external;
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @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/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/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

// File: @openzeppelin/contracts/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 (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @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/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: default_workspace/PinballerComic1.sol


pragma solidity ^0.8.12;


/*     .__      ___.          .__  .__                
______ |__| ____\_ |__ _____  |  | |  |   ___________ 
\____ \|  |/    \| __ \\__  \ |  | |  | _/ __ \_  __ \
|  |_> >  |   |  \ \_\ \/ __ \|  |_|  |_\  ___/|  | \/
|   __/|__|___|  /___  (____  /____/____/\___  >__|   
|__|           \/    \/     \/               \/       */
contract PinballerComic1 is ERC721Burnable, Ownable, Pausable, PaymentSplitter, ReentrancyGuard
{
    uint256 public constant MAX_OWNER_MINT = 400;
    uint256 public constant MAX_SUPPLY = 10000;

    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private supply;

    string private metadataUri = "ipfs://QmNwKQmz4FCr7uzfQmWB3mmMNjSx74sWT5XDcFYFPavvcY";
  
    uint256 private cost = 0.042 ether;
    uint256 public maxMintAmountPerTx = 11;
    
    address public pinballerItemContractAddress = address(0);

    bool public burnPaused = true;
    bool public shouldMintPinItem = true;
    bool public metadataFrozen = false;

    uint256 public mintedByOwnerCount;
    
    event tokenBurned(address indexed sender, uint indexed tokenId);

    constructor(address[] memory _payees, uint256[] memory _shares, address[] memory _initMintReceivers, uint256[] memory _initMintCount) ERC721("Pinballer1", "PIN") PaymentSplitter(_payees, _shares)
    {
        require(_initMintReceivers.length == _initMintCount.length, "_initMintReceivers and _initMintCount have a different length.");

        _pause();

        for (uint i = 0; i < _initMintReceivers.length; i++) 
        {
            if (_initMintCount[i] == 0)
                continue;

            mintForAddress(_initMintCount[i], _initMintReceivers[i]);
        }
    }

    modifier mintCompliance(uint256 _mintAmount) 
    {
        require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Mint amount too large");
        require(supply.current() + _mintAmount <= MAX_SUPPLY, "Max supply exceeded");
        _;
    }
    
    function totalSupply() external view returns (uint256) 
    {
        return supply.current();
    }

    function getMintPrice() external view returns (uint256)
    {
        return cost;
    }

    function getMaxSupply() external pure returns (uint256)
    {
        return MAX_SUPPLY;
    }

    function mint(uint256 _mintAmount) external payable mintCompliance(_mintAmount) whenNotPaused nonReentrant
    {
        require(msg.value >= cost * _mintAmount, "Insufficient funds");

        _mintLoop(msg.sender, _mintAmount);
    }
  
    function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner 
    {
        require(mintedByOwnerCount + _mintAmount <= MAX_OWNER_MINT, "Owner mint limit reached");

        mintedByOwnerCount = mintedByOwnerCount + _mintAmount;

        _mintLoop(_receiver, _mintAmount);
    }

    function tokenURI(uint256) public view virtual override returns (string memory)
    {
        //ignore _tokenId as we only have 1 metadata file
        return metadataUri;
    }

    function freezeMetadata() external onlyOwner
    {
        metadataFrozen = true;
    }

    function setCost(uint256 _cost) external onlyOwner
    {
        cost = _cost;
    }

    function setPaused(bool _newState) external onlyOwner
    {
        if (_newState == true)
        {
            _pause();
        }
        else
        {
            _unpause();
        }
    }

    function setBurnPaused(bool _newState) external onlyOwner
    {
        burnPaused = _newState;
    }

    function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) external onlyOwner 
    {
        maxMintAmountPerTx = _maxMintAmountPerTx;
    }

    function setUri(string memory _uri) external onlyOwner 
    {
        require(metadataFrozen == false, "Metadata is frozen");

        metadataUri = _uri;
    }

    function setPinballerItemContractAddress(address _address) external onlyOwner 
    {
        pinballerItemContractAddress = _address;
    }

    function setShouldMintPinItem(bool _shouldMintPinItem) external onlyOwner
    {
        shouldMintPinItem = _shouldMintPinItem;
    }

    function _mintLoop(address _receiver, uint256 _mintAmount) internal
    {
        for (uint256 i = 0; i < _mintAmount; i++) 
        {
            supply.increment();
            _safeMint(_receiver, supply.current());
        }
    }

    function burn(uint256 tokenId) public virtual override 
    {
        require(burnPaused == false, "Burning is unavailable");
        require(_isApprovedOrOwner(msg.sender, tokenId), "Caller is not owner/approved");

        if (shouldMintPinItem)
        {
            require(pinballerItemContractAddress != address(0), "Item contract is undefined");

            //mint ERC721 token of another contract
            IPinballerItem(pinballerItemContractAddress).mintForAddress(msg.sender, tokenId);
        }

        super.burn(tokenId);
        emit tokenBurned(msg.sender, tokenId);
    }

    function distributeAll() external
    {
        for (uint256 i = 0; i < 4; i++) 
        {
            release(payable(payee(i)));
        }
    }

    function walletOfOwner(address _owner) external view returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tempOwnedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= MAX_SUPPLY) 
        {
            if (_exists(currentTokenId) == true)
            {
                address currentTokenOwner = ownerOf(currentTokenId);

                if (currentTokenOwner == _owner)
                {
                    tempOwnedTokenIds[ownedTokenIndex] = currentTokenId;
                    ownedTokenIndex++;
                }
            }
            
            currentTokenId++;
        }

        uint256[] memory ownedTokenIds = new uint256[](ownedTokenIndex);
        for (uint256 i = 0; i < ownedTokenIndex; i++) 
        {
            ownedTokenIds[i] = tempOwnedTokenIds[i];
        }

        return ownedTokenIds;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"},{"internalType":"address[]","name":"_initMintReceivers","type":"address[]"},{"internalType":"uint256[]","name":"_initMintCount","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenBurned","type":"event"},{"inputs":[],"name":"MAX_OWNER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedByOwnerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pinballerItemContractAddress","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":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newState","type":"bool"}],"name":"setBurnPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newState","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setPinballerItemContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldMintPinItem","type":"bool"}],"name":"setShouldMintPinItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUri","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":[],"name":"shouldMintPinItem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e060405260356080818152906200405460a0398051620000299160109160209091019062000bd0565b50669536c708910000601155600b601255601380546001600160b81b03191661010160a01b1790553480156200005e57600080fd5b506040516200408938038062004089833981016040819052620000819162000dd1565b604080518082018252600a81526950696e62616c6c65723160b01b6020808301918252835180850190945260038452622824a760e91b90840152815187938793929091620000d29160009162000bd0565b508051620000e890600190602084019062000bd0565b50505062000105620000ff6200037160201b60201c565b62000375565b6006805460ff60a01b191690558051825114620001845760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001d75760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200017b565b60005b825181101562000243576200022e838281518110620001fd57620001fd62000e8a565b60200260200101518383815181106200021a576200021a62000e8a565b6020026020010151620003c760201b60201c565b806200023a8162000eb6565b915050620001da565b50506001600e55508051825114620002c45760405162461bcd60e51b815260206004820152603e60248201527f5f696e69744d696e7452656365697665727320616e64205f696e69744d696e7460448201527f436f756e742068617665206120646966666572656e74206c656e6774682e000060648201526084016200017b565b620002ce620005b5565b60005b82518110156200036657818181518110620002f057620002f062000e8a565b602002602001015160001415620003075762000351565b6200035182828151811062000320576200032062000e8a565b60200260200101518483815181106200033d576200033d62000e8a565b60200260200101516200066460201b60201c565b806200035d8162000eb6565b915050620002d1565b505050505062000fda565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004345760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016200017b565b60008111620004865760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016200017b565b6001600160a01b03821660009081526009602052604090205415620005025760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b60648201526084016200017b565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03841690811790915560009081526009602052604090208190556007546200056c90829062000ed4565b600755604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b620005c9600654600160a01b900460ff1690565b156200060b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016200017b565b6006805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620006473390565b6040516001600160a01b03909116815260200160405180910390a1565b816000811180156200067857506012548111155b620006c65760405162461bcd60e51b815260206004820152601560248201527f4d696e7420616d6f756e7420746f6f206c61726765000000000000000000000060448201526064016200017b565b61271081620006e1600f6200082060201b62001b5a1760201c565b620006ed919062000ed4565b11156200073d5760405162461bcd60e51b815260206004820152601360248201527f4d617820737570706c792065786365656465640000000000000000000000000060448201526064016200017b565b6006546001600160a01b03163314620007995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200017b565b61019083601454620007ac919062000ed4565b1115620007fc5760405162461bcd60e51b815260206004820152601860248201527f4f776e6572206d696e74206c696d69742072656163686564000000000000000060448201526064016200017b565b826014546200080c919062000ed4565b6014556200081b828462000824565b505050565b5490565b60005b818110156200081b5762000847600f6200087e60201b62001b5e1760201c565b620008698362000863600f6200082060201b62001b5a1760201c565b62000887565b80620008758162000eb6565b91505062000827565b80546001019055565b620008a9828260405180602001604052806000815250620008ad60201b60201c565b5050565b620008b9838362000920565b620008c8600084848462000a68565b6200081b5760405162461bcd60e51b815260206004820152603260248201526000805160206200403483398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016200017b565b6001600160a01b038216620009785760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016200017b565b6000818152600260205260409020546001600160a01b031615620009df5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200017b565b6001600160a01b038216600090815260036020526040812080546001929062000a0a90849062000ed4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600062000a89846001600160a01b031662000bc160201b62001b671760201c565b1562000bb557604051630a85bd0160e11b81526001600160a01b0385169063150b7a029062000ac390339089908890889060040162000eef565b6020604051808303816000875af192505050801562000b01575060408051601f3d908101601f1916820190925262000afe9181019062000f6a565b60015b62000b9a573d80801562000b32576040519150601f19603f3d011682016040523d82523d6000602084013e62000b37565b606091505b50805162000b925760405162461bcd60e51b815260206004820152603260248201526000805160206200403483398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016200017b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000bb9565b5060015b949350505050565b6001600160a01b03163b151590565b82805462000bde9062000f9d565b90600052602060002090601f01602090048101928262000c02576000855562000c4d565b82601f1062000c1d57805160ff191683800117855562000c4d565b8280016001018555821562000c4d579182015b8281111562000c4d57825182559160200191906001019062000c30565b5062000c5b92915062000c5f565b5090565b5b8082111562000c5b576000815560010162000c60565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000cb75762000cb762000c76565b604052919050565b60006001600160401b0382111562000cdb5762000cdb62000c76565b5060051b60200190565b600082601f83011262000cf757600080fd5b8151602062000d1062000d0a8362000cbf565b62000c8c565b82815260059290921b8401810191818101908684111562000d3057600080fd5b8286015b8481101562000d645780516001600160a01b038116811462000d565760008081fd5b835291830191830162000d34565b509695505050505050565b600082601f83011262000d8157600080fd5b8151602062000d9462000d0a8362000cbf565b82815260059290921b8401810191818101908684111562000db457600080fd5b8286015b8481101562000d64578051835291830191830162000db8565b6000806000806080858703121562000de857600080fd5b84516001600160401b038082111562000e0057600080fd5b62000e0e8883890162000ce5565b9550602087015191508082111562000e2557600080fd5b62000e338883890162000d6f565b9450604087015191508082111562000e4a57600080fd5b62000e588883890162000ce5565b9350606087015191508082111562000e6f57600080fd5b5062000e7e8782880162000d6f565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141562000ecd5762000ecd62000ea0565b5060010190565b6000821982111562000eea5762000eea62000ea0565b500190565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b8281101562000f3e5785810182015185820160a00152810162000f20565b8281111562000f5157600060a084870101525b5050601f01601f19169190910160a00195945050505050565b60006020828403121562000f7d57600080fd5b81516001600160e01b03198116811462000f9657600080fd5b9392505050565b600181811c9082168062000fb257607f821691505b6020821081141562000fd457634e487b7160e01b600052602260045260246000fd5b50919050565b61304a8062000fea6000396000f3fe6080604052600436106102cd5760003560e01c8063715018a611610175578063b071401b116100dc578063d684534e11610095578063e985e9c51161006f578063e985e9c5146108f6578063efbd73f41461093f578063f2fde38b1461095f578063fb3cc6c21461097f57600080fd5b8063d684534e1461088a578063d79779b2146108ab578063e33b7de3146108e157600080fd5b8063b071401b146107bf578063b88d4fde146107df578063c14cdf09146107ff578063c87b56dd1461081f578063ce7c2ac21461083f578063d111515d1461087557600080fd5b80639b642de11161012e5780639b642de1146107205780639eb6ab6214610740578063a0712d6814610756578063a22cb46514610769578063a7f93ebd14610789578063af3835d11461079e57600080fd5b8063715018a61461066c5780638b83209b146106815780638da5cb5b146106a157806394354fd0146106bf57806395d89b41146106d55780639852595c146106ea57600080fd5b806342842e0e116102345780634c0f38c2116101ed5780635c975abb116101c75780635c975abb146105ed5780635fb4fcda1461060c5780636352211e1461062c57806370a082311461064c57600080fd5b80634c0f38c2146105a25780635206e42a146105b7578063587b53fc146105d757600080fd5b806342842e0e146104e057806342966c6814610500578063436596c414610520578063438b63001461053557806344a0d68a1461056257806348b750441461058257600080fd5b80631916558711610286578063191655871461040f5780631ce36f7f1461042f57806323b872dd1461044f57806332cb6b0c1461046f5780633a98ef3914610485578063406072a91461049a57600080fd5b806301ffc9a71461031b57806306fdde0314610350578063081812fc14610372578063095ea7b3146103aa57806316c38b3c146103cc57806318160ddd146103ec57600080fd5b36610316577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561032757600080fd5b5061033b61033636600461297d565b6109a0565b60405190151581526020015b60405180910390f35b34801561035c57600080fd5b506103656109f2565b60405161034791906129f2565b34801561037e57600080fd5b5061039261038d366004612a05565b610a84565b6040516001600160a01b039091168152602001610347565b3480156103b657600080fd5b506103ca6103c5366004612a33565b610b1e565b005b3480156103d857600080fd5b506103ca6103e7366004612a6d565b610c34565b3480156103f857600080fd5b50610401610c7c565b604051908152602001610347565b34801561041b57600080fd5b506103ca61042a366004612a8a565b610c8c565b34801561043b57600080fd5b50601354610392906001600160a01b031681565b34801561045b57600080fd5b506103ca61046a366004612aa7565b610dba565b34801561047b57600080fd5b5061040161271081565b34801561049157600080fd5b50600754610401565b3480156104a657600080fd5b506104016104b5366004612ae8565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156104ec57600080fd5b506103ca6104fb366004612aa7565b610dec565b34801561050c57600080fd5b506103ca61051b366004612a05565b610e07565b34801561052c57600080fd5b506103ca610fb8565b34801561054157600080fd5b50610555610550366004612a8a565b610fe2565b6040516103479190612b21565b34801561056e57600080fd5b506103ca61057d366004612a05565b611184565b34801561058e57600080fd5b506103ca61059d366004612ae8565b6111b3565b3480156105ae57600080fd5b50612710610401565b3480156105c357600080fd5b506103ca6105d2366004612a6d565b61138c565b3480156105e357600080fd5b5061040160145481565b3480156105f957600080fd5b50600654600160a01b900460ff1661033b565b34801561061857600080fd5b506103ca610627366004612a8a565b6113d4565b34801561063857600080fd5b50610392610647366004612a05565b611420565b34801561065857600080fd5b50610401610667366004612a8a565b611497565b34801561067857600080fd5b506103ca61151e565b34801561068d57600080fd5b5061039261069c366004612a05565b611554565b3480156106ad57600080fd5b506006546001600160a01b0316610392565b3480156106cb57600080fd5b5061040160125481565b3480156106e157600080fd5b50610365611584565b3480156106f657600080fd5b50610401610705366004612a8a565b6001600160a01b03166000908152600a602052604090205490565b34801561072c57600080fd5b506103ca61073b366004612bf1565b611593565b34801561074c57600080fd5b5061040161019081565b6103ca610764366004612a05565b611623565b34801561077557600080fd5b506103ca610784366004612c3a565b6117df565b34801561079557600080fd5b50601154610401565b3480156107aa57600080fd5b5060135461033b90600160a81b900460ff1681565b3480156107cb57600080fd5b506103ca6107da366004612a05565b6117ea565b3480156107eb57600080fd5b506103ca6107fa366004612c68565b611819565b34801561080b57600080fd5b506103ca61081a366004612a6d565b611851565b34801561082b57600080fd5b5061036561083a366004612a05565b611899565b34801561084b57600080fd5b5061040161085a366004612a8a565b6001600160a01b031660009081526009602052604090205490565b34801561088157600080fd5b506103ca61192d565b34801561089657600080fd5b5060135461033b90600160a01b900460ff1681565b3480156108b757600080fd5b506104016108c6366004612a8a565b6001600160a01b03166000908152600c602052604090205490565b3480156108ed57600080fd5b50600854610401565b34801561090257600080fd5b5061033b610911366004612ae8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561094b57600080fd5b506103ca61095a366004612ce8565b61196c565b34801561096b57600080fd5b506103ca61097a366004612a8a565b611ac2565b34801561098b57600080fd5b5060135461033b90600160b01b900460ff1681565b60006001600160e01b031982166380ac58cd60e01b14806109d157506001600160e01b03198216635b5e139f60e01b145b806109ec57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610a0190612d0d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2d90612d0d565b8015610a7a5780601f10610a4f57610100808354040283529160200191610a7a565b820191906000526020600020905b815481529060010190602001808311610a5d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b2982611420565b9050806001600160a01b0316836001600160a01b03161415610b975760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610af9565b336001600160a01b0382161480610bb35750610bb38133610911565b610c255760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610af9565b610c2f8383611b76565b505050565b6006546001600160a01b03163314610c5e5760405162461bcd60e51b8152600401610af990612d48565b60018115151415610c7457610c71611be4565b50565b610c71611c89565b6000610c87600f5490565b905090565b6001600160a01b038116600090815260096020526040902054610cc15760405162461bcd60e51b8152600401610af990612d7d565b6000610ccc60085490565b610cd69047612dd9565b90506000610d038383610cfe866001600160a01b03166000908152600a602052604090205490565b611d0d565b905080610d225760405162461bcd60e51b8152600401610af990612df1565b6001600160a01b0383166000908152600a602052604081208054839290610d4a908490612dd9565b925050819055508060086000828254610d639190612dd9565b90915550610d7390508382611d55565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610dc5335b82611e6e565b610de15760405162461bcd60e51b8152600401610af990612e3c565b610c2f838383611f65565b610c2f83838360405180602001604052806000815250611819565b601354600160a01b900460ff1615610e5a5760405162461bcd60e51b81526020600482015260166024820152754275726e696e6720697320756e617661696c61626c6560501b6044820152606401610af9565b610e643382611e6e565b610eb05760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74206f776e65722f617070726f766564000000006044820152606401610af9565b601354600160a81b900460ff1615610f7f576013546001600160a01b0316610f1a5760405162461bcd60e51b815260206004820152601a60248201527f4974656d20636f6e747261637420697320756e646566696e65640000000000006044820152606401610af9565b60135460405163f254933d60e01b8152336004820152602481018390526001600160a01b039091169063f254933d90604401600060405180830381600087803b158015610f6657600080fd5b505af1158015610f7a573d6000803e3d6000fd5b505050505b610f8881612101565b604051819033907ff20884684d39657969fc7e0adb7b6d57e2c376184e1463a57c1f86e5dd7a439290600090a350565b60005b6004811015610c7157610fd061042a82611554565b80610fda81612e8d565b915050610fbb565b60606000610fef83611497565b905060008167ffffffffffffffff81111561100c5761100c612b65565b604051908082528060200260200182016040528015611035578160200160208202803683370190505b509050600160005b838110801561104e57506127108211155b156110de576000828152600260205260409020546001600160a01b031615151515600114156110cc57600061108283611420565b9050866001600160a01b0316816001600160a01b031614156110ca57828483815181106110b1576110b1612ea8565b6020908102919091010152816110c681612e8d565b9250505b505b816110d681612e8d565b92505061103d565b60008167ffffffffffffffff8111156110f9576110f9612b65565b604051908082528060200260200182016040528015611122578160200160208202803683370190505b50905060005b828110156111795784818151811061114257611142612ea8565b602002602001015182828151811061115c5761115c612ea8565b60209081029190910101528061117181612e8d565b915050611128565b509695505050505050565b6006546001600160a01b031633146111ae5760405162461bcd60e51b8152600401610af990612d48565b601155565b6001600160a01b0381166000908152600960205260409020546111e85760405162461bcd60e51b8152600401610af990612d7d565b6001600160a01b0382166000908152600c60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190612ebe565b6112739190612dd9565b905060006112ac8383610cfe87876001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b9050806112cb5760405162461bcd60e51b8152600401610af990612df1565b6001600160a01b038085166000908152600d6020908152604080832093871683529290529081208054839290611302908490612dd9565b90915550506001600160a01b0384166000908152600c60205260408120805483929061132f908490612dd9565b909155506113409050848483612178565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6006546001600160a01b031633146113b65760405162461bcd60e51b8152600401610af990612d48565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6006546001600160a01b031633146113fe5760405162461bcd60e51b8152600401610af990612d48565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806109ec5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610af9565b60006001600160a01b0382166115025760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610af9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146115485760405162461bcd60e51b8152600401610af990612d48565b61155260006121ca565b565b6000600b828154811061156957611569612ea8565b6000918252602090912001546001600160a01b031692915050565b606060018054610a0190612d0d565b6006546001600160a01b031633146115bd5760405162461bcd60e51b8152600401610af990612d48565b601354600160b01b900460ff161561160c5760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b6044820152606401610af9565b805161161f9060109060208401906128ce565b5050565b8060008111801561163657506012548111155b61167a5760405162461bcd60e51b81526020600482015260156024820152744d696e7420616d6f756e7420746f6f206c6172676560581b6044820152606401610af9565b61271081611687600f5490565b6116919190612dd9565b11156116d55760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610af9565b600654600160a01b900460ff16156117225760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610af9565b6002600e5414156117755760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610af9565b6002600e55601154611788908390612ed7565b3410156117cc5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610af9565b6117d6338361221c565b50506001600e55565b61161f338383612259565b6006546001600160a01b031633146118145760405162461bcd60e51b8152600401610af990612d48565b601255565b6118233383611e6e565b61183f5760405162461bcd60e51b8152600401610af990612e3c565b61184b84848484612328565b50505050565b6006546001600160a01b0316331461187b5760405162461bcd60e51b8152600401610af990612d48565b60138054911515600160a81b0260ff60a81b19909216919091179055565b6060601080546118a890612d0d565b80601f01602080910402602001604051908101604052809291908181526020018280546118d490612d0d565b80156119215780601f106118f657610100808354040283529160200191611921565b820191906000526020600020905b81548152906001019060200180831161190457829003601f168201915b50505050509050919050565b6006546001600160a01b031633146119575760405162461bcd60e51b8152600401610af990612d48565b6013805460ff60b01b1916600160b01b179055565b8160008111801561197f57506012548111155b6119c35760405162461bcd60e51b81526020600482015260156024820152744d696e7420616d6f756e7420746f6f206c6172676560581b6044820152606401610af9565b612710816119d0600f5490565b6119da9190612dd9565b1115611a1e5760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610af9565b6006546001600160a01b03163314611a485760405162461bcd60e51b8152600401610af990612d48565b61019083601454611a599190612dd9565b1115611aa75760405162461bcd60e51b815260206004820152601860248201527f4f776e6572206d696e74206c696d6974207265616368656400000000000000006044820152606401610af9565b82601454611ab59190612dd9565b601455610c2f828461221c565b6006546001600160a01b03163314611aec5760405162461bcd60e51b8152600401610af990612d48565b6001600160a01b038116611b515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610af9565b610c71816121ca565b5490565b80546001019055565b6001600160a01b03163b151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bab82611420565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600654600160a01b900460ff1615611c315760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610af9565b6006805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c6c3390565b6040516001600160a01b03909116815260200160405180910390a1565b600654600160a01b900460ff16611cd95760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610af9565b6006805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611c6c565b6007546001600160a01b03841660009081526009602052604081205490918391611d379086612ed7565b611d419190612ef6565b611d4b9190612f18565b90505b9392505050565b80471015611da55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610af9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611df2576040519150601f19603f3d011682016040523d82523d6000602084013e611df7565b606091505b5050905080610c2f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610af9565b6000818152600260205260408120546001600160a01b0316611ee75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610af9565b6000611ef283611420565b9050806001600160a01b0316846001600160a01b03161480611f2d5750836001600160a01b0316611f2284610a84565b6001600160a01b0316145b80611f5d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f7882611420565b6001600160a01b031614611fdc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610af9565b6001600160a01b03821661203e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610af9565b612049600082611b76565b6001600160a01b0383166000908152600360205260408120805460019290612072908490612f18565b90915550506001600160a01b03821660009081526003602052604081208054600192906120a0908490612dd9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61210a33610dbf565b61216f5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610af9565b610c718161235b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c2f9084906123f6565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b81811015610c2f57612235600f80546001019055565b61224783612242600f5490565b6124c8565b8061225181612e8d565b91505061221f565b816001600160a01b0316836001600160a01b031614156122bb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610af9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612333848484611f65565b61233f848484846124e2565b61184b5760405162461bcd60e51b8152600401610af990612f2f565b600061236682611420565b9050612373600083611b76565b6001600160a01b038116600090815260036020526040812080546001929061239c908490612f18565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061244b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125e09092919063ffffffff16565b805190915015610c2f57808060200190518101906124699190612f81565b610c2f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610af9565b61161f8282604051806020016040528060008152506125ef565b60006001600160a01b0384163b156125d557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612526903390899088908890600401612f9e565b6020604051808303816000875af1925050508015612561575060408051601f3d908101601f1916820190925261255e91810190612fdb565b60015b6125bb573d80801561258f576040519150601f19603f3d011682016040523d82523d6000602084013e612594565b606091505b5080516125b35760405162461bcd60e51b8152600401610af990612f2f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f5d565b506001949350505050565b6060611d4b8484600085612622565b6125f98383612753565b61260660008484846124e2565b610c2f5760405162461bcd60e51b8152600401610af990612f2f565b6060824710156126835760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610af9565b6001600160a01b0385163b6126da5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610af9565b600080866001600160a01b031685876040516126f69190612ff8565b60006040518083038185875af1925050503d8060008114612733576040519150601f19603f3d011682016040523d82523d6000602084013e612738565b606091505b5091509150612748828286612895565b979650505050505050565b6001600160a01b0382166127a95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610af9565b6000818152600260205260409020546001600160a01b03161561280e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610af9565b6001600160a01b0382166000908152600360205260408120805460019290612837908490612dd9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606083156128a4575081611d4e565b8251156128b45782518084602001fd5b8160405162461bcd60e51b8152600401610af991906129f2565b8280546128da90612d0d565b90600052602060002090601f0160209004810192826128fc5760008555612942565b82601f1061291557805160ff1916838001178555612942565b82800160010185558215612942579182015b82811115612942578251825591602001919060010190612927565b5061294e929150612952565b5090565b5b8082111561294e5760008155600101612953565b6001600160e01b031981168114610c7157600080fd5b60006020828403121561298f57600080fd5b8135611d4e81612967565b60005b838110156129b557818101518382015260200161299d565b8381111561184b5750506000910152565b600081518084526129de81602086016020860161299a565b601f01601f19169290920160200192915050565b602081526000611d4e60208301846129c6565b600060208284031215612a1757600080fd5b5035919050565b6001600160a01b0381168114610c7157600080fd5b60008060408385031215612a4657600080fd5b8235612a5181612a1e565b946020939093013593505050565b8015158114610c7157600080fd5b600060208284031215612a7f57600080fd5b8135611d4e81612a5f565b600060208284031215612a9c57600080fd5b8135611d4e81612a1e565b600080600060608486031215612abc57600080fd5b8335612ac781612a1e565b92506020840135612ad781612a1e565b929592945050506040919091013590565b60008060408385031215612afb57600080fd5b8235612b0681612a1e565b91506020830135612b1681612a1e565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015612b5957835183529284019291840191600101612b3d565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612b9657612b96612b65565b604051601f8501601f19908116603f01168101908282118183101715612bbe57612bbe612b65565b81604052809350858152868686011115612bd757600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c0357600080fd5b813567ffffffffffffffff811115612c1a57600080fd5b8201601f81018413612c2b57600080fd5b611f5d84823560208401612b7b565b60008060408385031215612c4d57600080fd5b8235612c5881612a1e565b91506020830135612b1681612a5f565b60008060008060808587031215612c7e57600080fd5b8435612c8981612a1e565b93506020850135612c9981612a1e565b925060408501359150606085013567ffffffffffffffff811115612cbc57600080fd5b8501601f81018713612ccd57600080fd5b612cdc87823560208401612b7b565b91505092959194509250565b60008060408385031215612cfb57600080fd5b823591506020830135612b1681612a1e565b600181811c90821680612d2157607f821691505b60208210811415612d4257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612dec57612dec612dc3565b500190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000600019821415612ea157612ea1612dc3565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612ed057600080fd5b5051919050565b6000816000190483118215151615612ef157612ef1612dc3565b500290565b600082612f1357634e487b7160e01b600052601260045260246000fd5b500490565b600082821015612f2a57612f2a612dc3565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060208284031215612f9357600080fd5b8151611d4e81612a5f565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fd1908301846129c6565b9695505050505050565b600060208284031215612fed57600080fd5b8151611d4e81612967565b6000825161300a81846020870161299a565b919091019291505056fea2646970667358221220b77cfddc978556b2773ada5b1d1e39632347bf2a3cd3f3682a958058b2f2807c64736f6c634300080c00334552433732313a207472616e7366657220746f206e6f6e204552433732315265697066733a2f2f516d4e774b516d7a3446437237757a66516d5742336d6d4d4e6a53783734735754355844634659465061767663590000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000400000000000000000000000074682c44a3be1e3d5d2fdcb1d30e067281239b2b000000000000000000000000d725bd0cbb9a2364ea295e7e6384c3183454fcae0000000000000000000000006ff599fe8c0256634b47d498d964caf120e04df400000000000000000000000009dfde2d907996a7b4028d1691ae27bbfdb5af6c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000400000000000000000000000074682c44a3be1e3d5d2fdcb1d30e067281239b2b000000000000000000000000d725bd0cbb9a2364ea295e7e6384c3183454fcae0000000000000000000000006ff599fe8c0256634b47d498d964caf120e04df400000000000000000000000009dfde2d907996a7b4028d1691ae27bbfdb5af6c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c8063715018a611610175578063b071401b116100dc578063d684534e11610095578063e985e9c51161006f578063e985e9c5146108f6578063efbd73f41461093f578063f2fde38b1461095f578063fb3cc6c21461097f57600080fd5b8063d684534e1461088a578063d79779b2146108ab578063e33b7de3146108e157600080fd5b8063b071401b146107bf578063b88d4fde146107df578063c14cdf09146107ff578063c87b56dd1461081f578063ce7c2ac21461083f578063d111515d1461087557600080fd5b80639b642de11161012e5780639b642de1146107205780639eb6ab6214610740578063a0712d6814610756578063a22cb46514610769578063a7f93ebd14610789578063af3835d11461079e57600080fd5b8063715018a61461066c5780638b83209b146106815780638da5cb5b146106a157806394354fd0146106bf57806395d89b41146106d55780639852595c146106ea57600080fd5b806342842e0e116102345780634c0f38c2116101ed5780635c975abb116101c75780635c975abb146105ed5780635fb4fcda1461060c5780636352211e1461062c57806370a082311461064c57600080fd5b80634c0f38c2146105a25780635206e42a146105b7578063587b53fc146105d757600080fd5b806342842e0e146104e057806342966c6814610500578063436596c414610520578063438b63001461053557806344a0d68a1461056257806348b750441461058257600080fd5b80631916558711610286578063191655871461040f5780631ce36f7f1461042f57806323b872dd1461044f57806332cb6b0c1461046f5780633a98ef3914610485578063406072a91461049a57600080fd5b806301ffc9a71461031b57806306fdde0314610350578063081812fc14610372578063095ea7b3146103aa57806316c38b3c146103cc57806318160ddd146103ec57600080fd5b36610316577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561032757600080fd5b5061033b61033636600461297d565b6109a0565b60405190151581526020015b60405180910390f35b34801561035c57600080fd5b506103656109f2565b60405161034791906129f2565b34801561037e57600080fd5b5061039261038d366004612a05565b610a84565b6040516001600160a01b039091168152602001610347565b3480156103b657600080fd5b506103ca6103c5366004612a33565b610b1e565b005b3480156103d857600080fd5b506103ca6103e7366004612a6d565b610c34565b3480156103f857600080fd5b50610401610c7c565b604051908152602001610347565b34801561041b57600080fd5b506103ca61042a366004612a8a565b610c8c565b34801561043b57600080fd5b50601354610392906001600160a01b031681565b34801561045b57600080fd5b506103ca61046a366004612aa7565b610dba565b34801561047b57600080fd5b5061040161271081565b34801561049157600080fd5b50600754610401565b3480156104a657600080fd5b506104016104b5366004612ae8565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156104ec57600080fd5b506103ca6104fb366004612aa7565b610dec565b34801561050c57600080fd5b506103ca61051b366004612a05565b610e07565b34801561052c57600080fd5b506103ca610fb8565b34801561054157600080fd5b50610555610550366004612a8a565b610fe2565b6040516103479190612b21565b34801561056e57600080fd5b506103ca61057d366004612a05565b611184565b34801561058e57600080fd5b506103ca61059d366004612ae8565b6111b3565b3480156105ae57600080fd5b50612710610401565b3480156105c357600080fd5b506103ca6105d2366004612a6d565b61138c565b3480156105e357600080fd5b5061040160145481565b3480156105f957600080fd5b50600654600160a01b900460ff1661033b565b34801561061857600080fd5b506103ca610627366004612a8a565b6113d4565b34801561063857600080fd5b50610392610647366004612a05565b611420565b34801561065857600080fd5b50610401610667366004612a8a565b611497565b34801561067857600080fd5b506103ca61151e565b34801561068d57600080fd5b5061039261069c366004612a05565b611554565b3480156106ad57600080fd5b506006546001600160a01b0316610392565b3480156106cb57600080fd5b5061040160125481565b3480156106e157600080fd5b50610365611584565b3480156106f657600080fd5b50610401610705366004612a8a565b6001600160a01b03166000908152600a602052604090205490565b34801561072c57600080fd5b506103ca61073b366004612bf1565b611593565b34801561074c57600080fd5b5061040161019081565b6103ca610764366004612a05565b611623565b34801561077557600080fd5b506103ca610784366004612c3a565b6117df565b34801561079557600080fd5b50601154610401565b3480156107aa57600080fd5b5060135461033b90600160a81b900460ff1681565b3480156107cb57600080fd5b506103ca6107da366004612a05565b6117ea565b3480156107eb57600080fd5b506103ca6107fa366004612c68565b611819565b34801561080b57600080fd5b506103ca61081a366004612a6d565b611851565b34801561082b57600080fd5b5061036561083a366004612a05565b611899565b34801561084b57600080fd5b5061040161085a366004612a8a565b6001600160a01b031660009081526009602052604090205490565b34801561088157600080fd5b506103ca61192d565b34801561089657600080fd5b5060135461033b90600160a01b900460ff1681565b3480156108b757600080fd5b506104016108c6366004612a8a565b6001600160a01b03166000908152600c602052604090205490565b3480156108ed57600080fd5b50600854610401565b34801561090257600080fd5b5061033b610911366004612ae8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561094b57600080fd5b506103ca61095a366004612ce8565b61196c565b34801561096b57600080fd5b506103ca61097a366004612a8a565b611ac2565b34801561098b57600080fd5b5060135461033b90600160b01b900460ff1681565b60006001600160e01b031982166380ac58cd60e01b14806109d157506001600160e01b03198216635b5e139f60e01b145b806109ec57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610a0190612d0d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2d90612d0d565b8015610a7a5780601f10610a4f57610100808354040283529160200191610a7a565b820191906000526020600020905b815481529060010190602001808311610a5d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b2982611420565b9050806001600160a01b0316836001600160a01b03161415610b975760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610af9565b336001600160a01b0382161480610bb35750610bb38133610911565b610c255760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610af9565b610c2f8383611b76565b505050565b6006546001600160a01b03163314610c5e5760405162461bcd60e51b8152600401610af990612d48565b60018115151415610c7457610c71611be4565b50565b610c71611c89565b6000610c87600f5490565b905090565b6001600160a01b038116600090815260096020526040902054610cc15760405162461bcd60e51b8152600401610af990612d7d565b6000610ccc60085490565b610cd69047612dd9565b90506000610d038383610cfe866001600160a01b03166000908152600a602052604090205490565b611d0d565b905080610d225760405162461bcd60e51b8152600401610af990612df1565b6001600160a01b0383166000908152600a602052604081208054839290610d4a908490612dd9565b925050819055508060086000828254610d639190612dd9565b90915550610d7390508382611d55565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610dc5335b82611e6e565b610de15760405162461bcd60e51b8152600401610af990612e3c565b610c2f838383611f65565b610c2f83838360405180602001604052806000815250611819565b601354600160a01b900460ff1615610e5a5760405162461bcd60e51b81526020600482015260166024820152754275726e696e6720697320756e617661696c61626c6560501b6044820152606401610af9565b610e643382611e6e565b610eb05760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74206f776e65722f617070726f766564000000006044820152606401610af9565b601354600160a81b900460ff1615610f7f576013546001600160a01b0316610f1a5760405162461bcd60e51b815260206004820152601a60248201527f4974656d20636f6e747261637420697320756e646566696e65640000000000006044820152606401610af9565b60135460405163f254933d60e01b8152336004820152602481018390526001600160a01b039091169063f254933d90604401600060405180830381600087803b158015610f6657600080fd5b505af1158015610f7a573d6000803e3d6000fd5b505050505b610f8881612101565b604051819033907ff20884684d39657969fc7e0adb7b6d57e2c376184e1463a57c1f86e5dd7a439290600090a350565b60005b6004811015610c7157610fd061042a82611554565b80610fda81612e8d565b915050610fbb565b60606000610fef83611497565b905060008167ffffffffffffffff81111561100c5761100c612b65565b604051908082528060200260200182016040528015611035578160200160208202803683370190505b509050600160005b838110801561104e57506127108211155b156110de576000828152600260205260409020546001600160a01b031615151515600114156110cc57600061108283611420565b9050866001600160a01b0316816001600160a01b031614156110ca57828483815181106110b1576110b1612ea8565b6020908102919091010152816110c681612e8d565b9250505b505b816110d681612e8d565b92505061103d565b60008167ffffffffffffffff8111156110f9576110f9612b65565b604051908082528060200260200182016040528015611122578160200160208202803683370190505b50905060005b828110156111795784818151811061114257611142612ea8565b602002602001015182828151811061115c5761115c612ea8565b60209081029190910101528061117181612e8d565b915050611128565b509695505050505050565b6006546001600160a01b031633146111ae5760405162461bcd60e51b8152600401610af990612d48565b601155565b6001600160a01b0381166000908152600960205260409020546111e85760405162461bcd60e51b8152600401610af990612d7d565b6001600160a01b0382166000908152600c60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190612ebe565b6112739190612dd9565b905060006112ac8383610cfe87876001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b9050806112cb5760405162461bcd60e51b8152600401610af990612df1565b6001600160a01b038085166000908152600d6020908152604080832093871683529290529081208054839290611302908490612dd9565b90915550506001600160a01b0384166000908152600c60205260408120805483929061132f908490612dd9565b909155506113409050848483612178565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6006546001600160a01b031633146113b65760405162461bcd60e51b8152600401610af990612d48565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6006546001600160a01b031633146113fe5760405162461bcd60e51b8152600401610af990612d48565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806109ec5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610af9565b60006001600160a01b0382166115025760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610af9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146115485760405162461bcd60e51b8152600401610af990612d48565b61155260006121ca565b565b6000600b828154811061156957611569612ea8565b6000918252602090912001546001600160a01b031692915050565b606060018054610a0190612d0d565b6006546001600160a01b031633146115bd5760405162461bcd60e51b8152600401610af990612d48565b601354600160b01b900460ff161561160c5760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b6044820152606401610af9565b805161161f9060109060208401906128ce565b5050565b8060008111801561163657506012548111155b61167a5760405162461bcd60e51b81526020600482015260156024820152744d696e7420616d6f756e7420746f6f206c6172676560581b6044820152606401610af9565b61271081611687600f5490565b6116919190612dd9565b11156116d55760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610af9565b600654600160a01b900460ff16156117225760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610af9565b6002600e5414156117755760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610af9565b6002600e55601154611788908390612ed7565b3410156117cc5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610af9565b6117d6338361221c565b50506001600e55565b61161f338383612259565b6006546001600160a01b031633146118145760405162461bcd60e51b8152600401610af990612d48565b601255565b6118233383611e6e565b61183f5760405162461bcd60e51b8152600401610af990612e3c565b61184b84848484612328565b50505050565b6006546001600160a01b0316331461187b5760405162461bcd60e51b8152600401610af990612d48565b60138054911515600160a81b0260ff60a81b19909216919091179055565b6060601080546118a890612d0d565b80601f01602080910402602001604051908101604052809291908181526020018280546118d490612d0d565b80156119215780601f106118f657610100808354040283529160200191611921565b820191906000526020600020905b81548152906001019060200180831161190457829003601f168201915b50505050509050919050565b6006546001600160a01b031633146119575760405162461bcd60e51b8152600401610af990612d48565b6013805460ff60b01b1916600160b01b179055565b8160008111801561197f57506012548111155b6119c35760405162461bcd60e51b81526020600482015260156024820152744d696e7420616d6f756e7420746f6f206c6172676560581b6044820152606401610af9565b612710816119d0600f5490565b6119da9190612dd9565b1115611a1e5760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610af9565b6006546001600160a01b03163314611a485760405162461bcd60e51b8152600401610af990612d48565b61019083601454611a599190612dd9565b1115611aa75760405162461bcd60e51b815260206004820152601860248201527f4f776e6572206d696e74206c696d6974207265616368656400000000000000006044820152606401610af9565b82601454611ab59190612dd9565b601455610c2f828461221c565b6006546001600160a01b03163314611aec5760405162461bcd60e51b8152600401610af990612d48565b6001600160a01b038116611b515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610af9565b610c71816121ca565b5490565b80546001019055565b6001600160a01b03163b151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bab82611420565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600654600160a01b900460ff1615611c315760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610af9565b6006805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c6c3390565b6040516001600160a01b03909116815260200160405180910390a1565b600654600160a01b900460ff16611cd95760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610af9565b6006805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611c6c565b6007546001600160a01b03841660009081526009602052604081205490918391611d379086612ed7565b611d419190612ef6565b611d4b9190612f18565b90505b9392505050565b80471015611da55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610af9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611df2576040519150601f19603f3d011682016040523d82523d6000602084013e611df7565b606091505b5050905080610c2f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610af9565b6000818152600260205260408120546001600160a01b0316611ee75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610af9565b6000611ef283611420565b9050806001600160a01b0316846001600160a01b03161480611f2d5750836001600160a01b0316611f2284610a84565b6001600160a01b0316145b80611f5d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611f7882611420565b6001600160a01b031614611fdc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610af9565b6001600160a01b03821661203e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610af9565b612049600082611b76565b6001600160a01b0383166000908152600360205260408120805460019290612072908490612f18565b90915550506001600160a01b03821660009081526003602052604081208054600192906120a0908490612dd9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61210a33610dbf565b61216f5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610af9565b610c718161235b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c2f9084906123f6565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b81811015610c2f57612235600f80546001019055565b61224783612242600f5490565b6124c8565b8061225181612e8d565b91505061221f565b816001600160a01b0316836001600160a01b031614156122bb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610af9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612333848484611f65565b61233f848484846124e2565b61184b5760405162461bcd60e51b8152600401610af990612f2f565b600061236682611420565b9050612373600083611b76565b6001600160a01b038116600090815260036020526040812080546001929061239c908490612f18565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061244b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125e09092919063ffffffff16565b805190915015610c2f57808060200190518101906124699190612f81565b610c2f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610af9565b61161f8282604051806020016040528060008152506125ef565b60006001600160a01b0384163b156125d557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612526903390899088908890600401612f9e565b6020604051808303816000875af1925050508015612561575060408051601f3d908101601f1916820190925261255e91810190612fdb565b60015b6125bb573d80801561258f576040519150601f19603f3d011682016040523d82523d6000602084013e612594565b606091505b5080516125b35760405162461bcd60e51b8152600401610af990612f2f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f5d565b506001949350505050565b6060611d4b8484600085612622565b6125f98383612753565b61260660008484846124e2565b610c2f5760405162461bcd60e51b8152600401610af990612f2f565b6060824710156126835760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610af9565b6001600160a01b0385163b6126da5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610af9565b600080866001600160a01b031685876040516126f69190612ff8565b60006040518083038185875af1925050503d8060008114612733576040519150601f19603f3d011682016040523d82523d6000602084013e612738565b606091505b5091509150612748828286612895565b979650505050505050565b6001600160a01b0382166127a95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610af9565b6000818152600260205260409020546001600160a01b03161561280e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610af9565b6001600160a01b0382166000908152600360205260408120805460019290612837908490612dd9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606083156128a4575081611d4e565b8251156128b45782518084602001fd5b8160405162461bcd60e51b8152600401610af991906129f2565b8280546128da90612d0d565b90600052602060002090601f0160209004810192826128fc5760008555612942565b82601f1061291557805160ff1916838001178555612942565b82800160010185558215612942579182015b82811115612942578251825591602001919060010190612927565b5061294e929150612952565b5090565b5b8082111561294e5760008155600101612953565b6001600160e01b031981168114610c7157600080fd5b60006020828403121561298f57600080fd5b8135611d4e81612967565b60005b838110156129b557818101518382015260200161299d565b8381111561184b5750506000910152565b600081518084526129de81602086016020860161299a565b601f01601f19169290920160200192915050565b602081526000611d4e60208301846129c6565b600060208284031215612a1757600080fd5b5035919050565b6001600160a01b0381168114610c7157600080fd5b60008060408385031215612a4657600080fd5b8235612a5181612a1e565b946020939093013593505050565b8015158114610c7157600080fd5b600060208284031215612a7f57600080fd5b8135611d4e81612a5f565b600060208284031215612a9c57600080fd5b8135611d4e81612a1e565b600080600060608486031215612abc57600080fd5b8335612ac781612a1e565b92506020840135612ad781612a1e565b929592945050506040919091013590565b60008060408385031215612afb57600080fd5b8235612b0681612a1e565b91506020830135612b1681612a1e565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015612b5957835183529284019291840191600101612b3d565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612b9657612b96612b65565b604051601f8501601f19908116603f01168101908282118183101715612bbe57612bbe612b65565b81604052809350858152868686011115612bd757600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c0357600080fd5b813567ffffffffffffffff811115612c1a57600080fd5b8201601f81018413612c2b57600080fd5b611f5d84823560208401612b7b565b60008060408385031215612c4d57600080fd5b8235612c5881612a1e565b91506020830135612b1681612a5f565b60008060008060808587031215612c7e57600080fd5b8435612c8981612a1e565b93506020850135612c9981612a1e565b925060408501359150606085013567ffffffffffffffff811115612cbc57600080fd5b8501601f81018713612ccd57600080fd5b612cdc87823560208401612b7b565b91505092959194509250565b60008060408385031215612cfb57600080fd5b823591506020830135612b1681612a1e565b600181811c90821680612d2157607f821691505b60208210811415612d4257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612dec57612dec612dc3565b500190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000600019821415612ea157612ea1612dc3565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612ed057600080fd5b5051919050565b6000816000190483118215151615612ef157612ef1612dc3565b500290565b600082612f1357634e487b7160e01b600052601260045260246000fd5b500490565b600082821015612f2a57612f2a612dc3565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060208284031215612f9357600080fd5b8151611d4e81612a5f565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612fd1908301846129c6565b9695505050505050565b600060208284031215612fed57600080fd5b8151611d4e81612967565b6000825161300a81846020870161299a565b919091019291505056fea2646970667358221220b77cfddc978556b2773ada5b1d1e39632347bf2a3cd3f3682a958058b2f2807c64736f6c634300080c0033

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

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000400000000000000000000000074682c44a3be1e3d5d2fdcb1d30e067281239b2b000000000000000000000000d725bd0cbb9a2364ea295e7e6384c3183454fcae0000000000000000000000006ff599fe8c0256634b47d498d964caf120e04df400000000000000000000000009dfde2d907996a7b4028d1691ae27bbfdb5af6c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000400000000000000000000000074682c44a3be1e3d5d2fdcb1d30e067281239b2b000000000000000000000000d725bd0cbb9a2364ea295e7e6384c3183454fcae0000000000000000000000006ff599fe8c0256634b47d498d964caf120e04df400000000000000000000000009dfde2d907996a7b4028d1691ae27bbfdb5af6c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a

-----Decoded View---------------
Arg [0] : _payees (address[]): 0x74682C44A3be1E3D5d2fdcB1d30e067281239b2B,0xD725bd0CbB9A2364Ea295e7e6384C3183454FcAe,0x6fF599fe8c0256634b47d498D964caF120E04DF4,0x09DFDe2D907996a7b4028D1691aE27BbFdb5aF6C
Arg [1] : _shares (uint256[]): 40,30,15,15
Arg [2] : _initMintReceivers (address[]): 0x74682C44A3be1E3D5d2fdcB1d30e067281239b2B,0xD725bd0CbB9A2364Ea295e7e6384C3183454FcAe,0x6fF599fe8c0256634b47d498D964caF120E04DF4,0x09DFDe2D907996a7b4028D1691aE27BbFdb5aF6C
Arg [3] : _initMintCount (uint256[]): 0,11,10,10

-----Encoded View---------------
24 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 00000000000000000000000074682c44a3be1e3d5d2fdcb1d30e067281239b2b
Arg [6] : 000000000000000000000000d725bd0cbb9a2364ea295e7e6384c3183454fcae
Arg [7] : 0000000000000000000000006ff599fe8c0256634b47d498d964caf120e04df4
Arg [8] : 00000000000000000000000009dfde2d907996a7b4028d1691ae27bbfdb5af6c
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [11] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [12] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [13] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [15] : 00000000000000000000000074682c44a3be1e3d5d2fdcb1d30e067281239b2b
Arg [16] : 000000000000000000000000d725bd0cbb9a2364ea295e7e6384c3183454fcae
Arg [17] : 0000000000000000000000006ff599fe8c0256634b47d498d964caf120e04df4
Arg [18] : 00000000000000000000000009dfde2d907996a7b4028d1691ae27bbfdb5af6c
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [21] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [22] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [23] : 000000000000000000000000000000000000000000000000000000000000000a


Deployed Bytecode Sourcemap

59667:5990:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30927:40;10205:10;30927:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;30957:9:0;270:2:1;255:18;;248:34;161:18;30927:40:0;;;;;;;59667:5990;;;;;45345:305;;;;;;;;;;-1:-1:-1;45345:305:0;;;;;:::i;:::-;;:::i;:::-;;;844:14:1;;837:22;819:41;;807:2;792:18;45345:305:0;;;;;;;;46290:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47849:221::-;;;;;;;;;;-1:-1:-1;47849:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1971:32:1;;;1953:51;;1941:2;1926:18;47849:221:0;1807:203:1;47372:411:0;;;;;;;;;;-1:-1:-1;47372:411:0;;;;;:::i;:::-;;:::i;:::-;;62638:205;;;;;;;;;;-1:-1:-1;62638:205:0;;;;;:::i;:::-;;:::i;61350:103::-;;;;;;;;;;;;;:::i;:::-;;;2986:25:1;;;2974:2;2959:18;61350:103:0;2840:177:1;32713:566:0;;;;;;;;;;-1:-1:-1;32713:566:0;;;;;:::i;:::-;;:::i;60176:56::-;;;;;;;;;;-1:-1:-1;60176:56:0;;;;-1:-1:-1;;;;;60176:56:0;;;48599:339;;;;;;;;;;-1:-1:-1;48599:339:0;;;;;:::i;:::-;;:::i;59822:42::-;;;;;;;;;;;;59859:5;59822:42;;31058:91;;;;;;;;;;-1:-1:-1;31129:12:0;;31058:91;;32187:135;;;;;;;;;;-1:-1:-1;32187:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;32284:21:0;;;32257:7;32284:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;32187:135;49009:185;;;;;;;;;;-1:-1:-1;49009:185:0;;;;;:::i;:::-;;:::i;63831:607::-;;;;;;;;;;-1:-1:-1;63831:607:0;;;;;:::i;:::-;;:::i;64446:152::-;;;;;;;;;;;;;:::i;64606:1048::-;;;;;;;;;;-1:-1:-1;64606:1048:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62543:87::-;;;;;;;;;;-1:-1:-1;62543:87:0;;;;;:::i;:::-;;:::i;33547:641::-;;;;;;;;;;-1:-1:-1;33547:641:0;;;;;:::i;:::-;;:::i;61560:97::-;;;;;;;;;;-1:-1:-1;59859:5:0;61560:97;;62851:104;;;;;;;;;;-1:-1:-1;62851:104:0;;;;;:::i;:::-;;:::i;60363:33::-;;;;;;;;;;;;;;;;11471:86;;;;;;;;;;-1:-1:-1;11542:7:0;;-1:-1:-1;;;11542:7:0;;;;11471:86;;63288:142;;;;;;;;;;-1:-1:-1;63288:142:0;;;;;:::i;:::-;;:::i;45984:239::-;;;;;;;;;;-1:-1:-1;45984:239:0;;;;;:::i;:::-;;:::i;45714:208::-;;;;;;;;;;-1:-1:-1;45714:208:0;;;;;:::i;:::-;;:::i;14370:103::-;;;;;;;;;;;;;:::i;32413:100::-;;;;;;;;;;-1:-1:-1;32413:100:0;;;;;:::i;:::-;;:::i;13719:87::-;;;;;;;;;;-1:-1:-1;13792:6:0;;-1:-1:-1;;;;;13792:6:0;13719:87;;60125:38;;;;;;;;;;;;;;;;46459:104;;;;;;;;;;;;;:::i;31909:109::-;;;;;;;;;;-1:-1:-1;31909:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;31992:18:0;31965:7;31992:18;;;:9;:18;;;;;;;31909:109;63115:165;;;;;;;;;;-1:-1:-1;63115:165:0;;;;;:::i;:::-;;:::i;59771:44::-;;;;;;;;;;;;59812:3;59771:44;;61665:240;;;;;;:::i;:::-;;:::i;48142:155::-;;;;;;;;;;-1:-1:-1;48142:155:0;;;;;:::i;:::-;;:::i;61461:91::-;;;;;;;;;;-1:-1:-1;61540:4:0;;61461:91;;60277:36;;;;;;;;;;-1:-1:-1;60277:36:0;;;;-1:-1:-1;;;60277:36:0;;;;;;62963:144;;;;;;;;;;-1:-1:-1;62963:144:0;;;;;:::i;:::-;;:::i;49265:328::-;;;;;;;;;;-1:-1:-1;49265:328:0;;;;;:::i;:::-;;:::i;63438:136::-;;;;;;;;;;-1:-1:-1;63438:136:0;;;;;:::i;:::-;;:::i;62256:181::-;;;;;;;;;;-1:-1:-1;62256:181:0;;;;;:::i;:::-;;:::i;31705:105::-;;;;;;;;;;-1:-1:-1;31705:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;31786:16:0;31759:7;31786:16;;;:7;:16;;;;;;;31705:105;62445:90;;;;;;;;;;;;;:::i;60241:29::-;;;;;;;;;;-1:-1:-1;60241:29:0;;;;-1:-1:-1;;;60241:29:0;;;;;;31495:119;;;;;;;;;;-1:-1:-1;31495:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;31580:26:0;31553:7;31580:26;;;:19;:26;;;;;;;31495:119;31243:95;;;;;;;;;;-1:-1:-1;31316:14:0;;31243:95;;48368:164;;;;;;;;;;-1:-1:-1;48368:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;48489:25:0;;;48465:4;48489:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;48368:164;61915:333;;;;;;;;;;-1:-1:-1;61915:333:0;;;;;:::i;:::-;;:::i;14628:201::-;;;;;;;;;;-1:-1:-1;14628:201:0;;;;;:::i;:::-;;:::i;60320:34::-;;;;;;;;;;-1:-1:-1;60320:34:0;;;;-1:-1:-1;;;60320:34:0;;;;;;45345:305;45447:4;-1:-1:-1;;;;;;45484:40:0;;-1:-1:-1;;;45484:40:0;;:105;;-1:-1:-1;;;;;;;45541:48:0;;-1:-1:-1;;;45541:48:0;45484:105;:158;;;-1:-1:-1;;;;;;;;;;38208:40:0;;;45606:36;45464:178;45345:305;-1:-1:-1;;45345:305:0:o;46290:100::-;46344:13;46377:5;46370:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46290:100;:::o;47849:221::-;47925:7;51192:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51192:16:0;47945:73;;;;-1:-1:-1;;;47945:73:0;;9017:2:1;47945:73:0;;;8999:21:1;9056:2;9036:18;;;9029:30;9095:34;9075:18;;;9068:62;-1:-1:-1;;;9146:18:1;;;9139:42;9198:19;;47945:73:0;;;;;;;;;-1:-1:-1;48038:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;48038:24:0;;47849:221::o;47372:411::-;47453:13;47469:23;47484:7;47469:14;:23::i;:::-;47453:39;;47517:5;-1:-1:-1;;;;;47511:11:0;:2;-1:-1:-1;;;;;47511:11:0;;;47503:57;;;;-1:-1:-1;;;47503:57:0;;9430:2:1;47503:57:0;;;9412:21:1;9469:2;9449:18;;;9442:30;9508:34;9488:18;;;9481:62;-1:-1:-1;;;9559:18:1;;;9552:31;9600:19;;47503:57:0;9228:397:1;47503:57:0;10205:10;-1:-1:-1;;;;;47595:21:0;;;;:62;;-1:-1:-1;47620:37:0;47637:5;10205:10;48368:164;:::i;47620:37::-;47573:168;;;;-1:-1:-1;;;47573:168:0;;9832:2:1;47573:168:0;;;9814:21:1;9871:2;9851:18;;;9844:30;9910:34;9890:18;;;9883:62;9981:26;9961:18;;;9954:54;10025:19;;47573:168:0;9630:420:1;47573:168:0;47754:21;47763:2;47767:7;47754:8;:21::i;:::-;47442:341;47372:411;;:::o;62638:205::-;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;62725:4:::1;62712:17:::0;::::1;;;62708:128;;;62755:8;:6;:8::i;:::-;62638:205:::0;:::o;62708:128::-:1;62814:10;:8;:10::i;61350:103::-:0;61396:7;61429:16;:6;6821:14;;6729:114;61429:16;61422:23;;61350:103;:::o;32713:566::-;-1:-1:-1;;;;;32789:16:0;;32808:1;32789:16;;;:7;:16;;;;;;32781:71;;;;-1:-1:-1;;;32781:71:0;;;;;;;:::i;:::-;32865:21;32913:15;31316:14;;;31243:95;32913:15;32889:39;;:21;:39;:::i;:::-;32865:63;;32939:15;32957:58;32973:7;32982:13;32997:17;33006:7;-1:-1:-1;;;;;31992:18:0;31965:7;31992:18;;;:9;:18;;;;;;;31909:109;32997:17;32957:15;:58::i;:::-;32939:76;-1:-1:-1;33036:12:0;33028:68;;;;-1:-1:-1;;;33028:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33109:18:0;;;;;;:9;:18;;;;;:29;;33131:7;;33109:18;:29;;33131:7;;33109:29;:::i;:::-;;;;;;;;33167:7;33149:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;33187:35:0;;-1:-1:-1;33205:7:0;33214;33187:17;:35::i;:::-;33238:33;;;-1:-1:-1;;;;;206:32:1;;188:51;;270:2;255:18;;248:34;;;33238:33:0;;161:18:1;33238:33:0;;;;;;;32770:509;;32713:566;:::o;48599:339::-;48794:41;10205:10;48813:12;48827:7;48794:18;:41::i;:::-;48786:103;;;;-1:-1:-1;;;48786:103:0;;;;;;;:::i;:::-;48902:28;48912:4;48918:2;48922:7;48902:9;:28::i;49009:185::-;49147:39;49164:4;49170:2;49174:7;49147:39;;;;;;;;;;;;:16;:39::i;63831:607::-;63911:10;;-1:-1:-1;;;63911:10:0;;;;:19;63903:54;;;;-1:-1:-1;;;63903:54:0;;12407:2:1;63903:54:0;;;12389:21:1;12446:2;12426:18;;;12419:30;-1:-1:-1;;;12465:18:1;;;12458:52;12527:18;;63903:54:0;12205:346:1;63903:54:0;63976:39;63995:10;64007:7;63976:18;:39::i;:::-;63968:80;;;;-1:-1:-1;;;63968:80:0;;12758:2:1;63968:80:0;;;12740:21:1;12797:2;12777:18;;;12770:30;12836;12816:18;;;12809:58;12884:18;;63968:80:0;12556:352:1;63968:80:0;64065:17;;-1:-1:-1;;;64065:17:0;;;;64061:290;;;64116:28;;-1:-1:-1;;;;;64116:28:0;64108:81;;;;-1:-1:-1;;;64108:81:0;;13115:2:1;64108:81:0;;;13097:21:1;13154:2;13134:18;;;13127:30;13193:28;13173:18;;;13166:56;13239:18;;64108:81:0;12913:350:1;64108:81:0;64274:28;;64259:80;;-1:-1:-1;;;64259:80:0;;64319:10;64259:80;;;188:51:1;255:18;;;248:34;;;-1:-1:-1;;;;;64274:28:0;;;;64259:59;;161:18:1;;64259:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64061:290;64363:19;64374:7;64363:10;:19::i;:::-;64398:32;;64422:7;;64410:10;;64398:32;;;;;63831:607;:::o;64446:152::-;64501:9;64496:95;64520:1;64516;:5;64496:95;;;64553:26;64569:8;64575:1;64569:5;:8::i;64553:26::-;64523:3;;;;:::i;:::-;;;;64496:95;;64606:1048;64668:16;64702:23;64728:17;64738:6;64728:9;:17::i;:::-;64702:43;;64756:34;64807:15;64793:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64793:30:0;-1:-1:-1;64756:67:0;-1:-1:-1;64859:1:0;64834:22;64911:495;64936:15;64918;:33;:65;;;;;59859:5;64955:14;:28;;64918:65;64911:495;;;51168:4;51192:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51192:16:0;:30;;65014:31;;65041:4;65014:31;65010:340;;;65079:25;65107:23;65115:14;65107:7;:23::i;:::-;65079:51;;65176:6;-1:-1:-1;;;;;65155:27:0;:17;-1:-1:-1;;;;;65155:27:0;;65151:184;;;65261:14;65224:17;65242:15;65224:34;;;;;;;;:::i;:::-;;;;;;;;;;:51;65298:17;;;;:::i;:::-;;;;65151:184;65060:290;65010:340;65378:16;;;;:::i;:::-;;;;64911:495;;;65418:30;65465:15;65451:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65451:30:0;;65418:63;;65497:9;65492:122;65516:15;65512:1;:19;65492:122;;;65582:17;65600:1;65582:20;;;;;;;;:::i;:::-;;;;;;;65563:13;65577:1;65563:16;;;;;;;;:::i;:::-;;;;;;;;;;:39;65533:3;;;;:::i;:::-;;;;65492:122;;;-1:-1:-1;65633:13:0;64606:1048;-1:-1:-1;;;;;;64606:1048:0:o;62543:87::-;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;62610:4:::1;:12:::0;62543:87::o;33547:641::-;-1:-1:-1;;;;;33629:16:0;;33648:1;33629:16;;;:7;:16;;;;;;33621:71;;;;-1:-1:-1;;;33621:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31580:26:0;;33705:21;31580:26;;;:19;:26;;;;;;33729:30;;-1:-1:-1;;;33729:30:0;;33753:4;33729:30;;;1953:51:1;-1:-1:-1;;;;;33729:15:0;;;;;1926:18:1;;33729:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;33705:77;;33793:15;33811:65;33827:7;33836:13;33851:24;33860:5;33867:7;-1:-1:-1;;;;;32284:21:0;;;32257:7;32284:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;32187:135;33811:65;33793:83;-1:-1:-1;33897:12:0;33889:68;;;;-1:-1:-1;;;33889:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33970:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;34004:7;;33970:21;:41;;34004:7;;33970:41;:::i;:::-;;;;-1:-1:-1;;;;;;;34022:26:0;;;;;;:19;:26;;;;;:37;;34052:7;;34022:26;:37;;34052:7;;34022:37;:::i;:::-;;;;-1:-1:-1;34072:47:0;;-1:-1:-1;34095:5:0;34102:7;34111;34072:22;:47::i;:::-;34135:45;;;-1:-1:-1;;;;;206:32:1;;;188:51;;270:2;255:18;;248:34;;;34135:45:0;;;;;161:18:1;34135:45:0;;;;;;;33610:578;;33547:641;;:::o;62851:104::-;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;62925:10:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;62925:22:0::1;-1:-1:-1::0;;;;62925:22:0;;::::1;::::0;;;::::1;::::0;;62851:104::o;63288:142::-;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;63383:28:::1;:39:::0;;-1:-1:-1;;;;;;63383:39:0::1;-1:-1:-1::0;;;;;63383:39:0;;;::::1;::::0;;;::::1;::::0;;63288:142::o;45984:239::-;46056:7;46092:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46092:16:0;46127:19;46119:73;;;;-1:-1:-1;;;46119:73:0;;13931:2:1;46119:73:0;;;13913:21:1;13970:2;13950:18;;;13943:30;14009:34;13989:18;;;13982:62;-1:-1:-1;;;14060:18:1;;;14053:39;14109:19;;46119:73:0;13729:405:1;45714:208:0;45786:7;-1:-1:-1;;;;;45814:19:0;;45806:74;;;;-1:-1:-1;;;45806:74:0;;14341:2:1;45806:74:0;;;14323:21:1;14380:2;14360:18;;;14353:30;14419:34;14399:18;;;14392:62;-1:-1:-1;;;14470:18:1;;;14463:40;14520:19;;45806:74:0;14139:406:1;45806:74:0;-1:-1:-1;;;;;;45898:16:0;;;;;:9;:16;;;;;;;45714:208::o;14370:103::-;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;14435:30:::1;14462:1;14435:18;:30::i;:::-;14370:103::o:0;32413:100::-;32464:7;32491;32499:5;32491:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;32491:14:0;;32413:100;-1:-1:-1;;32413:100:0:o;46459:104::-;46515:13;46548:7;46541:14;;;;;:::i;63115:165::-;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;63195:14:::1;::::0;-1:-1:-1;;;63195:14:0;::::1;;;:23;63187:54;;;::::0;-1:-1:-1;;;63187:54:0;;14752:2:1;63187:54:0::1;::::0;::::1;14734:21:1::0;14791:2;14771:18;;;14764:30;-1:-1:-1;;;14810:18:1;;;14803:48;14868:18;;63187:54:0::1;14550:342:1::0;63187:54:0::1;63254:18:::0;;::::1;::::0;:11:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;63115:165:::0;:::o;61665:240::-;61732:11;61167:1;61153:11;:15;:52;;;;;61187:18;;61172:11;:33;;61153:52;61145:86;;;;-1:-1:-1;;;61145:86:0;;15099:2:1;61145:86:0;;;15081:21:1;15138:2;15118:18;;;15111:30;-1:-1:-1;;;15157:18:1;;;15150:51;15218:18;;61145:86:0;14897:345:1;61145:86:0;59859:5;61269:11;61250:16;:6;6821:14;;6729:114;61250:16;:30;;;;:::i;:::-;:44;;61242:76;;;;-1:-1:-1;;;61242:76:0;;15449:2:1;61242:76:0;;;15431:21:1;15488:2;15468:18;;;15461:30;-1:-1:-1;;;15507:18:1;;;15500:49;15566:18;;61242:76:0;15247:343:1;61242:76:0;11542:7;;-1:-1:-1;;;11542:7:0;;;;11796:9:::1;11788:38;;;::::0;-1:-1:-1;;;11788:38:0;;15797:2:1;11788:38:0::1;::::0;::::1;15779:21:1::0;15836:2;15816:18;;;15809:30;-1:-1:-1;;;15855:18:1;;;15848:46;15911:18;;11788:38:0::1;15595:340:1::0;11788:38:0::1;2031:1:::2;2629:7;;:19;;2621:63;;;::::0;-1:-1:-1;;;2621:63:0;;16142:2:1;2621:63:0::2;::::0;::::2;16124:21:1::0;16181:2;16161:18;;;16154:30;16220:33;16200:18;;;16193:61;16271:18;;2621:63:0::2;15940:355:1::0;2621:63:0::2;2031:1;2762:7;:18:::0;61809:4:::3;::::0;:18:::3;::::0;61816:11;;61809:18:::3;:::i;:::-;61796:9;:31;;61788:62;;;::::0;-1:-1:-1;;;61788:62:0;;16675:2:1;61788:62:0::3;::::0;::::3;16657:21:1::0;16714:2;16694:18;;;16687:30;-1:-1:-1;;;16733:18:1;;;16726:48;16791:18;;61788:62:0::3;16473:342:1::0;61788:62:0::3;61863:34;61873:10;61885:11;61863:9;:34::i;:::-;-1:-1:-1::0;;1987:1:0::2;2941:7;:22:::0;61665:240::o;48142:155::-;48237:52;10205:10;48270:8;48280;48237:18;:52::i;62963:144::-;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;63059:18:::1;:40:::0;62963:144::o;49265:328::-;49440:41;10205:10;49473:7;49440:18;:41::i;:::-;49432:103;;;;-1:-1:-1;;;49432:103:0;;;;;;;:::i;:::-;49546:39;49560:4;49566:2;49570:7;49579:5;49546:13;:39::i;:::-;49265:328;;;;:::o;63438:136::-;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;63528:17:::1;:38:::0;;;::::1;;-1:-1:-1::0;;;63528:38:0::1;-1:-1:-1::0;;;;63528:38:0;;::::1;::::0;;;::::1;::::0;;63438:136::o;62256:181::-;62321:13;62418:11;62411:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62256:181;;;:::o;62445:90::-;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;62506:14:::1;:21:::0;;-1:-1:-1;;;;62506:21:0::1;-1:-1:-1::0;;;62506:21:0::1;::::0;;62445:90::o;61915:333::-;62001:11;61167:1;61153:11;:15;:52;;;;;61187:18;;61172:11;:33;;61153:52;61145:86;;;;-1:-1:-1;;;61145:86:0;;15099:2:1;61145:86:0;;;15081:21:1;15138:2;15118:18;;;15111:30;-1:-1:-1;;;15157:18:1;;;15150:51;15218:18;;61145:86:0;14897:345:1;61145:86:0;59859:5;61269:11;61250:16;:6;6821:14;;6729:114;61250:16;:30;;;;:::i;:::-;:44;;61242:76;;;;-1:-1:-1;;;61242:76:0;;15449:2:1;61242:76:0;;;15431:21:1;15488:2;15468:18;;;15461:30;-1:-1:-1;;;15507:18:1;;;15500:49;15566:18;;61242:76:0;15247:343:1;61242:76:0;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23:::1;13931:68;;;;-1:-1:-1::0;;;13931:68:0::1;;;;;;;:::i;:::-;59812:3:::2;62070:11;62049:18;;:32;;;;:::i;:::-;:50;;62041:87;;;::::0;-1:-1:-1;;;62041:87:0;;17022:2:1;62041:87:0::2;::::0;::::2;17004:21:1::0;17061:2;17041:18;;;17034:30;17100:26;17080:18;;;17073:54;17144:18;;62041:87:0::2;16820:348:1::0;62041:87:0::2;62183:11;62162:18;;:32;;;;:::i;:::-;62141:18;:53:::0;62207:33:::2;62217:9:::0;62228:11;62207:9:::2;:33::i;14628:201::-:0;13792:6;;-1:-1:-1;;;;;13792:6:0;10205:10;13939:23;13931:68;;;;-1:-1:-1;;;13931:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14717:22:0;::::1;14709:73;;;::::0;-1:-1:-1;;;14709:73:0;;17375:2:1;14709:73:0::1;::::0;::::1;17357:21:1::0;17414:2;17394:18;;;17387:30;17453:34;17433:18;;;17426:62;-1:-1:-1;;;17504:18:1;;;17497:36;17550:19;;14709:73:0::1;17173:402:1::0;14709:73:0::1;14793:28;14812:8;14793:18;:28::i;6729:114::-:0;6821:14;;6729:114::o;6851:127::-;6940:19;;6958:1;6940:19;;;6851:127::o;16420:326::-;-1:-1:-1;;;;;16715:19:0;;:23;;;16420:326::o;55249:174::-;55324:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;55324:29:0;-1:-1:-1;;;;;55324:29:0;;;;;;;;:24;;55378:23;55324:24;55378:14;:23::i;:::-;-1:-1:-1;;;;;55369:46:0;;;;;;;;;;;55249:174;;:::o;12271:118::-;11542:7;;-1:-1:-1;;;11542:7:0;;;;11796:9;11788:38;;;;-1:-1:-1;;;11788:38:0;;15797:2:1;11788:38:0;;;15779:21:1;15836:2;15816:18;;;15809:30;-1:-1:-1;;;15855:18:1;;;15848:46;15911:18;;11788:38:0;15595:340:1;11788:38:0;12331:7:::1;:14:::0;;-1:-1:-1;;;;12331:14:0::1;-1:-1:-1::0;;;12331:14:0::1;::::0;;12361:20:::1;12368:12;10205:10:::0;;10125:98;12368:12:::1;12361:20;::::0;-1:-1:-1;;;;;1971:32:1;;;1953:51;;1941:2;1926:18;12361:20:0::1;;;;;;;12271:118::o:0;12530:120::-;11542:7;;-1:-1:-1;;;11542:7:0;;;;12066:41;;;;-1:-1:-1;;;12066:41:0;;17782:2:1;12066:41:0;;;17764:21:1;17821:2;17801:18;;;17794:30;-1:-1:-1;;;17840:18:1;;;17833:50;17900:18;;12066:41:0;17580:344:1;12066:41:0;12589:7:::1;:15:::0;;-1:-1:-1;;;;12589:15:0::1;::::0;;12620:22:::1;10205:10:::0;12629:12:::1;10125:98:::0;34366:248;34576:12;;-1:-1:-1;;;;;34556:16:0;;34512:7;34556:16;;;:7;:16;;;;;;34512:7;;34591:15;;34540:32;;:13;:32;:::i;:::-;34539:49;;;;:::i;:::-;:67;;;;:::i;:::-;34532:74;;34366:248;;;;;;:::o;17681:317::-;17796:6;17771:21;:31;;17763:73;;;;-1:-1:-1;;;17763:73:0;;18483:2:1;17763:73:0;;;18465:21:1;18522:2;18502:18;;;18495:30;18561:31;18541:18;;;18534:59;18610:18;;17763:73:0;18281:353:1;17763:73:0;17850:12;17868:9;-1:-1:-1;;;;;17868:14:0;17890:6;17868:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17849:52;;;17920:7;17912:78;;;;-1:-1:-1;;;17912:78:0;;19051:2:1;17912:78:0;;;19033:21:1;19090:2;19070:18;;;19063:30;19129:34;19109:18;;;19102:62;19200:28;19180:18;;;19173:56;19246:19;;17912:78:0;18849:422:1;51397:348:0;51490:4;51192:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51192:16:0;51507:73;;;;-1:-1:-1;;;51507:73:0;;19478:2:1;51507:73:0;;;19460:21:1;19517:2;19497:18;;;19490:30;19556:34;19536:18;;;19529:62;-1:-1:-1;;;19607:18:1;;;19600:42;19659:19;;51507:73:0;19276:408:1;51507:73:0;51591:13;51607:23;51622:7;51607:14;:23::i;:::-;51591:39;;51660:5;-1:-1:-1;;;;;51649:16:0;:7;-1:-1:-1;;;;;51649:16:0;;:51;;;;51693:7;-1:-1:-1;;;;;51669:31:0;:20;51681:7;51669:11;:20::i;:::-;-1:-1:-1;;;;;51669:31:0;;51649:51;:87;;;-1:-1:-1;;;;;;48489:25:0;;;48465:4;48489:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;51704:32;51641:96;51397:348;-1:-1:-1;;;;51397:348:0:o;54506:625::-;54665:4;-1:-1:-1;;;;;54638:31:0;:23;54653:7;54638:14;:23::i;:::-;-1:-1:-1;;;;;54638:31:0;;54630:81;;;;-1:-1:-1;;;54630:81:0;;19891:2:1;54630:81:0;;;19873:21:1;19930:2;19910:18;;;19903:30;19969:34;19949:18;;;19942:62;-1:-1:-1;;;20020:18:1;;;20013:35;20065:19;;54630:81:0;19689:401:1;54630:81:0;-1:-1:-1;;;;;54730:16:0;;54722:65;;;;-1:-1:-1;;;54722:65:0;;20297:2:1;54722:65:0;;;20279:21:1;20336:2;20316:18;;;20309:30;20375:34;20355:18;;;20348:62;-1:-1:-1;;;20426:18:1;;;20419:34;20470:19;;54722:65:0;20095:400:1;54722:65:0;54904:29;54921:1;54925:7;54904:8;:29::i;:::-;-1:-1:-1;;;;;54946:15:0;;;;;;:9;:15;;;;;:20;;54965:1;;54946:15;:20;;54965:1;;54946:20;:::i;:::-;;;;-1:-1:-1;;;;;;;54977:13:0;;;;;;:9;:13;;;;;:18;;54994:1;;54977:13;:18;;54994:1;;54977:18;:::i;:::-;;;;-1:-1:-1;;55006:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;55006:21:0;-1:-1:-1;;;;;55006:21:0;;;;;;;;;55045:27;;55006:16;;55045:27;;;;;;;47442:341;47372:411;;:::o;58995:245::-;59113:41;10205:10;59132:12;10125:98;59113:41;59105:102;;;;-1:-1:-1;;;59105:102:0;;20702:2:1;59105:102:0;;;20684:21:1;20741:2;20721:18;;;20714:30;20780:34;20760:18;;;20753:62;-1:-1:-1;;;20831:18:1;;;20824:46;20887:19;;59105:102:0;20500:412:1;59105:102:0;59218:14;59224:7;59218:5;:14::i;24387:211::-;24531:58;;;-1:-1:-1;;;;;206:32:1;;24531:58:0;;;188:51:1;255:18;;;;248:34;;;24531:58:0;;;;;;;;;;161:18:1;;;;24531:58:0;;;;;;;;-1:-1:-1;;;;;24531:58:0;-1:-1:-1;;;24531:58:0;;;24504:86;;24524:5;;24504:19;:86::i;14989:191::-;15082:6;;;-1:-1:-1;;;;;15099:17:0;;;-1:-1:-1;;;;;;15099:17:0;;;;;;;15132:40;;15082:6;;;15099:17;15082:6;;15132:40;;15063:16;;15132:40;15052:128;14989:191;:::o;63582:241::-;63671:9;63666:150;63690:11;63686:1;:15;63666:150;;;63733:18;:6;6940:19;;6958:1;6940:19;;;6851:127;63733:18;63766:38;63776:9;63787:16;:6;6821:14;;6729:114;63787:16;63766:9;:38::i;:::-;63703:3;;;;:::i;:::-;;;;63666:150;;55565:315;55720:8;-1:-1:-1;;;;;55711:17:0;:5;-1:-1:-1;;;;;55711:17:0;;;55703:55;;;;-1:-1:-1;;;55703:55:0;;21119:2:1;55703:55:0;;;21101:21:1;21158:2;21138:18;;;21131:30;21197:27;21177:18;;;21170:55;21242:18;;55703:55:0;20917:349:1;55703:55:0;-1:-1:-1;;;;;55769:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;55769:46:0;;;;;;;;;;55831:41;;819::1;;;55831::0;;792:18:1;55831:41:0;;;;;;;55565:315;;;:::o;50475:::-;50632:28;50642:4;50648:2;50652:7;50632:9;:28::i;:::-;50679:48;50702:4;50708:2;50712:7;50721:5;50679:22;:48::i;:::-;50671:111;;;;-1:-1:-1;;;50671:111:0;;;;;;;:::i;53749:420::-;53809:13;53825:23;53840:7;53825:14;:23::i;:::-;53809:39;;53950:29;53967:1;53971:7;53950:8;:29::i;:::-;-1:-1:-1;;;;;53992:16:0;;;;;;:9;:16;;;;;:21;;54012:1;;53992:16;:21;;54012:1;;53992:21;:::i;:::-;;;;-1:-1:-1;;54031:16:0;;;;:7;:16;;;;;;54024:23;;-1:-1:-1;;;;;;54024:23:0;;;54065:36;54039:7;;54031:16;-1:-1:-1;;;;;54065:36:0;;;;;54031:16;;54065:36;63254:18:::1;63115:165:::0;:::o;26960:716::-;27384:23;27410:69;27438:4;27410:69;;;;;;;;;;;;;;;;;27418:5;-1:-1:-1;;;;;27410:27:0;;;:69;;;;;:::i;:::-;27494:17;;27384:95;;-1:-1:-1;27494:21:0;27490:179;;27591:10;27580:30;;;;;;;;;;;;:::i;:::-;27572:85;;;;-1:-1:-1;;;27572:85:0;;22142:2:1;27572:85:0;;;22124:21:1;22181:2;22161:18;;;22154:30;22220:34;22200:18;;;22193:62;-1:-1:-1;;;22271:18:1;;;22264:40;22321:19;;27572:85:0;21940:406:1;52087:110:0;52163:26;52173:2;52177:7;52163:26;;;;;;;;;;;;:9;:26::i;56445:799::-;56600:4;-1:-1:-1;;;;;56621:13:0;;16715:19;:23;56617:620;;56657:72;;-1:-1:-1;;;56657:72:0;;-1:-1:-1;;;;;56657:36:0;;;;;:72;;10205:10;;56708:4;;56714:7;;56723:5;;56657:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56657:72:0;;;;;;;;-1:-1:-1;;56657:72:0;;;;;;;;;;;;:::i;:::-;;;56653:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56899:13:0;;56895:272;;56942:60;;-1:-1:-1;;;56942:60:0;;;;;;;:::i;56895:272::-;57117:6;57111:13;57102:6;57098:2;57094:15;57087:38;56653:529;-1:-1:-1;;;;;;56780:51:0;-1:-1:-1;;;56780:51:0;;-1:-1:-1;56773:58:0;;56617:620;-1:-1:-1;57221:4:0;56445:799;;;;;;:::o;19165:229::-;19302:12;19334:52;19356:6;19364:4;19370:1;19373:12;19334:21;:52::i;52424:321::-;52554:18;52560:2;52564:7;52554:5;:18::i;:::-;52605:54;52636:1;52640:2;52644:7;52653:5;52605:22;:54::i;:::-;52583:154;;;;-1:-1:-1;;;52583:154:0;;;;;;;:::i;20285:510::-;20455:12;20513:5;20488:21;:30;;20480:81;;;;-1:-1:-1;;;20480:81:0;;23301:2:1;20480:81:0;;;23283:21:1;23340:2;23320:18;;;23313:30;23379:34;23359:18;;;23352:62;-1:-1:-1;;;23430:18:1;;;23423:36;23476:19;;20480:81:0;23099:402:1;20480:81:0;-1:-1:-1;;;;;16715:19:0;;;20572:60;;;;-1:-1:-1;;;20572:60:0;;23708:2:1;20572:60:0;;;23690:21:1;23747:2;23727:18;;;23720:30;23786:31;23766:18;;;23759:59;23835:18;;20572:60:0;23506:353:1;20572:60:0;20646:12;20660:23;20687:6;-1:-1:-1;;;;;20687:11:0;20706:5;20713:4;20687:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20645:73;;;;20736:51;20753:7;20762:10;20774:12;20736:16;:51::i;:::-;20729:58;20285:510;-1:-1:-1;;;;;;;20285:510:0:o;53081:439::-;-1:-1:-1;;;;;53161:16:0;;53153:61;;;;-1:-1:-1;;;53153:61:0;;24345:2:1;53153:61:0;;;24327:21:1;;;24364:18;;;24357:30;24423:34;24403:18;;;24396:62;24475:18;;53153:61:0;24143:356:1;53153:61:0;51168:4;51192:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51192:16:0;:30;53225:58;;;;-1:-1:-1;;;53225:58:0;;24706:2:1;53225:58:0;;;24688:21:1;24745:2;24725:18;;;24718:30;24784;24764:18;;;24757:58;24832:18;;53225:58:0;24504:352:1;53225:58:0;-1:-1:-1;;;;;53354:13:0;;;;;;:9;:13;;;;;:18;;53371:1;;53354:13;:18;;53371:1;;53354:18;:::i;:::-;;;;-1:-1:-1;;53383:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;53383:21:0;-1:-1:-1;;;;;53383:21:0;;;;;;;;53422:33;;53383:16;;;53422:33;;53383:16;;53422:33;63254:18:::1;63115:165:::0;:::o;22971:712::-;23121:12;23150:7;23146:530;;;-1:-1:-1;23181:10:0;23174:17;;23146:530;23295:17;;:21;23291:374;;23493:10;23487:17;23554:15;23541:10;23537:2;23533:19;23526:44;23291:374;23636:12;23629:20;;-1:-1:-1;;;23629:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;293:131:1;-1:-1:-1;;;;;;367:32:1;;357:43;;347:71;;414:1;411;404:12;429:245;487:6;540:2;528:9;519:7;515:23;511:32;508:52;;;556:1;553;546:12;508:52;595:9;582:23;614:30;638:5;614:30;:::i;871:258::-;943:1;953:113;967:6;964:1;961:13;953:113;;;1043:11;;;1037:18;1024:11;;;1017:39;989:2;982:10;953:113;;;1084:6;1081:1;1078:13;1075:48;;;-1:-1:-1;;1119:1:1;1101:16;;1094:27;871:258::o;1134:::-;1176:3;1214:5;1208:12;1241:6;1236:3;1229:19;1257:63;1313:6;1306:4;1301:3;1297:14;1290:4;1283:5;1279:16;1257:63;:::i;:::-;1374:2;1353:15;-1:-1:-1;;1349:29:1;1340:39;;;;1381:4;1336:50;;1134:258;-1:-1:-1;;1134:258:1:o;1397:220::-;1546:2;1535:9;1528:21;1509:4;1566:45;1607:2;1596:9;1592:18;1584:6;1566:45;:::i;1622:180::-;1681:6;1734:2;1722:9;1713:7;1709:23;1705:32;1702:52;;;1750:1;1747;1740:12;1702:52;-1:-1:-1;1773:23:1;;1622:180;-1:-1:-1;1622:180:1:o;2015:131::-;-1:-1:-1;;;;;2090:31:1;;2080:42;;2070:70;;2136:1;2133;2126:12;2151:315;2219:6;2227;2280:2;2268:9;2259:7;2255:23;2251:32;2248:52;;;2296:1;2293;2286:12;2248:52;2335:9;2322:23;2354:31;2379:5;2354:31;:::i;:::-;2404:5;2456:2;2441:18;;;;2428:32;;-1:-1:-1;;;2151:315:1:o;2471:118::-;2557:5;2550:13;2543:21;2536:5;2533:32;2523:60;;2579:1;2576;2569:12;2594:241;2650:6;2703:2;2691:9;2682:7;2678:23;2674:32;2671:52;;;2719:1;2716;2709:12;2671:52;2758:9;2745:23;2777:28;2799:5;2777:28;:::i;3022:255::-;3089:6;3142:2;3130:9;3121:7;3117:23;3113:32;3110:52;;;3158:1;3155;3148:12;3110:52;3197:9;3184:23;3216:31;3241:5;3216:31;:::i;3282:456::-;3359:6;3367;3375;3428:2;3416:9;3407:7;3403:23;3399:32;3396:52;;;3444:1;3441;3434:12;3396:52;3483:9;3470:23;3502:31;3527:5;3502:31;:::i;:::-;3552:5;-1:-1:-1;3609:2:1;3594:18;;3581:32;3622:33;3581:32;3622:33;:::i;:::-;3282:456;;3674:7;;-1:-1:-1;;;3728:2:1;3713:18;;;;3700:32;;3282:456::o;3743:402::-;3825:6;3833;3886:2;3874:9;3865:7;3861:23;3857:32;3854:52;;;3902:1;3899;3892:12;3854:52;3941:9;3928:23;3960:31;3985:5;3960:31;:::i;:::-;4010:5;-1:-1:-1;4067:2:1;4052:18;;4039:32;4080:33;4039:32;4080:33;:::i;:::-;4132:7;4122:17;;;3743:402;;;;;:::o;4402:632::-;4573:2;4625:21;;;4695:13;;4598:18;;;4717:22;;;4544:4;;4573:2;4796:15;;;;4770:2;4755:18;;;4544:4;4839:169;4853:6;4850:1;4847:13;4839:169;;;4914:13;;4902:26;;4983:15;;;;4948:12;;;;4875:1;4868:9;4839:169;;;-1:-1:-1;5025:3:1;;4402:632;-1:-1:-1;;;;;;4402:632:1:o;5039:127::-;5100:10;5095:3;5091:20;5088:1;5081:31;5131:4;5128:1;5121:15;5155:4;5152:1;5145:15;5171:632;5236:5;5266:18;5307:2;5299:6;5296:14;5293:40;;;5313:18;;:::i;:::-;5388:2;5382:9;5356:2;5442:15;;-1:-1:-1;;5438:24:1;;;5464:2;5434:33;5430:42;5418:55;;;5488:18;;;5508:22;;;5485:46;5482:72;;;5534:18;;:::i;:::-;5574:10;5570:2;5563:22;5603:6;5594:15;;5633:6;5625;5618:22;5673:3;5664:6;5659:3;5655:16;5652:25;5649:45;;;5690:1;5687;5680:12;5649:45;5740:6;5735:3;5728:4;5720:6;5716:17;5703:44;5795:1;5788:4;5779:6;5771;5767:19;5763:30;5756:41;;;;5171:632;;;;;:::o;5808:451::-;5877:6;5930:2;5918:9;5909:7;5905:23;5901:32;5898:52;;;5946:1;5943;5936:12;5898:52;5986:9;5973:23;6019:18;6011:6;6008:30;6005:50;;;6051:1;6048;6041:12;6005:50;6074:22;;6127:4;6119:13;;6115:27;-1:-1:-1;6105:55:1;;6156:1;6153;6146:12;6105:55;6179:74;6245:7;6240:2;6227:16;6222:2;6218;6214:11;6179:74;:::i;6264:382::-;6329:6;6337;6390:2;6378:9;6369:7;6365:23;6361:32;6358:52;;;6406:1;6403;6396:12;6358:52;6445:9;6432:23;6464:31;6489:5;6464:31;:::i;:::-;6514:5;-1:-1:-1;6571:2:1;6556:18;;6543:32;6584:30;6543:32;6584:30;:::i;6651:795::-;6746:6;6754;6762;6770;6823:3;6811:9;6802:7;6798:23;6794:33;6791:53;;;6840:1;6837;6830:12;6791:53;6879:9;6866:23;6898:31;6923:5;6898:31;:::i;:::-;6948:5;-1:-1:-1;7005:2:1;6990:18;;6977:32;7018:33;6977:32;7018:33;:::i;:::-;7070:7;-1:-1:-1;7124:2:1;7109:18;;7096:32;;-1:-1:-1;7179:2:1;7164:18;;7151:32;7206:18;7195:30;;7192:50;;;7238:1;7235;7228:12;7192:50;7261:22;;7314:4;7306:13;;7302:27;-1:-1:-1;7292:55:1;;7343:1;7340;7333:12;7292:55;7366:74;7432:7;7427:2;7414:16;7409:2;7405;7401:11;7366:74;:::i;:::-;7356:84;;;6651:795;;;;;;;:::o;8110:315::-;8178:6;8186;8239:2;8227:9;8218:7;8214:23;8210:32;8207:52;;;8255:1;8252;8245:12;8207:52;8291:9;8278:23;8268:33;;8351:2;8340:9;8336:18;8323:32;8364:31;8389:5;8364:31;:::i;8430:380::-;8509:1;8505:12;;;;8552;;;8573:61;;8627:4;8619:6;8615:17;8605:27;;8573:61;8680:2;8672:6;8669:14;8649:18;8646:38;8643:161;;;8726:10;8721:3;8717:20;8714:1;8707:31;8761:4;8758:1;8751:15;8789:4;8786:1;8779:15;8643:161;;8430:380;;;:::o;10055:356::-;10257:2;10239:21;;;10276:18;;;10269:30;10335:34;10330:2;10315:18;;10308:62;10402:2;10387:18;;10055:356::o;10416:402::-;10618:2;10600:21;;;10657:2;10637:18;;;10630:30;10696:34;10691:2;10676:18;;10669:62;-1:-1:-1;;;10762:2:1;10747:18;;10740:36;10808:3;10793:19;;10416:402::o;10823:127::-;10884:10;10879:3;10875:20;10872:1;10865:31;10915:4;10912:1;10905:15;10939:4;10936:1;10929:15;10955:128;10995:3;11026:1;11022:6;11019:1;11016:13;11013:39;;;11032:18;;:::i;:::-;-1:-1:-1;11068:9:1;;10955:128::o;11088:407::-;11290:2;11272:21;;;11329:2;11309:18;;;11302:30;11368:34;11363:2;11348:18;;11341:62;-1:-1:-1;;;11434:2:1;11419:18;;11412:41;11485:3;11470:19;;11088:407::o;11787:413::-;11989:2;11971:21;;;12028:2;12008:18;;;12001:30;12067:34;12062:2;12047:18;;12040:62;-1:-1:-1;;;12133:2:1;12118:18;;12111:47;12190:3;12175:19;;11787:413::o;13268:135::-;13307:3;-1:-1:-1;;13328:17:1;;13325:43;;;13348:18;;:::i;:::-;-1:-1:-1;13395:1:1;13384:13;;13268:135::o;13408:127::-;13469:10;13464:3;13460:20;13457:1;13450:31;13500:4;13497:1;13490:15;13524:4;13521:1;13514:15;13540:184;13610:6;13663:2;13651:9;13642:7;13638:23;13634:32;13631:52;;;13679:1;13676;13669:12;13631:52;-1:-1:-1;13702:16:1;;13540:184;-1:-1:-1;13540:184:1:o;16300:168::-;16340:7;16406:1;16402;16398:6;16394:14;16391:1;16388:21;16383:1;16376:9;16369:17;16365:45;16362:71;;;16413:18;;:::i;:::-;-1:-1:-1;16453:9:1;;16300:168::o;17929:217::-;17969:1;17995;17985:132;;18039:10;18034:3;18030:20;18027:1;18020:31;18074:4;18071:1;18064:15;18102:4;18099:1;18092:15;17985:132;-1:-1:-1;18131:9:1;;17929:217::o;18151:125::-;18191:4;18219:1;18216;18213:8;18210:34;;;18224:18;;:::i;:::-;-1:-1:-1;18261:9:1;;18151:125::o;21271:414::-;21473:2;21455:21;;;21512:2;21492:18;;;21485:30;21551:34;21546:2;21531:18;;21524:62;-1:-1:-1;;;21617:2:1;21602:18;;21595:48;21675:3;21660:19;;21271:414::o;21690:245::-;21757:6;21810:2;21798:9;21789:7;21785:23;21781:32;21778:52;;;21826:1;21823;21816:12;21778:52;21858:9;21852:16;21877:28;21899:5;21877:28;:::i;22351:489::-;-1:-1:-1;;;;;22620:15:1;;;22602:34;;22672:15;;22667:2;22652:18;;22645:43;22719:2;22704:18;;22697:34;;;22767:3;22762:2;22747:18;;22740:31;;;22545:4;;22788:46;;22814:19;;22806:6;22788:46;:::i;:::-;22780:54;22351:489;-1:-1:-1;;;;;;22351:489:1:o;22845:249::-;22914:6;22967:2;22955:9;22946:7;22942:23;22938:32;22935:52;;;22983:1;22980;22973:12;22935:52;23015:9;23009:16;23034:30;23058:5;23034:30;:::i;23864:274::-;23993:3;24031:6;24025:13;24047:53;24093:6;24088:3;24081:4;24073:6;24069:17;24047:53;:::i;:::-;24116:16;;;;;23864:274;-1:-1:-1;;23864:274:1:o

Swarm Source

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