ETH Price: $2,292.09 (+1.23%)

YGME (YGME)
 

Overview

TokenID

6799

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
YGME

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-04
*/

// SPDX-License-Identifier: MIT

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

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)


/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}




library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}



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




/**
 * @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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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);
    }
}



/**
 * @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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}



/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}



/**
 * @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);
}




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



/**
 * @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`.
     *
     * 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;

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}



/**
 * @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);
}










/**
 * @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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

    /**
     * @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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    function _orgURI() 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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

    /**
     * @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, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}



interface IERC20 {

    function decimals() external view returns (uint8);


    function transfer(address to, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

interface IERC20USDT {

    function transferFrom(address from, address to, uint value) external;
    function transfer(address to, uint value) external;
}

contract YGME is ERC721, Ownable {
    using Counters for Counters.Counter;
    using SafeMath for uint256;

    Counters.Counter  _tokenIdCounter;

    uint256  MAX = 30000;

    uint256 public PAY = 300000000;

    uint256 public MinMax = 20;

    mapping(address => bool) public isWhite;

    mapping(address => address) public recommender;

    uint256 public maxLevel = 3;
    mapping(uint256 => uint256) public rewardLevelAmount;

    address  receicve_address_first;
    uint256  receicve_amount_first;

    address  receicve_address_second;
    uint256  receicve_amount_second;


    bool public start = true;


    bool lock;

    IERC20USDT payCon;

    IERC20 rewardCon;

    string public baseUri; 
    string public orgUri; 

    constructor(address pay, address reward) ERC721("YGME", "YGME") {
        
        payCon = IERC20USDT(pay);
        
        rewardCon = IERC20(reward);

        _tokenIdCounter.reset();
    }

    function _baseURI() internal view override returns (string memory) {
        return baseUri;
    }

    function _orgURI() internal view override returns (string memory) {
        return orgUri;
    }

    function setBaseURI(string calldata _baseUri) external  onlyOwner  {
        baseUri = _baseUri;
    }

    function setOrgURI(string calldata _orgUri) external  onlyOwner  {
        orgUri = _orgUri;
    }

    function swap(address to, address _recommender, uint mintNum) external onlyWhiter mintMax(mintNum) isLock {
        
        if(recommender[to] == address(0)){
           recommender[to] = _recommender;
        }
        
        for(uint i = 0; i < mintNum; i++){
            _safeMint(to);
        }

    }


    function safeMint(address _recommender, uint mintNum) external checkRecommender(_recommender) mintMax(mintNum) isLock{
        require(start, "no start");
        address from = _msgSender();
        address self = address(this);
        
        payCon.transferFrom(from, self, PAY.mul(mintNum));
        distribute(mintNum);

        for(uint i = 0; i < mintNum; i++){
            _safeMint(from);
        }
      
        _rewardMint(from, mintNum);

    }


    function setPay(uint256 pay) external onlyOwner  {
        if(PAY != pay){
            PAY =  pay;
        }
    }


    function setStart() external onlyOwner  {
        start = !start;
    }


    function setWhite(address _white) external  onlyOwner  {
        isWhite[_white] = !isWhite[_white];
    }


    function setMaxMint(uint256 max) external onlyOwner  {
        if(MinMax != max){
            MinMax = max;
        }
    }

    function setMaxLevel(uint256 max) external onlyOwner  {
        if(max != maxLevel){
            maxLevel = max;
        }
    }


    function setLevelAmount(uint level, uint amount) external  onlyOwner  {
        require(level <= maxLevel, "level invalid");
        if(rewardLevelAmount[level] != amount){
            rewardLevelAmount[level] = amount;
        }
    }


    function setReceiveFirst(address first, uint amount) external  onlyOwner  {
        receicve_address_first = first;
        receicve_amount_first = amount;
    }


    function setReceiveSecond(address second, uint amount) external  onlyOwner {
        receicve_address_second = second;
        receicve_amount_second = amount;
    }

    function withdrawPay(address addr, uint256 amount) external  onlyOwner {
        payCon.transfer(addr, amount);
    }

    function withdrawRewar(address addr, uint256 amount) external  onlyOwner {
        rewardCon.transfer(addr, amount);
    }

    function getReceiveFirst() external view onlyOwner returns(address, uint256) {
        return (receicve_address_first, receicve_amount_first);
    }

    function getReceiveSecond() external view onlyOwner returns(address, uint256){
        return (receicve_address_second, receicve_amount_second);
    }

    function distribute(uint mintNum) private {
        address zero = address(0);
        if(receicve_address_first != zero && 0 != receicve_amount_first){
            payCon.transfer(receicve_address_first, receicve_amount_first.mul(mintNum));
        }

        if(receicve_address_second != zero && 0 != receicve_amount_second){
            payCon.transfer(receicve_address_second, receicve_amount_second.mul(mintNum));
        }
    }



    function _safeMint(address to) private {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
    }



    function _rewardMint(address to, uint mintNum) private {
       
       address rewward;
       address zero = address(0);
       for (uint i = 0; i <= maxLevel; i++){
           if(0 == i){
               rewward = to;
           }else{
               rewward = recommender[rewward];
           }
         
           if(rewward != zero && 0 != rewardLevelAmount[i]){
               rewardCon.transfer(rewward, rewardLevelAmount[i].mul(mintNum));
           }
           
       }
        
    }



    modifier onlyWhiter {

        address sender = _msgSender();
        
        require(isWhite[sender] || sender == owner(), "not whiter");

        _;

    }


    modifier checkRecommender(address _recommender) {
        require(_recommender != address(0), "recommender can not be zero");
        require(_recommender != msg.sender, "recommender can not be self");
        require(0 < balanceOf(_recommender), "invalid recommender");
        
        if(recommender[msg.sender] == address(0)){
            recommender[msg.sender] = _recommender;
        }else{
            require(recommender[msg.sender] == _recommender, "recommender is different");
        }

        _;

    }



    modifier isLock {
        
        require(!lock, "wait for other to mint ");
        lock = true;
        _;
        lock = false;

    }


    modifier mintMax(uint mintNum) {
        require(0 < mintNum && mintNum <= MinMax, "mintNum invalid");
        require(MAX >= _tokenIdCounter.current() + mintNum - 1, "already minted token of max");
        _;

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"pay","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MinMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReceiveFirst","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReceiveSecond","outputs":[{"internalType":"address","name":"","type":"address"},{"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":[{"internalType":"address","name":"","type":"address"}],"name":"isWhite","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLevel","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":"orgUri","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":[{"internalType":"address","name":"","type":"address"}],"name":"recommender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardLevelAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recommender","type":"address"},{"internalType":"uint256","name":"mintNum","type":"uint256"}],"name":"safeMint","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":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLevelAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_orgUri","type":"string"}],"name":"setOrgURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pay","type":"uint256"}],"name":"setPay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"first","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setReceiveFirst","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"second","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setReceiveSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_white","type":"address"}],"name":"setWhite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"_recommender","type":"address"},{"internalType":"uint256","name":"mintNum","type":"uint256"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawPay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawRewar","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526175306008556311e1a3006009556014600a556003600d556001601360006101000a81548160ff0219169083151502179055503480156200004457600080fd5b50604051620052163803806200521683398181016040528101906200006a919062000302565b6040518060400160405280600481526020017f59474d45000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f59474d45000000000000000000000000000000000000000000000000000000008152508160009081620000e79190620005c3565b508060019081620000f99190620005c3565b5050506200011c62000110620001bd60201b60201c565b620001c560201b60201c565b81601360026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001b560076200028b60201b62001db91760201c565b5050620006aa565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000018190555050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002ca826200029d565b9050919050565b620002dc81620002bd565b8114620002e857600080fd5b50565b600081519050620002fc81620002d1565b92915050565b600080604083850312156200031c576200031b62000298565b5b60006200032c85828601620002eb565b92505060206200033f85828601620002eb565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003cb57607f821691505b602082108103620003e157620003e062000383565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200044b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200040c565b6200045786836200040c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004a46200049e62000498846200046f565b62000479565b6200046f565b9050919050565b6000819050919050565b620004c08362000483565b620004d8620004cf82620004ab565b84845462000419565b825550505050565b600090565b620004ef620004e0565b620004fc818484620004b5565b505050565b5b81811015620005245762000518600082620004e5565b60018101905062000502565b5050565b601f82111562000573576200053d81620003e7565b6200054884620003fc565b8101602085101562000558578190505b620005706200056785620003fc565b83018262000501565b50505b505050565b600082821c905092915050565b6000620005986000198460080262000578565b1980831691505092915050565b6000620005b3838362000585565b9150826002028217905092915050565b620005ce8262000349565b67ffffffffffffffff811115620005ea57620005e962000354565b5b620005f68254620003b2565b6200060382828562000528565b600060209050601f8311600181146200063b576000841562000626578287015190505b620006328582620005a5565b865550620006a2565b601f1984166200064b86620003e7565b60005b8281101562000675578489015182556001820191506020850194506020810190506200064e565b8683101562000695578489015162000691601f89168262000585565b8355505b6001600288020188555050505b505050505050565b614b5c80620006ba6000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c806372e7ef2911610146578063b2bb3926116100c3578063cc06c35911610087578063cc06c359146106a8578063df791e50146106c6578063e27e465e146106e2578063e985e9c514610712578063ee534c3e14610742578063f2fde38b1461076057610253565b8063b2bb392614610603578063b88d4fde14610622578063be9a65551461063e578063c03646ba1461065c578063c87b56dd1461067857610253565b8063976138c11161010a578063976138c11461054d5780639abc83201461057d578063a14481941461059b578063a22cb465146105b7578063a348c289146105d357610253565b806372e7ef29146104b957806380d1f302146104d757806387822c8b146104f35780638da5cb5b1461051157806395d89b411461052f57610253565b806335975a37116101d4578063547520fe11610198578063547520fe1461041757806355f804b3146104335780636352211e1461044f57806370a082311461047f578063715018a6146104af57610253565b806335975a371461039a57806338d89cd3146103a45780633e6ac6ae146103c057806342842e0e146103df57806343baf6d8146103fb57610253565b806309cac7fb1161021b57806309cac7fb1461030e57806323b872dd1461032a5780632d7490cd146103465780632dbb7d6714610362578063344f1ba51461037e57610253565b806301ffc9a714610258578063065f7b571461028857806306fdde03146102a4578063081812fc146102c2578063095ea7b3146102f2575b600080fd5b610272600480360381019061026d91906133eb565b61077c565b60405161027f9190613433565b60405180910390f35b6102a2600480360381019061029d9190613484565b61085e565b005b6102ac6108e2565b6040516102b99190613554565b60405180910390f35b6102dc60048036038101906102d79190613576565b610974565b6040516102e991906135e4565b60405180910390f35b61030c6004803603810190610307919061362b565b6109ba565b005b61032860048036038101906103239190613576565b610ad1565b005b610344600480360381019061033f919061366b565b610aed565b005b610360600480360381019061035b919061362b565b610b4d565b005b61037c6004803603810190610377919061362b565b610ba1565b005b61039860048036038101906103939190613576565b610c4e565b005b6103a2610c6a565b005b6103be60048036038101906103b99190613723565b610c9e565b005b6103c8610cbc565b6040516103d692919061377f565b60405180910390f35b6103f960048036038101906103f4919061366b565b610cf5565b005b6104156004803603810190610410919061362b565b610d15565b005b610431600480360381019061042c9190613576565b610d69565b005b61044d60048036038101906104489190613723565b610d85565b005b61046960048036038101906104649190613576565b610da3565b60405161047691906135e4565b60405180910390f35b610499600480360381019061049491906137a8565b610e29565b6040516104a691906137d5565b60405180910390f35b6104b7610ee0565b005b6104c1610ef4565b6040516104ce91906137d5565b60405180910390f35b6104f160048036038101906104ec919061362b565b610efa565b005b6104fb610f95565b60405161050891906137d5565b60405180910390f35b610519610f9b565b60405161052691906135e4565b60405180910390f35b610537610fc5565b6040516105449190613554565b60405180910390f35b610567600480360381019061056291906137a8565b611057565b60405161057491906135e4565b60405180910390f35b61058561108a565b6040516105929190613554565b60405180910390f35b6105b560048036038101906105b0919061362b565b611118565b005b6105d160048036038101906105cc919061381c565b6116aa565b005b6105ed60048036038101906105e891906137a8565b6116c0565b6040516105fa9190613433565b60405180910390f35b61060b6116e0565b60405161061992919061377f565b60405180910390f35b61063c6004803603810190610637919061398c565b611719565b005b61064661177b565b6040516106539190613433565b60405180910390f35b610676600480360381019061067191906137a8565b61178e565b005b610692600480360381019061068d9190613576565b61183d565b60405161069f9190613554565b60405180910390f35b6106b06118a3565b6040516106bd91906137d5565b60405180910390f35b6106e060048036038101906106db919061366b565b6118a9565b005b6106fc60048036038101906106f79190613576565b611bfc565b60405161070991906137d5565b60405180910390f35b61072c60048036038101906107279190613a0f565b611c14565b6040516107399190613433565b60405180910390f35b61074a611ca8565b6040516107579190613554565b60405180910390f35b61077a600480360381019061077591906137a8565b611d36565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610857575061085682611dc6565b5b9050919050565b610866611e30565b600d548211156108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a290613a9b565b60405180910390fd5b80600e600084815260200190815260200160002054146108de5780600e6000848152602001908152602001600020819055505b5050565b6060600080546108f190613aea565b80601f016020809104026020016040519081016040528092919081815260200182805461091d90613aea565b801561096a5780601f1061093f5761010080835404028352916020019161096a565b820191906000526020600020905b81548152906001019060200180831161094d57829003601f168201915b5050505050905090565b600061097f82611eae565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c582610da3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613b8d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a54611ef9565b73ffffffffffffffffffffffffffffffffffffffff161480610a835750610a8281610a7d611ef9565b611c14565b5b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613c1f565b60405180910390fd5b610acc8383611f01565b505050565b610ad9611e30565b8060095414610aea57806009819055505b50565b610afe610af8611ef9565b82611fba565b610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490613cb1565b60405180910390fd5b610b4883838361204f565b505050565b610b55611e30565b81601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806012819055505050565b610ba9611e30565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610c0692919061377f565b6020604051808303816000875af1158015610c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c499190613ce6565b505050565b610c56611e30565b600d548114610c675780600d819055505b50565b610c72611e30565b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b610ca6611e30565b818160169182610cb7929190613eca565b505050565b600080610cc7611e30565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601054915091509091565b610d1083838360405180602001604052806000815250611719565b505050565b610d1d611e30565b81600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806010819055505050565b610d71611e30565b80600a5414610d825780600a819055505b50565b610d8d611e30565b818160159182610d9e929190613eca565b505050565b600080610daf83612348565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1790613fe6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614078565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ee8611e30565b610ef26000612385565b565b60095481565b610f02611e30565b601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610f5f92919061377f565b600060405180830381600087803b158015610f7957600080fd5b505af1158015610f8d573d6000803e3d6000fd5b505050505050565b600a5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fd490613aea565b80601f016020809104026020016040519081016040528092919081815260200182805461100090613aea565b801561104d5780601f106110225761010080835404028352916020019161104d565b820191906000526020600020905b81548152906001019060200180831161103057829003601f168201915b5050505050905090565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6015805461109790613aea565b80601f01602080910402602001604051908101604052809291908181526020018280546110c390613aea565b80156111105780601f106110e557610100808354040283529160200191611110565b820191906000526020600020905b8154815290600101906020018083116110f357829003601f168201915b505050505081565b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f906140e4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90614150565b60405180910390fd5b6111ff81610e29565b600010611241576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611238906141bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113575780600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611425565b8073ffffffffffffffffffffffffffffffffffffffff16600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90614228565b60405180910390fd5b5b818060001080156114385750600a548111155b611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90614294565b60405180910390fd5b600181611484600761244b565b61148e91906142e3565b6114989190614317565b60085410156114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390614397565b60405180910390fd5b601360019054906101000a900460ff161561152c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152390614403565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550601360009054906101000a900460ff16611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d9061446f565b60405180910390fd5b60006115a0611ef9565b90506000309050601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd83836115fc8960095461245990919063ffffffff16565b6040518463ffffffff1660e01b815260040161161a9392919061448f565b600060405180830381600087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b505050506116558561246f565b60005b8581101561167c57611669836126cd565b8080611674906144c6565b915050611658565b5061168782866126f3565b50506000601360016101000a81548160ff02191690831515021790555050505050565b6116bc6116b5611ef9565b83836128af565b5050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000806116eb611e30565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601254915091509091565b61172a611724611ef9565b83611fba565b611769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176090613cb1565b60405180910390fd5b61177584848484612a1b565b50505050565b601360009054906101000a900460ff1681565b611796611e30565b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606061184882611eae565b6000611852612a77565b9050600061185e612b09565b9050600081511161186f578161189a565b8061187985612b9b565b60405160200161188a92919061454a565b6040516020818303038152906040525b92505050919050565b600d5481565b60006118b3611ef9565b9050600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061193f5750611910610f9b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61197e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611975906145ba565b60405180910390fd5b818060001080156119915750600a548111155b6119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c790614294565b60405180910390fd5b6001816119dd600761244b565b6119e791906142e3565b6119f19190614317565b6008541015611a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2c90614397565b60405180910390fd5b601360019054906101000a900460ff1615611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90614403565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff16600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611bb25783600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60005b83811015611bd957611bc6866126cd565b8080611bd1906144c6565b915050611bb5565b506000601360016101000a81548160ff0219169083151502179055505050505050565b600e6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60168054611cb590613aea565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce190613aea565b8015611d2e5780601f10611d0357610100808354040283529160200191611d2e565b820191906000526020600020905b815481529060010190602001808311611d1157829003601f168201915b505050505081565b611d3e611e30565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da49061464c565b60405180910390fd5b611db681612385565b50565b6001816000018190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e38611ef9565b73ffffffffffffffffffffffffffffffffffffffff16611e56610f9b565b73ffffffffffffffffffffffffffffffffffffffff1614611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea3906146b8565b60405180910390fd5b565b611eb781612c69565b611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed90613fe6565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f7483610da3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fc683610da3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061200857506120078185611c14565b5b8061204657508373ffffffffffffffffffffffffffffffffffffffff1661202e84610974565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661206f82610da3565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc9061474a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b906147dc565b60405180910390fd5b6121418383836001612caa565b8273ffffffffffffffffffffffffffffffffffffffff1661216182610da3565b73ffffffffffffffffffffffffffffffffffffffff16146121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae9061474a565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123438383836001612dd0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6000818361246791906147fc565b905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156124d25750601054600014155b1561259d57601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661254d8560105461245990919063ffffffff16565b6040518363ffffffff1660e01b815260040161256a92919061377f565b600060405180830381600087803b15801561258457600080fd5b505af1158015612598573d6000803e3d6000fd5b505050505b8073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156125fe5750601254600014155b156126c957601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166126798560125461245990919063ffffffff16565b6040518363ffffffff1660e01b815260040161269692919061377f565b600060405180830381600087803b1580156126b057600080fd5b505af11580156126c4573d6000803e3d6000fd5b505050505b5050565b60006126d9600761244b565b90506126e56007612dd6565b6126ef8282612dec565b5050565b6000806000905060005b600d5481116128a8578060000361271657849250612779565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127c95750600e600082815260200190815260200160002054600014155b1561289557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8461283387600e60008781526020019081526020016000205461245990919063ffffffff16565b6040518363ffffffff1660e01b815260040161285092919061377f565b6020604051808303816000875af115801561286f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128939190613ce6565b505b80806128a0906144c6565b9150506126fd565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361291d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129149061488a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a0e9190613433565b60405180910390a3505050565b612a2684848461204f565b612a3284848484612e0a565b612a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a689061491c565b60405180910390fd5b50505050565b606060158054612a8690613aea565b80601f0160208091040260200160405190810160405280929190818152602001828054612ab290613aea565b8015612aff5780601f10612ad457610100808354040283529160200191612aff565b820191906000526020600020905b815481529060010190602001808311612ae257829003601f168201915b5050505050905090565b606060168054612b1890613aea565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4490613aea565b8015612b915780601f10612b6657610100808354040283529160200191612b91565b820191906000526020600020905b815481529060010190602001808311612b7457829003601f168201915b5050505050905090565b606060006001612baa84612f91565b01905060008167ffffffffffffffff811115612bc957612bc8613861565b5b6040519080825280601f01601f191660200182016040528015612bfb5781602001600182028036833780820191505090505b509050600082602001820190505b600115612c5e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612c5257612c5161493c565b5b04945060008503612c09575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612c8b83612348565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115612dca57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d3e5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d369190614317565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dc95780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dc191906142e3565b925050819055505b5b50505050565b50505050565b6001816000016000828254019250508190555050565b612e068282604051806020016040528060008152506130e4565b5050565b6000612e2b8473ffffffffffffffffffffffffffffffffffffffff1661313f565b15612f84578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e54611ef9565b8786866040518563ffffffff1660e01b8152600401612e7694939291906149c0565b6020604051808303816000875af1925050508015612eb257506040513d601f19601f82011682018060405250810190612eaf9190614a21565b60015b612f34573d8060008114612ee2576040519150601f19603f3d011682016040523d82523d6000602084013e612ee7565b606091505b506000815103612f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f239061491c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f89565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fef577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612fe557612fe461493c565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061302c576d04ee2d6d415b85acef810000000083816130225761302161493c565b5b0492506020810190505b662386f26fc10000831061305b57662386f26fc1000083816130515761305061493c565b5b0492506010810190505b6305f5e1008310613084576305f5e100838161307a5761307961493c565b5b0492506008810190505b61271083106130a957612710838161309f5761309e61493c565b5b0492506004810190505b606483106130cc57606483816130c2576130c161493c565b5b0492506002810190505b600a83106130db576001810190505b80915050919050565b6130ee8383613162565b6130fb6000848484612e0a565b61313a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131319061491c565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036131d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c890614a9a565b60405180910390fd5b6131da81612c69565b1561321a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321190614b06565b60405180910390fd5b613228600083836001612caa565b61323181612c69565b15613271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326890614b06565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461337b600083836001612dd0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133c881613393565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b60006020828403121561340157613400613389565b5b600061340f848285016133d6565b91505092915050565b60008115159050919050565b61342d81613418565b82525050565b60006020820190506134486000830184613424565b92915050565b6000819050919050565b6134618161344e565b811461346c57600080fd5b50565b60008135905061347e81613458565b92915050565b6000806040838503121561349b5761349a613389565b5b60006134a98582860161346f565b92505060206134ba8582860161346f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134fe5780820151818401526020810190506134e3565b60008484015250505050565b6000601f19601f8301169050919050565b6000613526826134c4565b61353081856134cf565b93506135408185602086016134e0565b6135498161350a565b840191505092915050565b6000602082019050818103600083015261356e818461351b565b905092915050565b60006020828403121561358c5761358b613389565b5b600061359a8482850161346f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135ce826135a3565b9050919050565b6135de816135c3565b82525050565b60006020820190506135f960008301846135d5565b92915050565b613608816135c3565b811461361357600080fd5b50565b600081359050613625816135ff565b92915050565b6000806040838503121561364257613641613389565b5b600061365085828601613616565b92505060206136618582860161346f565b9150509250929050565b60008060006060848603121561368457613683613389565b5b600061369286828701613616565b93505060206136a386828701613616565b92505060406136b48682870161346f565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126136e3576136e26136be565b5b8235905067ffffffffffffffff811115613700576136ff6136c3565b5b60208301915083600182028301111561371c5761371b6136c8565b5b9250929050565b6000806020838503121561373a57613739613389565b5b600083013567ffffffffffffffff8111156137585761375761338e565b5b613764858286016136cd565b92509250509250929050565b6137798161344e565b82525050565b600060408201905061379460008301856135d5565b6137a16020830184613770565b9392505050565b6000602082840312156137be576137bd613389565b5b60006137cc84828501613616565b91505092915050565b60006020820190506137ea6000830184613770565b92915050565b6137f981613418565b811461380457600080fd5b50565b600081359050613816816137f0565b92915050565b6000806040838503121561383357613832613389565b5b600061384185828601613616565b925050602061385285828601613807565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138998261350a565b810181811067ffffffffffffffff821117156138b8576138b7613861565b5b80604052505050565b60006138cb61337f565b90506138d78282613890565b919050565b600067ffffffffffffffff8211156138f7576138f6613861565b5b6139008261350a565b9050602081019050919050565b82818337600083830152505050565b600061392f61392a846138dc565b6138c1565b90508281526020810184848401111561394b5761394a61385c565b5b61395684828561390d565b509392505050565b600082601f830112613973576139726136be565b5b813561398384826020860161391c565b91505092915050565b600080600080608085870312156139a6576139a5613389565b5b60006139b487828801613616565b94505060206139c587828801613616565b93505060406139d68782880161346f565b925050606085013567ffffffffffffffff8111156139f7576139f661338e565b5b613a038782880161395e565b91505092959194509250565b60008060408385031215613a2657613a25613389565b5b6000613a3485828601613616565b9250506020613a4585828601613616565b9150509250929050565b7f6c6576656c20696e76616c696400000000000000000000000000000000000000600082015250565b6000613a85600d836134cf565b9150613a9082613a4f565b602082019050919050565b60006020820190508181036000830152613ab481613a78565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b0257607f821691505b602082108103613b1557613b14613abb565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b776021836134cf565b9150613b8282613b1b565b604082019050919050565b60006020820190508181036000830152613ba681613b6a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613c09603d836134cf565b9150613c1482613bad565b604082019050919050565b60006020820190508181036000830152613c3881613bfc565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613c9b602d836134cf565b9150613ca682613c3f565b604082019050919050565b60006020820190508181036000830152613cca81613c8e565b9050919050565b600081519050613ce0816137f0565b92915050565b600060208284031215613cfc57613cfb613389565b5b6000613d0a84828501613cd1565b91505092915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613d807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d43565b613d8a8683613d43565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613dc7613dc2613dbd8461344e565b613da2565b61344e565b9050919050565b6000819050919050565b613de183613dac565b613df5613ded82613dce565b848454613d50565b825550505050565b600090565b613e0a613dfd565b613e15818484613dd8565b505050565b5b81811015613e3957613e2e600082613e02565b600181019050613e1b565b5050565b601f821115613e7e57613e4f81613d1e565b613e5884613d33565b81016020851015613e67578190505b613e7b613e7385613d33565b830182613e1a565b50505b505050565b600082821c905092915050565b6000613ea160001984600802613e83565b1980831691505092915050565b6000613eba8383613e90565b9150826002028217905092915050565b613ed48383613d13565b67ffffffffffffffff811115613eed57613eec613861565b5b613ef78254613aea565b613f02828285613e3d565b6000601f831160018114613f315760008415613f1f578287013590505b613f298582613eae565b865550613f91565b601f198416613f3f86613d1e565b60005b82811015613f6757848901358255600182019150602085019450602081019050613f42565b86831015613f845784890135613f80601f891682613e90565b8355505b6001600288020188555050505b50505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613fd06018836134cf565b9150613fdb82613f9a565b602082019050919050565b60006020820190508181036000830152613fff81613fc3565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006140626029836134cf565b915061406d82614006565b604082019050919050565b6000602082019050818103600083015261409181614055565b9050919050565b7f7265636f6d6d656e6465722063616e206e6f74206265207a65726f0000000000600082015250565b60006140ce601b836134cf565b91506140d982614098565b602082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b7f7265636f6d6d656e6465722063616e206e6f742062652073656c660000000000600082015250565b600061413a601b836134cf565b915061414582614104565b602082019050919050565b600060208201905081810360008301526141698161412d565b9050919050565b7f696e76616c6964207265636f6d6d656e64657200000000000000000000000000600082015250565b60006141a66013836134cf565b91506141b182614170565b602082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b7f7265636f6d6d656e64657220697320646966666572656e740000000000000000600082015250565b60006142126018836134cf565b915061421d826141dc565b602082019050919050565b6000602082019050818103600083015261424181614205565b9050919050565b7f6d696e744e756d20696e76616c69640000000000000000000000000000000000600082015250565b600061427e600f836134cf565b915061428982614248565b602082019050919050565b600060208201905081810360008301526142ad81614271565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142ee8261344e565b91506142f98361344e565b9250828201905080821115614311576143106142b4565b5b92915050565b60006143228261344e565b915061432d8361344e565b9250828203905081811115614345576143446142b4565b5b92915050565b7f616c7265616479206d696e74656420746f6b656e206f66206d61780000000000600082015250565b6000614381601b836134cf565b915061438c8261434b565b602082019050919050565b600060208201905081810360008301526143b081614374565b9050919050565b7f7761697420666f72206f7468657220746f206d696e7420000000000000000000600082015250565b60006143ed6017836134cf565b91506143f8826143b7565b602082019050919050565b6000602082019050818103600083015261441c816143e0565b9050919050565b7f6e6f207374617274000000000000000000000000000000000000000000000000600082015250565b60006144596008836134cf565b915061446482614423565b602082019050919050565b600060208201905081810360008301526144888161444c565b9050919050565b60006060820190506144a460008301866135d5565b6144b160208301856135d5565b6144be6040830184613770565b949350505050565b60006144d18261344e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614503576145026142b4565b5b600182019050919050565b600081905092915050565b6000614524826134c4565b61452e818561450e565b935061453e8185602086016134e0565b80840191505092915050565b60006145568285614519565b91506145628284614519565b91508190509392505050565b7f6e6f742077686974657200000000000000000000000000000000000000000000600082015250565b60006145a4600a836134cf565b91506145af8261456e565b602082019050919050565b600060208201905081810360008301526145d381614597565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146366026836134cf565b9150614641826145da565b604082019050919050565b6000602082019050818103600083015261466581614629565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146a26020836134cf565b91506146ad8261466c565b602082019050919050565b600060208201905081810360008301526146d181614695565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006147346025836134cf565b915061473f826146d8565b604082019050919050565b6000602082019050818103600083015261476381614727565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147c66024836134cf565b91506147d18261476a565b604082019050919050565b600060208201905081810360008301526147f5816147b9565b9050919050565b60006148078261344e565b91506148128361344e565b92508282026148208161344e565b91508282048414831517614837576148366142b4565b5b5092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006148746019836134cf565b915061487f8261483e565b602082019050919050565b600060208201905081810360008301526148a381614867565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149066032836134cf565b9150614911826148aa565b604082019050919050565b60006020820190508181036000830152614935816148f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006149928261496b565b61499c8185614976565b93506149ac8185602086016134e0565b6149b58161350a565b840191505092915050565b60006080820190506149d560008301876135d5565b6149e260208301866135d5565b6149ef6040830185613770565b8181036060830152614a018184614987565b905095945050505050565b600081519050614a1b816133bf565b92915050565b600060208284031215614a3757614a36613389565b5b6000614a4584828501614a0c565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a846020836134cf565b9150614a8f82614a4e565b602082019050919050565b60006020820190508181036000830152614ab381614a77565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614af0601c836134cf565b9150614afb82614aba565b602082019050919050565b60006020820190508181036000830152614b1f81614ae3565b905091905056fea2646970667358221220f042154d08458b0d02554760aa965e5e96e7c7a9c9ea3d2dbd5cc2046f0866f364736f6c63430008110033000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000019c996c4e4596aadda9b7756b34bba614376fdd4

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102535760003560e01c806372e7ef2911610146578063b2bb3926116100c3578063cc06c35911610087578063cc06c359146106a8578063df791e50146106c6578063e27e465e146106e2578063e985e9c514610712578063ee534c3e14610742578063f2fde38b1461076057610253565b8063b2bb392614610603578063b88d4fde14610622578063be9a65551461063e578063c03646ba1461065c578063c87b56dd1461067857610253565b8063976138c11161010a578063976138c11461054d5780639abc83201461057d578063a14481941461059b578063a22cb465146105b7578063a348c289146105d357610253565b806372e7ef29146104b957806380d1f302146104d757806387822c8b146104f35780638da5cb5b1461051157806395d89b411461052f57610253565b806335975a37116101d4578063547520fe11610198578063547520fe1461041757806355f804b3146104335780636352211e1461044f57806370a082311461047f578063715018a6146104af57610253565b806335975a371461039a57806338d89cd3146103a45780633e6ac6ae146103c057806342842e0e146103df57806343baf6d8146103fb57610253565b806309cac7fb1161021b57806309cac7fb1461030e57806323b872dd1461032a5780632d7490cd146103465780632dbb7d6714610362578063344f1ba51461037e57610253565b806301ffc9a714610258578063065f7b571461028857806306fdde03146102a4578063081812fc146102c2578063095ea7b3146102f2575b600080fd5b610272600480360381019061026d91906133eb565b61077c565b60405161027f9190613433565b60405180910390f35b6102a2600480360381019061029d9190613484565b61085e565b005b6102ac6108e2565b6040516102b99190613554565b60405180910390f35b6102dc60048036038101906102d79190613576565b610974565b6040516102e991906135e4565b60405180910390f35b61030c6004803603810190610307919061362b565b6109ba565b005b61032860048036038101906103239190613576565b610ad1565b005b610344600480360381019061033f919061366b565b610aed565b005b610360600480360381019061035b919061362b565b610b4d565b005b61037c6004803603810190610377919061362b565b610ba1565b005b61039860048036038101906103939190613576565b610c4e565b005b6103a2610c6a565b005b6103be60048036038101906103b99190613723565b610c9e565b005b6103c8610cbc565b6040516103d692919061377f565b60405180910390f35b6103f960048036038101906103f4919061366b565b610cf5565b005b6104156004803603810190610410919061362b565b610d15565b005b610431600480360381019061042c9190613576565b610d69565b005b61044d60048036038101906104489190613723565b610d85565b005b61046960048036038101906104649190613576565b610da3565b60405161047691906135e4565b60405180910390f35b610499600480360381019061049491906137a8565b610e29565b6040516104a691906137d5565b60405180910390f35b6104b7610ee0565b005b6104c1610ef4565b6040516104ce91906137d5565b60405180910390f35b6104f160048036038101906104ec919061362b565b610efa565b005b6104fb610f95565b60405161050891906137d5565b60405180910390f35b610519610f9b565b60405161052691906135e4565b60405180910390f35b610537610fc5565b6040516105449190613554565b60405180910390f35b610567600480360381019061056291906137a8565b611057565b60405161057491906135e4565b60405180910390f35b61058561108a565b6040516105929190613554565b60405180910390f35b6105b560048036038101906105b0919061362b565b611118565b005b6105d160048036038101906105cc919061381c565b6116aa565b005b6105ed60048036038101906105e891906137a8565b6116c0565b6040516105fa9190613433565b60405180910390f35b61060b6116e0565b60405161061992919061377f565b60405180910390f35b61063c6004803603810190610637919061398c565b611719565b005b61064661177b565b6040516106539190613433565b60405180910390f35b610676600480360381019061067191906137a8565b61178e565b005b610692600480360381019061068d9190613576565b61183d565b60405161069f9190613554565b60405180910390f35b6106b06118a3565b6040516106bd91906137d5565b60405180910390f35b6106e060048036038101906106db919061366b565b6118a9565b005b6106fc60048036038101906106f79190613576565b611bfc565b60405161070991906137d5565b60405180910390f35b61072c60048036038101906107279190613a0f565b611c14565b6040516107399190613433565b60405180910390f35b61074a611ca8565b6040516107579190613554565b60405180910390f35b61077a600480360381019061077591906137a8565b611d36565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610857575061085682611dc6565b5b9050919050565b610866611e30565b600d548211156108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a290613a9b565b60405180910390fd5b80600e600084815260200190815260200160002054146108de5780600e6000848152602001908152602001600020819055505b5050565b6060600080546108f190613aea565b80601f016020809104026020016040519081016040528092919081815260200182805461091d90613aea565b801561096a5780601f1061093f5761010080835404028352916020019161096a565b820191906000526020600020905b81548152906001019060200180831161094d57829003601f168201915b5050505050905090565b600061097f82611eae565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c582610da3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613b8d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a54611ef9565b73ffffffffffffffffffffffffffffffffffffffff161480610a835750610a8281610a7d611ef9565b611c14565b5b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613c1f565b60405180910390fd5b610acc8383611f01565b505050565b610ad9611e30565b8060095414610aea57806009819055505b50565b610afe610af8611ef9565b82611fba565b610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490613cb1565b60405180910390fd5b610b4883838361204f565b505050565b610b55611e30565b81601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806012819055505050565b610ba9611e30565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610c0692919061377f565b6020604051808303816000875af1158015610c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c499190613ce6565b505050565b610c56611e30565b600d548114610c675780600d819055505b50565b610c72611e30565b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b610ca6611e30565b818160169182610cb7929190613eca565b505050565b600080610cc7611e30565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601054915091509091565b610d1083838360405180602001604052806000815250611719565b505050565b610d1d611e30565b81600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806010819055505050565b610d71611e30565b80600a5414610d825780600a819055505b50565b610d8d611e30565b818160159182610d9e929190613eca565b505050565b600080610daf83612348565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1790613fe6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614078565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ee8611e30565b610ef26000612385565b565b60095481565b610f02611e30565b601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610f5f92919061377f565b600060405180830381600087803b158015610f7957600080fd5b505af1158015610f8d573d6000803e3d6000fd5b505050505050565b600a5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fd490613aea565b80601f016020809104026020016040519081016040528092919081815260200182805461100090613aea565b801561104d5780601f106110225761010080835404028352916020019161104d565b820191906000526020600020905b81548152906001019060200180831161103057829003601f168201915b5050505050905090565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6015805461109790613aea565b80601f01602080910402602001604051908101604052809291908181526020018280546110c390613aea565b80156111105780601f106110e557610100808354040283529160200191611110565b820191906000526020600020905b8154815290600101906020018083116110f357829003601f168201915b505050505081565b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f906140e4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90614150565b60405180910390fd5b6111ff81610e29565b600010611241576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611238906141bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113575780600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611425565b8073ffffffffffffffffffffffffffffffffffffffff16600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90614228565b60405180910390fd5b5b818060001080156114385750600a548111155b611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90614294565b60405180910390fd5b600181611484600761244b565b61148e91906142e3565b6114989190614317565b60085410156114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390614397565b60405180910390fd5b601360019054906101000a900460ff161561152c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152390614403565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550601360009054906101000a900460ff16611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d9061446f565b60405180910390fd5b60006115a0611ef9565b90506000309050601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd83836115fc8960095461245990919063ffffffff16565b6040518463ffffffff1660e01b815260040161161a9392919061448f565b600060405180830381600087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b505050506116558561246f565b60005b8581101561167c57611669836126cd565b8080611674906144c6565b915050611658565b5061168782866126f3565b50506000601360016101000a81548160ff02191690831515021790555050505050565b6116bc6116b5611ef9565b83836128af565b5050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000806116eb611e30565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601254915091509091565b61172a611724611ef9565b83611fba565b611769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176090613cb1565b60405180910390fd5b61177584848484612a1b565b50505050565b601360009054906101000a900460ff1681565b611796611e30565b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606061184882611eae565b6000611852612a77565b9050600061185e612b09565b9050600081511161186f578161189a565b8061187985612b9b565b60405160200161188a92919061454a565b6040516020818303038152906040525b92505050919050565b600d5481565b60006118b3611ef9565b9050600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061193f5750611910610f9b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61197e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611975906145ba565b60405180910390fd5b818060001080156119915750600a548111155b6119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c790614294565b60405180910390fd5b6001816119dd600761244b565b6119e791906142e3565b6119f19190614317565b6008541015611a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2c90614397565b60405180910390fd5b601360019054906101000a900460ff1615611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90614403565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff16600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611bb25783600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60005b83811015611bd957611bc6866126cd565b8080611bd1906144c6565b915050611bb5565b506000601360016101000a81548160ff0219169083151502179055505050505050565b600e6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60168054611cb590613aea565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce190613aea565b8015611d2e5780601f10611d0357610100808354040283529160200191611d2e565b820191906000526020600020905b815481529060010190602001808311611d1157829003601f168201915b505050505081565b611d3e611e30565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da49061464c565b60405180910390fd5b611db681612385565b50565b6001816000018190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e38611ef9565b73ffffffffffffffffffffffffffffffffffffffff16611e56610f9b565b73ffffffffffffffffffffffffffffffffffffffff1614611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea3906146b8565b60405180910390fd5b565b611eb781612c69565b611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed90613fe6565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f7483610da3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fc683610da3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061200857506120078185611c14565b5b8061204657508373ffffffffffffffffffffffffffffffffffffffff1661202e84610974565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661206f82610da3565b73ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc9061474a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b906147dc565b60405180910390fd5b6121418383836001612caa565b8273ffffffffffffffffffffffffffffffffffffffff1661216182610da3565b73ffffffffffffffffffffffffffffffffffffffff16146121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae9061474a565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123438383836001612dd0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6000818361246791906147fc565b905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156124d25750601054600014155b1561259d57601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661254d8560105461245990919063ffffffff16565b6040518363ffffffff1660e01b815260040161256a92919061377f565b600060405180830381600087803b15801561258457600080fd5b505af1158015612598573d6000803e3d6000fd5b505050505b8073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156125fe5750601254600014155b156126c957601360029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166126798560125461245990919063ffffffff16565b6040518363ffffffff1660e01b815260040161269692919061377f565b600060405180830381600087803b1580156126b057600080fd5b505af11580156126c4573d6000803e3d6000fd5b505050505b5050565b60006126d9600761244b565b90506126e56007612dd6565b6126ef8282612dec565b5050565b6000806000905060005b600d5481116128a8578060000361271657849250612779565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127c95750600e600082815260200190815260200160002054600014155b1561289557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8461283387600e60008781526020019081526020016000205461245990919063ffffffff16565b6040518363ffffffff1660e01b815260040161285092919061377f565b6020604051808303816000875af115801561286f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128939190613ce6565b505b80806128a0906144c6565b9150506126fd565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361291d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129149061488a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a0e9190613433565b60405180910390a3505050565b612a2684848461204f565b612a3284848484612e0a565b612a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a689061491c565b60405180910390fd5b50505050565b606060158054612a8690613aea565b80601f0160208091040260200160405190810160405280929190818152602001828054612ab290613aea565b8015612aff5780601f10612ad457610100808354040283529160200191612aff565b820191906000526020600020905b815481529060010190602001808311612ae257829003601f168201915b5050505050905090565b606060168054612b1890613aea565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4490613aea565b8015612b915780601f10612b6657610100808354040283529160200191612b91565b820191906000526020600020905b815481529060010190602001808311612b7457829003601f168201915b5050505050905090565b606060006001612baa84612f91565b01905060008167ffffffffffffffff811115612bc957612bc8613861565b5b6040519080825280601f01601f191660200182016040528015612bfb5781602001600182028036833780820191505090505b509050600082602001820190505b600115612c5e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612c5257612c5161493c565b5b04945060008503612c09575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612c8b83612348565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115612dca57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d3e5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d369190614317565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dc95780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dc191906142e3565b925050819055505b5b50505050565b50505050565b6001816000016000828254019250508190555050565b612e068282604051806020016040528060008152506130e4565b5050565b6000612e2b8473ffffffffffffffffffffffffffffffffffffffff1661313f565b15612f84578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e54611ef9565b8786866040518563ffffffff1660e01b8152600401612e7694939291906149c0565b6020604051808303816000875af1925050508015612eb257506040513d601f19601f82011682018060405250810190612eaf9190614a21565b60015b612f34573d8060008114612ee2576040519150601f19603f3d011682016040523d82523d6000602084013e612ee7565b606091505b506000815103612f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f239061491c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f89565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fef577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612fe557612fe461493c565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061302c576d04ee2d6d415b85acef810000000083816130225761302161493c565b5b0492506020810190505b662386f26fc10000831061305b57662386f26fc1000083816130515761305061493c565b5b0492506010810190505b6305f5e1008310613084576305f5e100838161307a5761307961493c565b5b0492506008810190505b61271083106130a957612710838161309f5761309e61493c565b5b0492506004810190505b606483106130cc57606483816130c2576130c161493c565b5b0492506002810190505b600a83106130db576001810190505b80915050919050565b6130ee8383613162565b6130fb6000848484612e0a565b61313a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131319061491c565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036131d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c890614a9a565b60405180910390fd5b6131da81612c69565b1561321a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321190614b06565b60405180910390fd5b613228600083836001612caa565b61323181612c69565b15613271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326890614b06565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461337b600083836001612dd0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133c881613393565b81146133d357600080fd5b50565b6000813590506133e5816133bf565b92915050565b60006020828403121561340157613400613389565b5b600061340f848285016133d6565b91505092915050565b60008115159050919050565b61342d81613418565b82525050565b60006020820190506134486000830184613424565b92915050565b6000819050919050565b6134618161344e565b811461346c57600080fd5b50565b60008135905061347e81613458565b92915050565b6000806040838503121561349b5761349a613389565b5b60006134a98582860161346f565b92505060206134ba8582860161346f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134fe5780820151818401526020810190506134e3565b60008484015250505050565b6000601f19601f8301169050919050565b6000613526826134c4565b61353081856134cf565b93506135408185602086016134e0565b6135498161350a565b840191505092915050565b6000602082019050818103600083015261356e818461351b565b905092915050565b60006020828403121561358c5761358b613389565b5b600061359a8482850161346f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135ce826135a3565b9050919050565b6135de816135c3565b82525050565b60006020820190506135f960008301846135d5565b92915050565b613608816135c3565b811461361357600080fd5b50565b600081359050613625816135ff565b92915050565b6000806040838503121561364257613641613389565b5b600061365085828601613616565b92505060206136618582860161346f565b9150509250929050565b60008060006060848603121561368457613683613389565b5b600061369286828701613616565b93505060206136a386828701613616565b92505060406136b48682870161346f565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126136e3576136e26136be565b5b8235905067ffffffffffffffff811115613700576136ff6136c3565b5b60208301915083600182028301111561371c5761371b6136c8565b5b9250929050565b6000806020838503121561373a57613739613389565b5b600083013567ffffffffffffffff8111156137585761375761338e565b5b613764858286016136cd565b92509250509250929050565b6137798161344e565b82525050565b600060408201905061379460008301856135d5565b6137a16020830184613770565b9392505050565b6000602082840312156137be576137bd613389565b5b60006137cc84828501613616565b91505092915050565b60006020820190506137ea6000830184613770565b92915050565b6137f981613418565b811461380457600080fd5b50565b600081359050613816816137f0565b92915050565b6000806040838503121561383357613832613389565b5b600061384185828601613616565b925050602061385285828601613807565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138998261350a565b810181811067ffffffffffffffff821117156138b8576138b7613861565b5b80604052505050565b60006138cb61337f565b90506138d78282613890565b919050565b600067ffffffffffffffff8211156138f7576138f6613861565b5b6139008261350a565b9050602081019050919050565b82818337600083830152505050565b600061392f61392a846138dc565b6138c1565b90508281526020810184848401111561394b5761394a61385c565b5b61395684828561390d565b509392505050565b600082601f830112613973576139726136be565b5b813561398384826020860161391c565b91505092915050565b600080600080608085870312156139a6576139a5613389565b5b60006139b487828801613616565b94505060206139c587828801613616565b93505060406139d68782880161346f565b925050606085013567ffffffffffffffff8111156139f7576139f661338e565b5b613a038782880161395e565b91505092959194509250565b60008060408385031215613a2657613a25613389565b5b6000613a3485828601613616565b9250506020613a4585828601613616565b9150509250929050565b7f6c6576656c20696e76616c696400000000000000000000000000000000000000600082015250565b6000613a85600d836134cf565b9150613a9082613a4f565b602082019050919050565b60006020820190508181036000830152613ab481613a78565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b0257607f821691505b602082108103613b1557613b14613abb565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b776021836134cf565b9150613b8282613b1b565b604082019050919050565b60006020820190508181036000830152613ba681613b6a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613c09603d836134cf565b9150613c1482613bad565b604082019050919050565b60006020820190508181036000830152613c3881613bfc565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613c9b602d836134cf565b9150613ca682613c3f565b604082019050919050565b60006020820190508181036000830152613cca81613c8e565b9050919050565b600081519050613ce0816137f0565b92915050565b600060208284031215613cfc57613cfb613389565b5b6000613d0a84828501613cd1565b91505092915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613d807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d43565b613d8a8683613d43565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613dc7613dc2613dbd8461344e565b613da2565b61344e565b9050919050565b6000819050919050565b613de183613dac565b613df5613ded82613dce565b848454613d50565b825550505050565b600090565b613e0a613dfd565b613e15818484613dd8565b505050565b5b81811015613e3957613e2e600082613e02565b600181019050613e1b565b5050565b601f821115613e7e57613e4f81613d1e565b613e5884613d33565b81016020851015613e67578190505b613e7b613e7385613d33565b830182613e1a565b50505b505050565b600082821c905092915050565b6000613ea160001984600802613e83565b1980831691505092915050565b6000613eba8383613e90565b9150826002028217905092915050565b613ed48383613d13565b67ffffffffffffffff811115613eed57613eec613861565b5b613ef78254613aea565b613f02828285613e3d565b6000601f831160018114613f315760008415613f1f578287013590505b613f298582613eae565b865550613f91565b601f198416613f3f86613d1e565b60005b82811015613f6757848901358255600182019150602085019450602081019050613f42565b86831015613f845784890135613f80601f891682613e90565b8355505b6001600288020188555050505b50505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613fd06018836134cf565b9150613fdb82613f9a565b602082019050919050565b60006020820190508181036000830152613fff81613fc3565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006140626029836134cf565b915061406d82614006565b604082019050919050565b6000602082019050818103600083015261409181614055565b9050919050565b7f7265636f6d6d656e6465722063616e206e6f74206265207a65726f0000000000600082015250565b60006140ce601b836134cf565b91506140d982614098565b602082019050919050565b600060208201905081810360008301526140fd816140c1565b9050919050565b7f7265636f6d6d656e6465722063616e206e6f742062652073656c660000000000600082015250565b600061413a601b836134cf565b915061414582614104565b602082019050919050565b600060208201905081810360008301526141698161412d565b9050919050565b7f696e76616c6964207265636f6d6d656e64657200000000000000000000000000600082015250565b60006141a66013836134cf565b91506141b182614170565b602082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b7f7265636f6d6d656e64657220697320646966666572656e740000000000000000600082015250565b60006142126018836134cf565b915061421d826141dc565b602082019050919050565b6000602082019050818103600083015261424181614205565b9050919050565b7f6d696e744e756d20696e76616c69640000000000000000000000000000000000600082015250565b600061427e600f836134cf565b915061428982614248565b602082019050919050565b600060208201905081810360008301526142ad81614271565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142ee8261344e565b91506142f98361344e565b9250828201905080821115614311576143106142b4565b5b92915050565b60006143228261344e565b915061432d8361344e565b9250828203905081811115614345576143446142b4565b5b92915050565b7f616c7265616479206d696e74656420746f6b656e206f66206d61780000000000600082015250565b6000614381601b836134cf565b915061438c8261434b565b602082019050919050565b600060208201905081810360008301526143b081614374565b9050919050565b7f7761697420666f72206f7468657220746f206d696e7420000000000000000000600082015250565b60006143ed6017836134cf565b91506143f8826143b7565b602082019050919050565b6000602082019050818103600083015261441c816143e0565b9050919050565b7f6e6f207374617274000000000000000000000000000000000000000000000000600082015250565b60006144596008836134cf565b915061446482614423565b602082019050919050565b600060208201905081810360008301526144888161444c565b9050919050565b60006060820190506144a460008301866135d5565b6144b160208301856135d5565b6144be6040830184613770565b949350505050565b60006144d18261344e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614503576145026142b4565b5b600182019050919050565b600081905092915050565b6000614524826134c4565b61452e818561450e565b935061453e8185602086016134e0565b80840191505092915050565b60006145568285614519565b91506145628284614519565b91508190509392505050565b7f6e6f742077686974657200000000000000000000000000000000000000000000600082015250565b60006145a4600a836134cf565b91506145af8261456e565b602082019050919050565b600060208201905081810360008301526145d381614597565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146366026836134cf565b9150614641826145da565b604082019050919050565b6000602082019050818103600083015261466581614629565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146a26020836134cf565b91506146ad8261466c565b602082019050919050565b600060208201905081810360008301526146d181614695565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006147346025836134cf565b915061473f826146d8565b604082019050919050565b6000602082019050818103600083015261476381614727565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147c66024836134cf565b91506147d18261476a565b604082019050919050565b600060208201905081810360008301526147f5816147b9565b9050919050565b60006148078261344e565b91506148128361344e565b92508282026148208161344e565b91508282048414831517614837576148366142b4565b5b5092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006148746019836134cf565b915061487f8261483e565b602082019050919050565b600060208201905081810360008301526148a381614867565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149066032836134cf565b9150614911826148aa565b604082019050919050565b60006020820190508181036000830152614935816148f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006149928261496b565b61499c8185614976565b93506149ac8185602086016134e0565b6149b58161350a565b840191505092915050565b60006080820190506149d560008301876135d5565b6149e260208301866135d5565b6149ef6040830185613770565b8181036060830152614a018184614987565b905095945050505050565b600081519050614a1b816133bf565b92915050565b600060208284031215614a3757614a36613389565b5b6000614a4584828501614a0c565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a846020836134cf565b9150614a8f82614a4e565b602082019050919050565b60006020820190508181036000830152614ab381614a77565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614af0601c836134cf565b9150614afb82614aba565b602082019050919050565b60006020820190508181036000830152614b1f81614ae3565b905091905056fea2646970667358221220f042154d08458b0d02554760aa965e5e96e7c7a9c9ea3d2dbd5cc2046f0866f364736f6c63430008110033

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

000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000019c996c4e4596aadda9b7756b34bba614376fdd4

-----Decoded View---------------
Arg [0] : pay (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [1] : reward (address): 0x19C996c4E4596aADDA9b7756B34bBa614376FDd4

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [1] : 00000000000000000000000019c996c4e4596aadda9b7756b34bba614376fdd4


Deployed Bytecode Sourcemap

61270:6280:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44823:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64110:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45751:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47410:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46928:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63504:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48110:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64534:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64837:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63968:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63632:73;;;:::i;:::-;;62585:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64969:150;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;48516:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64360:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63833:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62473:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45461:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45192:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25423:103;;;:::i;:::-;;61458:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64710:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61497:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24775:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45920:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61580:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61992:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63021:473;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47653:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61532:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65127:152;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;48772:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61888:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63715:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46095:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61635:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62693:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61669:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47879:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62021:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25681:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44823:305;44925:4;44977:25;44962:40;;;:11;:40;;;;:105;;;;45034:33;45019:48;;;:11;:48;;;;44962:105;:158;;;;45084:36;45108:11;45084:23;:36::i;:::-;44962:158;44942:178;;44823:305;;;:::o;64110:240::-;24661:13;:11;:13::i;:::-;64208:8:::1;;64199:5;:17;;64191:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;64276:6;64248:17;:24;64266:5;64248:24;;;;;;;;;;;;:34;64245:98;;64325:6;64298:17;:24;64316:5;64298:24;;;;;;;;;;;:33;;;;64245:98;64110:240:::0;;:::o;45751:100::-;45805:13;45838:5;45831:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45751:100;:::o;47410:171::-;47486:7;47506:23;47521:7;47506:14;:23::i;:::-;47549:15;:24;47565:7;47549:24;;;;;;;;;;;;;;;;;;;;;47542:31;;47410:171;;;:::o;46928:416::-;47009:13;47025:23;47040:7;47025:14;:23::i;:::-;47009:39;;47073:5;47067:11;;:2;:11;;;47059:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47167:5;47151:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47176:37;47193:5;47200:12;:10;:12::i;:::-;47176:16;:37::i;:::-;47151:62;47129:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;47315:21;47324:2;47328:7;47315:8;:21::i;:::-;46998:346;46928:416;;:::o;63504:118::-;24661:13;:11;:13::i;:::-;63574:3:::1;63567;;:10;63564:51;;63600:3;63593;:10;;;;63564:51;63504:118:::0;:::o;48110:335::-;48305:41;48324:12;:10;:12::i;:::-;48338:7;48305:18;:41::i;:::-;48297:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;48409:28;48419:4;48425:2;48429:7;48409:9;:28::i;:::-;48110:335;;;:::o;64534:168::-;24661:13;:11;:13::i;:::-;64646:6:::1;64620:23;;:32;;;;;;;;;;;;;;;;;;64688:6;64663:22;:31;;;;64534:168:::0;;:::o;64837:124::-;24661:13;:11;:13::i;:::-;64921:9:::1;;;;;;;;;;;:18;;;64940:4;64946:6;64921:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64837:124:::0;;:::o;63968:132::-;24661:13;:11;:13::i;:::-;64043:8:::1;;64036:3;:15;64033:60;;64078:3;64067:8;:14;;;;64033:60;63968:132:::0;:::o;63632:73::-;24661:13;:11;:13::i;:::-;63692:5:::1;;;;;;;;;;;63691:6;63683:5;;:14;;;;;;;;;;;;;;;;;;63632:73::o:0;62585:100::-;24661:13;:11;:13::i;:::-;62670:7:::1;;62661:6;:16;;;;;;;:::i;:::-;;62585:100:::0;;:::o;64969:150::-;65028:7;65037;24661:13;:11;:13::i;:::-;65065:22:::1;;;;;;;;;;;65089:21;;65057:54;;;;64969:150:::0;;:::o;48516:185::-;48654:39;48671:4;48677:2;48681:7;48654:39;;;;;;;;;;;;:16;:39::i;:::-;48516:185;;;:::o;64360:164::-;24661:13;:11;:13::i;:::-;64470:5:::1;64445:22;;:30;;;;;;;;;;;;;;;;;;64510:6;64486:21;:30;;;;64360:164:::0;;:::o;63833:127::-;24661:13;:11;:13::i;:::-;63910:3:::1;63900:6;;:13;63897:56;;63938:3;63929:6;:12;;;;63897:56;63833:127:::0;:::o;62473:104::-;24661:13;:11;:13::i;:::-;62561:8:::1;;62551:7;:18;;;;;;;:::i;:::-;;62473:104:::0;;:::o;45461:223::-;45533:7;45553:13;45569:17;45578:7;45569:8;:17::i;:::-;45553:33;;45622:1;45605:19;;:5;:19;;;45597:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;45671:5;45664:12;;;45461:223;;;:::o;45192:207::-;45264:7;45309:1;45292:19;;:5;:19;;;45284:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45375:9;:16;45385:5;45375:16;;;;;;;;;;;;;;;;45368:23;;45192:207;;;:::o;25423:103::-;24661:13;:11;:13::i;:::-;25488:30:::1;25515:1;25488:18;:30::i;:::-;25423:103::o:0;61458:30::-;;;;:::o;64710:119::-;24661:13;:11;:13::i;:::-;64792:6:::1;;;;;;;;;;;:15;;;64808:4;64814:6;64792:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64710:119:::0;;:::o;61497:26::-;;;;:::o;24775:87::-;24821:7;24848:6;;;;;;;;;;;24841:13;;24775:87;:::o;45920:104::-;45976:13;46009:7;46002:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45920:104;:::o;61580:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;61992:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63021:473::-;63101:12;66719:1;66695:26;;:12;:26;;;66687:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;66788:10;66772:26;;:12;:26;;;66764:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;66853:23;66863:12;66853:9;:23::i;:::-;66849:1;:27;66841:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;66959:1;66924:37;;:11;:23;66936:10;66924:23;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;66921:213;;67003:12;66977:11;:23;66989:10;66977:23;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;66921:213;;;67081:12;67054:39;;:11;:23;67066:10;67054:23;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;67046:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;66921:213;63123:7:::1;67378;67374:1;:11;:32;;;;;67400:6;;67389:7;:17;;67374:32;67366:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;67490:1;67480:7;67452:25;:15;:23;:25::i;:::-;:35;;;;:::i;:::-;:39;;;;:::i;:::-;67445:3;;:46;;67437:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;67215:4:::2;;;;;;;;;;;67214:5;67206:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;67265:4;67258;;:11;;;;;;;;;;;;;;;;;;63157:5:::3;;;;;;;;;;;63149:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;63186:12;63201;:10;:12::i;:::-;63186:27;;63224:12;63247:4;63224:28;;63273:6;;;;;;;;;;;:19;;;63293:4;63299;63305:16;63313:7;63305:3;;:7;;:16;;;;:::i;:::-;63273:49;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;63333:19;63344:7;63333:10;:19::i;:::-;63369:6;63365:75;63385:7;63381:1;:11;63365:75;;;63413:15;63423:4;63413:9;:15::i;:::-;63394:3;;;;;:::i;:::-;;;;63365:75;;;;63458:26;63470:4;63476:7;63458:11;:26::i;:::-;63138:356;;67299:5:::2;67292:4;;:12;;;;;;;;;;;;;;;;;;67146:1:::1;63021:473:::0;;;:::o;47653:155::-;47748:52;47767:12;:10;:12::i;:::-;47781:8;47791;47748:18;:52::i;:::-;47653:155;;:::o;61532:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;65127:152::-;65187:7;65196;24661:13;:11;:13::i;:::-;65223:23:::1;;;;;;;;;;;65248:22;;65215:56;;;;65127:152:::0;;:::o;48772:322::-;48946:41;48965:12;:10;:12::i;:::-;48979:7;48946:18;:41::i;:::-;48938:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;49048:38;49062:4;49068:2;49072:7;49081:4;49048:13;:38::i;:::-;48772:322;;;;:::o;61888:24::-;;;;;;;;;;;;;:::o;63715:108::-;24661:13;:11;:13::i;:::-;63800:7:::1;:15;63808:6;63800:15;;;;;;;;;;;;;;;;;;;;;;;;;63799:16;63781:7;:15;63789:6;63781:15;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;63715:108:::0;:::o;46095:327::-;46168:13;46194:23;46209:7;46194:14;:23::i;:::-;46230:21;46254:10;:8;:10::i;:::-;46230:34;;46275:20;46298:9;:7;:9::i;:::-;46275:32;;46348:1;46331:6;46325:20;:24;:89;;46407:7;46325:89;;;46376:6;46384:18;:7;:16;:18::i;:::-;46359:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46325:89;46318:96;;;;46095:327;;;:::o;61635:27::-;;;;:::o;62693:318::-;66485:14;66502:12;:10;:12::i;:::-;66485:29;;66543:7;:15;66551:6;66543:15;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;66572:7;:5;:7::i;:::-;66562:17;;:6;:17;;;66543:36;66535:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;62783:7:::1;67378;67374:1;:11;:32;;;;;67400:6;;67389:7;:17;;67374:32;67366:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;67490:1;67480:7;67452:25;:15;:23;:25::i;:::-;:35;;;;:::i;:::-;:39;;;;:::i;:::-;67445:3;;:46;;67437:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;67215:4:::2;;;;;;;;;;;67214:5;67206:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;67265:4;67258;;:11;;;;;;;;;;;;;;;;;;62850:1:::3;62823:29;;:11;:15;62835:2;62823:15;;;;;;;;;;;;;;;;;;;;;;;;;:29;;::::0;62820:89:::3;;62885:12;62867:11;:15;62879:2;62867:15;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;62820:89;62933:6;62929:73;62949:7;62945:1;:11;62929:73;;;62977:13;62987:2;62977:9;:13::i;:::-;62958:3;;;;;:::i;:::-;;;;62929:73;;;;67299:5:::2;67292:4;;:12;;;;;;;;;;;;;;;;;;66607:1:::1;66472:146:::0;62693:318;;;:::o;61669:52::-;;;;;;;;;;;;;;;;;:::o;47879:164::-;47976:4;48000:18;:25;48019:5;48000:25;;;;;;;;;;;;;;;:35;48026:8;48000:35;;;;;;;;;;;;;;;;;;;;;;;;;47993:42;;47879:164;;;;:::o;62021:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25681:201::-;24661:13;:11;:13::i;:::-;25790:1:::1;25770:22;;:8;:22;;::::0;25762:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;25846:28;25865:8;25846:18;:28::i;:::-;25681:201:::0;:::o;1294:86::-;1371:1;1354:7;:14;;:18;;;;1294:86;:::o;37850:157::-;37935:4;37974:25;37959:40;;;:11;:40;;;;37952:47;;37850:157;;;:::o;24940:132::-;25015:12;:10;:12::i;:::-;25004:23;;:7;:5;:7::i;:::-;:23;;;24996:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24940:132::o;57229:135::-;57311:16;57319:7;57311;:16::i;:::-;57303:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57229:135;:::o;23478:98::-;23531:7;23558:10;23551:17;;23478:98;:::o;56508:174::-;56610:2;56583:15;:24;56599:7;56583:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56666:7;56662:2;56628:46;;56637:23;56652:7;56637:14;:23::i;:::-;56628:46;;;;;;;;;;;;56508:174;;:::o;51127:264::-;51220:4;51237:13;51253:23;51268:7;51253:14;:23::i;:::-;51237:39;;51306:5;51295:16;;:7;:16;;;:52;;;;51315:32;51332:5;51339:7;51315:16;:32::i;:::-;51295:52;:87;;;;51375:7;51351:31;;:20;51363:7;51351:11;:20::i;:::-;:31;;;51295:87;51287:96;;;51127:264;;;;:::o;55126:1263::-;55285:4;55258:31;;:23;55273:7;55258:14;:23::i;:::-;:31;;;55250:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55364:1;55350:16;;:2;:16;;;55342:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55420:42;55441:4;55447:2;55451:7;55460:1;55420:20;:42::i;:::-;55592:4;55565:31;;:23;55580:7;55565:14;:23::i;:::-;:31;;;55557:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55710:15;:24;55726:7;55710:24;;;;;;;;;;;;55703:31;;;;;;;;;;;56205:1;56186:9;:15;56196:4;56186:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;56238:1;56221:9;:13;56231:2;56221:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56280:2;56261:7;:16;56269:7;56261:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56319:7;56315:2;56300:27;;56309:4;56300:27;;;;;;;;;;;;56340:41;56360:4;56366:2;56370:7;56379:1;56340:19;:41::i;:::-;55126:1263;;;:::o;50402:117::-;50468:7;50495;:16;50503:7;50495:16;;;;;;;;;;;;;;;;;;;;;50488:23;;50402:117;;;:::o;26042:191::-;26116:16;26135:6;;;;;;;;;;;26116:25;;26161:8;26152:6;;:17;;;;;;;;;;;;;;;;;;26216:8;26185:40;;26206:8;26185:40;;;;;;;;;;;;26105:128;26042:191;:::o;794:114::-;859:7;886;:14;;;879:21;;794:114;;;:::o;17339:98::-;17397:7;17428:1;17424;:5;;;;:::i;:::-;17417:12;;17339:98;;;;:::o;65287:444::-;65340:12;65405:4;65379:30;;:22;;;;;;;;;;;:30;;;;:60;;;;;65418:21;;65413:1;:26;;65379:60;65376:166;;;65455:6;;;;;;;;;;;:15;;;65471:22;;;;;;;;;;;65495:34;65521:7;65495:21;;:25;;:34;;;;:::i;:::-;65455:75;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65376:166;65584:4;65557:31;;:23;;;;;;;;;;;:31;;;;:62;;;;;65597:22;;65592:1;:27;;65557:62;65554:170;;;65635:6;;;;;;;;;;;:15;;;65651:23;;;;;;;;;;;65676:35;65703:7;65676:22;;:26;;:35;;;;:::i;:::-;65635:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65554:170;65329:402;65287:444;:::o;65743:172::-;65793:15;65811:25;:15;:23;:25::i;:::-;65793:43;;65847:27;:15;:25;:27::i;:::-;65885:22;65895:2;65899:7;65885:9;:22::i;:::-;65782:133;65743:172;:::o;65927:513::-;66001:15;66026:12;66049:1;66026:25;;66066:6;66061:362;66083:8;;66078:1;:13;66061:362;;66119:1;66114;:6;66111:122;;66149:2;66139:12;;66111:122;;;66198:11;:20;66210:7;66198:20;;;;;;;;;;;;;;;;;;;;;;;;;66188:30;;66111:122;66271:4;66260:15;;:7;:15;;;;:44;;;;;66284:17;:20;66302:1;66284:20;;;;;;;;;;;;66279:1;:25;;66260:44;66257:143;;;66323:9;;;;;;;;;;;:18;;;66342:7;66351:33;66376:7;66351:17;:20;66369:1;66351:20;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;66323:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66257:143;66093:3;;;;;:::i;:::-;;;;66061:362;;;;65982:458;;65927:513;;:::o;56825:315::-;56980:8;56971:17;;:5;:17;;;56963:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57067:8;57029:18;:25;57048:5;57029:25;;;;;;;;;;;;;;;:35;57055:8;57029:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;57113:8;57091:41;;57106:5;57091:41;;;57123:8;57091:41;;;;;;:::i;:::-;;;;;;;;56825:315;;;:::o;49975:313::-;50131:28;50141:4;50147:2;50151:7;50131:9;:28::i;:::-;50178:47;50201:4;50207:2;50211:7;50220:4;50178:22;:47::i;:::-;50170:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49975:313;;;;:::o;62259:100::-;62311:13;62344:7;62337:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62259:100;:::o;62367:98::-;62418:13;62451:6;62444:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62367:98;:::o;21040:716::-;21096:13;21147:14;21184:1;21164:17;21175:5;21164:10;:17::i;:::-;:21;21147:38;;21200:20;21234:6;21223:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21200:41;;21256:11;21385:6;21381:2;21377:15;21369:6;21365:28;21358:35;;21422:288;21429:4;21422:288;;;21454:5;;;;;;;;21596:8;21591:2;21584:5;21580:14;21575:30;21570:3;21562:44;21652:2;21643:11;;;;;;:::i;:::-;;;;;21686:1;21677:5;:10;21422:288;21673:21;21422:288;21731:6;21724:13;;;;;21040:716;;;:::o;50832:128::-;50897:4;50950:1;50921:31;;:17;50930:7;50921:8;:17::i;:::-;:31;;;;50914:38;;50832:128;;;:::o;59513:410::-;59703:1;59691:9;:13;59687:229;;;59741:1;59725:18;;:4;:18;;;59721:87;;59783:9;59764;:15;59774:4;59764:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;59721:87;59840:1;59826:16;;:2;:16;;;59822:83;;59880:9;59863;:13;59873:2;59863:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;59822:83;59687:229;59513:410;;;;:::o;60645:158::-;;;;;:::o;916:127::-;1023:1;1005:7;:14;;;:19;;;;;;;;;;;916:127;:::o;51733:110::-;51809:26;51819:2;51823:7;51809:26;;;;;;;;;;;;:9;:26::i;:::-;51733:110;;:::o;57928:853::-;58082:4;58103:15;:2;:13;;;:15::i;:::-;58099:675;;;58155:2;58139:36;;;58176:12;:10;:12::i;:::-;58190:4;58196:7;58205:4;58139:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58135:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58397:1;58380:6;:13;:18;58376:328;;58423:60;;;;;;;;;;:::i;:::-;;;;;;;;58376:328;58654:6;58648:13;58639:6;58635:2;58631:15;58624:38;58135:584;58271:41;;;58261:51;;;:6;:51;;;;58254:58;;;;;58099:675;58758:4;58751:11;;57928:853;;;;;;;:::o;11539:922::-;11592:7;11612:14;11629:1;11612:18;;11679:6;11670:5;:15;11666:102;;11715:6;11706:15;;;;;;:::i;:::-;;;;;11750:2;11740:12;;;;11666:102;11795:6;11786:5;:15;11782:102;;11831:6;11822:15;;;;;;:::i;:::-;;;;;11866:2;11856:12;;;;11782:102;11911:6;11902:5;:15;11898:102;;11947:6;11938:15;;;;;;:::i;:::-;;;;;11982:2;11972:12;;;;11898:102;12027:5;12018;:14;12014:99;;12062:5;12053:14;;;;;;:::i;:::-;;;;;12096:1;12086:11;;;;12014:99;12140:5;12131;:14;12127:99;;12175:5;12166:14;;;;;;:::i;:::-;;;;;12209:1;12199:11;;;;12127:99;12253:5;12244;:14;12240:99;;12288:5;12279:14;;;;;;:::i;:::-;;;;;12322:1;12312:11;;;;12240:99;12366:5;12357;:14;12353:66;;12402:1;12392:11;;;;12353:66;12447:6;12440:13;;;11539:922;;;:::o;52070:319::-;52199:18;52205:2;52209:7;52199:5;:18::i;:::-;52250:53;52281:1;52285:2;52289:7;52298:4;52250:22;:53::i;:::-;52228:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;52070:319;;;:::o;27323:326::-;27383:4;27640:1;27618:7;:19;;;:23;27611:30;;27323:326;;;:::o;52725:942::-;52819:1;52805:16;;:2;:16;;;52797:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52878:16;52886:7;52878;:16::i;:::-;52877:17;52869:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52940:48;52969:1;52973:2;52977:7;52986:1;52940:20;:48::i;:::-;53087:16;53095:7;53087;:16::i;:::-;53086:17;53078:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53502:1;53485:9;:13;53495:2;53485:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;53546:2;53527:7;:16;53535:7;53527:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53591:7;53587:2;53566:33;;53583:1;53566:33;;;;;;;;;;;;53612:47;53640:1;53644:2;53648:7;53657:1;53612:19;:47::i;:::-;52725:942;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:474::-;1942:6;1950;1999:2;1987:9;1978:7;1974:23;1970:32;1967:119;;;2005:79;;:::i;:::-;1967:119;2125:1;2150:53;2195:7;2186:6;2175:9;2171:22;2150:53;:::i;:::-;2140:63;;2096:117;2252:2;2278:53;2323:7;2314:6;2303:9;2299:22;2278:53;:::i;:::-;2268:63;;2223:118;1874:474;;;;;:::o;2354:99::-;2406:6;2440:5;2434:12;2424:22;;2354:99;;;:::o;2459:169::-;2543:11;2577:6;2572:3;2565:19;2617:4;2612:3;2608:14;2593:29;;2459:169;;;;:::o;2634:246::-;2715:1;2725:113;2739:6;2736:1;2733:13;2725:113;;;2824:1;2819:3;2815:11;2809:18;2805:1;2800:3;2796:11;2789:39;2761:2;2758:1;2754:10;2749:15;;2725:113;;;2872:1;2863:6;2858:3;2854:16;2847:27;2696:184;2634:246;;;:::o;2886:102::-;2927:6;2978:2;2974:7;2969:2;2962:5;2958:14;2954:28;2944:38;;2886:102;;;:::o;2994:377::-;3082:3;3110:39;3143:5;3110:39;:::i;:::-;3165:71;3229:6;3224:3;3165:71;:::i;:::-;3158:78;;3245:65;3303:6;3298:3;3291:4;3284:5;3280:16;3245:65;:::i;:::-;3335:29;3357:6;3335:29;:::i;:::-;3330:3;3326:39;3319:46;;3086:285;2994:377;;;;:::o;3377:313::-;3490:4;3528:2;3517:9;3513:18;3505:26;;3577:9;3571:4;3567:20;3563:1;3552:9;3548:17;3541:47;3605:78;3678:4;3669:6;3605:78;:::i;:::-;3597:86;;3377:313;;;;:::o;3696:329::-;3755:6;3804:2;3792:9;3783:7;3779:23;3775:32;3772:119;;;3810:79;;:::i;:::-;3772:119;3930:1;3955:53;4000:7;3991:6;3980:9;3976:22;3955:53;:::i;:::-;3945:63;;3901:117;3696:329;;;;:::o;4031:126::-;4068:7;4108:42;4101:5;4097:54;4086:65;;4031:126;;;:::o;4163:96::-;4200:7;4229:24;4247:5;4229:24;:::i;:::-;4218:35;;4163:96;;;:::o;4265:118::-;4352:24;4370:5;4352:24;:::i;:::-;4347:3;4340:37;4265:118;;:::o;4389:222::-;4482:4;4520:2;4509:9;4505:18;4497:26;;4533:71;4601:1;4590:9;4586:17;4577:6;4533:71;:::i;:::-;4389:222;;;;:::o;4617:122::-;4690:24;4708:5;4690:24;:::i;:::-;4683:5;4680:35;4670:63;;4729:1;4726;4719:12;4670:63;4617:122;:::o;4745:139::-;4791:5;4829:6;4816:20;4807:29;;4845:33;4872:5;4845:33;:::i;:::-;4745:139;;;;:::o;4890:474::-;4958:6;4966;5015:2;5003:9;4994:7;4990:23;4986:32;4983:119;;;5021:79;;:::i;:::-;4983:119;5141:1;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5112:117;5268:2;5294:53;5339:7;5330:6;5319:9;5315:22;5294:53;:::i;:::-;5284:63;;5239:118;4890:474;;;;;:::o;5370:619::-;5447:6;5455;5463;5512:2;5500:9;5491:7;5487:23;5483:32;5480:119;;;5518:79;;:::i;:::-;5480:119;5638:1;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5609:117;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5893:2;5919:53;5964:7;5955:6;5944:9;5940:22;5919:53;:::i;:::-;5909:63;;5864:118;5370:619;;;;;:::o;5995:117::-;6104:1;6101;6094:12;6118:117;6227:1;6224;6217:12;6241:117;6350:1;6347;6340:12;6378:553;6436:8;6446:6;6496:3;6489:4;6481:6;6477:17;6473:27;6463:122;;6504:79;;:::i;:::-;6463:122;6617:6;6604:20;6594:30;;6647:18;6639:6;6636:30;6633:117;;;6669:79;;:::i;:::-;6633:117;6783:4;6775:6;6771:17;6759:29;;6837:3;6829:4;6821:6;6817:17;6807:8;6803:32;6800:41;6797:128;;;6844:79;;:::i;:::-;6797:128;6378:553;;;;;:::o;6937:529::-;7008:6;7016;7065:2;7053:9;7044:7;7040:23;7036:32;7033:119;;;7071:79;;:::i;:::-;7033:119;7219:1;7208:9;7204:17;7191:31;7249:18;7241:6;7238:30;7235:117;;;7271:79;;:::i;:::-;7235:117;7384:65;7441:7;7432:6;7421:9;7417:22;7384:65;:::i;:::-;7366:83;;;;7162:297;6937:529;;;;;:::o;7472:118::-;7559:24;7577:5;7559:24;:::i;:::-;7554:3;7547:37;7472:118;;:::o;7596:332::-;7717:4;7755:2;7744:9;7740:18;7732:26;;7768:71;7836:1;7825:9;7821:17;7812:6;7768:71;:::i;:::-;7849:72;7917:2;7906:9;7902:18;7893:6;7849:72;:::i;:::-;7596:332;;;;;:::o;7934:329::-;7993:6;8042:2;8030:9;8021:7;8017:23;8013:32;8010:119;;;8048:79;;:::i;:::-;8010:119;8168:1;8193:53;8238:7;8229:6;8218:9;8214:22;8193:53;:::i;:::-;8183:63;;8139:117;7934:329;;;;:::o;8269:222::-;8362:4;8400:2;8389:9;8385:18;8377:26;;8413:71;8481:1;8470:9;8466:17;8457:6;8413:71;:::i;:::-;8269:222;;;;:::o;8497:116::-;8567:21;8582:5;8567:21;:::i;:::-;8560:5;8557:32;8547:60;;8603:1;8600;8593:12;8547:60;8497:116;:::o;8619:133::-;8662:5;8700:6;8687:20;8678:29;;8716:30;8740:5;8716:30;:::i;:::-;8619:133;;;;:::o;8758:468::-;8823:6;8831;8880:2;8868:9;8859:7;8855:23;8851:32;8848:119;;;8886:79;;:::i;:::-;8848:119;9006:1;9031:53;9076:7;9067:6;9056:9;9052:22;9031:53;:::i;:::-;9021:63;;8977:117;9133:2;9159:50;9201:7;9192:6;9181:9;9177:22;9159:50;:::i;:::-;9149:60;;9104:115;8758:468;;;;;:::o;9232:117::-;9341:1;9338;9331:12;9355:180;9403:77;9400:1;9393:88;9500:4;9497:1;9490:15;9524:4;9521:1;9514:15;9541:281;9624:27;9646:4;9624:27;:::i;:::-;9616:6;9612:40;9754:6;9742:10;9739:22;9718:18;9706:10;9703:34;9700:62;9697:88;;;9765:18;;:::i;:::-;9697:88;9805:10;9801:2;9794:22;9584:238;9541:281;;:::o;9828:129::-;9862:6;9889:20;;:::i;:::-;9879:30;;9918:33;9946:4;9938:6;9918:33;:::i;:::-;9828:129;;;:::o;9963:307::-;10024:4;10114:18;10106:6;10103:30;10100:56;;;10136:18;;:::i;:::-;10100:56;10174:29;10196:6;10174:29;:::i;:::-;10166:37;;10258:4;10252;10248:15;10240:23;;9963:307;;;:::o;10276:146::-;10373:6;10368:3;10363;10350:30;10414:1;10405:6;10400:3;10396:16;10389:27;10276:146;;;:::o;10428:423::-;10505:5;10530:65;10546:48;10587:6;10546:48;:::i;:::-;10530:65;:::i;:::-;10521:74;;10618:6;10611:5;10604:21;10656:4;10649:5;10645:16;10694:3;10685:6;10680:3;10676:16;10673:25;10670:112;;;10701:79;;:::i;:::-;10670:112;10791:54;10838:6;10833:3;10828;10791:54;:::i;:::-;10511:340;10428:423;;;;;:::o;10870:338::-;10925:5;10974:3;10967:4;10959:6;10955:17;10951:27;10941:122;;10982:79;;:::i;:::-;10941:122;11099:6;11086:20;11124:78;11198:3;11190:6;11183:4;11175:6;11171:17;11124:78;:::i;:::-;11115:87;;10931:277;10870:338;;;;:::o;11214:943::-;11309:6;11317;11325;11333;11382:3;11370:9;11361:7;11357:23;11353:33;11350:120;;;11389:79;;:::i;:::-;11350:120;11509:1;11534:53;11579:7;11570:6;11559:9;11555:22;11534:53;:::i;:::-;11524:63;;11480:117;11636:2;11662:53;11707:7;11698:6;11687:9;11683:22;11662:53;:::i;:::-;11652:63;;11607:118;11764:2;11790:53;11835:7;11826:6;11815:9;11811:22;11790:53;:::i;:::-;11780:63;;11735:118;11920:2;11909:9;11905:18;11892:32;11951:18;11943:6;11940:30;11937:117;;;11973:79;;:::i;:::-;11937:117;12078:62;12132:7;12123:6;12112:9;12108:22;12078:62;:::i;:::-;12068:72;;11863:287;11214:943;;;;;;;:::o;12163:474::-;12231:6;12239;12288:2;12276:9;12267:7;12263:23;12259:32;12256:119;;;12294:79;;:::i;:::-;12256:119;12414:1;12439:53;12484:7;12475:6;12464:9;12460:22;12439:53;:::i;:::-;12429:63;;12385:117;12541:2;12567:53;12612:7;12603:6;12592:9;12588:22;12567:53;:::i;:::-;12557:63;;12512:118;12163:474;;;;;:::o;12643:163::-;12783:15;12779:1;12771:6;12767:14;12760:39;12643:163;:::o;12812:366::-;12954:3;12975:67;13039:2;13034:3;12975:67;:::i;:::-;12968:74;;13051:93;13140:3;13051:93;:::i;:::-;13169:2;13164:3;13160:12;13153:19;;12812:366;;;:::o;13184:419::-;13350:4;13388:2;13377:9;13373:18;13365:26;;13437:9;13431:4;13427:20;13423:1;13412:9;13408:17;13401:47;13465:131;13591:4;13465:131;:::i;:::-;13457:139;;13184:419;;;:::o;13609:180::-;13657:77;13654:1;13647:88;13754:4;13751:1;13744:15;13778:4;13775:1;13768:15;13795:320;13839:6;13876:1;13870:4;13866:12;13856:22;;13923:1;13917:4;13913:12;13944:18;13934:81;;14000:4;13992:6;13988:17;13978:27;;13934:81;14062:2;14054:6;14051:14;14031:18;14028:38;14025:84;;14081:18;;:::i;:::-;14025:84;13846:269;13795:320;;;:::o;14121:220::-;14261:34;14257:1;14249:6;14245:14;14238:58;14330:3;14325:2;14317:6;14313:15;14306:28;14121:220;:::o;14347:366::-;14489:3;14510:67;14574:2;14569:3;14510:67;:::i;:::-;14503:74;;14586:93;14675:3;14586:93;:::i;:::-;14704:2;14699:3;14695:12;14688:19;;14347:366;;;:::o;14719:419::-;14885:4;14923:2;14912:9;14908:18;14900:26;;14972:9;14966:4;14962:20;14958:1;14947:9;14943:17;14936:47;15000:131;15126:4;15000:131;:::i;:::-;14992:139;;14719:419;;;:::o;15144:248::-;15284:34;15280:1;15272:6;15268:14;15261:58;15353:31;15348:2;15340:6;15336:15;15329:56;15144:248;:::o;15398:366::-;15540:3;15561:67;15625:2;15620:3;15561:67;:::i;:::-;15554:74;;15637:93;15726:3;15637:93;:::i;:::-;15755:2;15750:3;15746:12;15739:19;;15398:366;;;:::o;15770:419::-;15936:4;15974:2;15963:9;15959:18;15951:26;;16023:9;16017:4;16013:20;16009:1;15998:9;15994:17;15987:47;16051:131;16177:4;16051:131;:::i;:::-;16043:139;;15770:419;;;:::o;16195:232::-;16335:34;16331:1;16323:6;16319:14;16312:58;16404:15;16399:2;16391:6;16387:15;16380:40;16195:232;:::o;16433:366::-;16575:3;16596:67;16660:2;16655:3;16596:67;:::i;:::-;16589:74;;16672:93;16761:3;16672:93;:::i;:::-;16790:2;16785:3;16781:12;16774:19;;16433:366;;;:::o;16805:419::-;16971:4;17009:2;16998:9;16994:18;16986:26;;17058:9;17052:4;17048:20;17044:1;17033:9;17029:17;17022:47;17086:131;17212:4;17086:131;:::i;:::-;17078:139;;16805:419;;;:::o;17230:137::-;17284:5;17315:6;17309:13;17300:22;;17331:30;17355:5;17331:30;:::i;:::-;17230:137;;;;:::o;17373:345::-;17440:6;17489:2;17477:9;17468:7;17464:23;17460:32;17457:119;;;17495:79;;:::i;:::-;17457:119;17615:1;17640:61;17693:7;17684:6;17673:9;17669:22;17640:61;:::i;:::-;17630:71;;17586:125;17373:345;;;;:::o;17724:97::-;17783:6;17811:3;17801:13;;17724:97;;;;:::o;17827:141::-;17876:4;17899:3;17891:11;;17922:3;17919:1;17912:14;17956:4;17953:1;17943:18;17935:26;;17827:141;;;:::o;17974:93::-;18011:6;18058:2;18053;18046:5;18042:14;18038:23;18028:33;;17974:93;;;:::o;18073:107::-;18117:8;18167:5;18161:4;18157:16;18136:37;;18073:107;;;;:::o;18186:393::-;18255:6;18305:1;18293:10;18289:18;18328:97;18358:66;18347:9;18328:97;:::i;:::-;18446:39;18476:8;18465:9;18446:39;:::i;:::-;18434:51;;18518:4;18514:9;18507:5;18503:21;18494:30;;18567:4;18557:8;18553:19;18546:5;18543:30;18533:40;;18262:317;;18186:393;;;;;:::o;18585:60::-;18613:3;18634:5;18627:12;;18585:60;;;:::o;18651:142::-;18701:9;18734:53;18752:34;18761:24;18779:5;18761:24;:::i;:::-;18752:34;:::i;:::-;18734:53;:::i;:::-;18721:66;;18651:142;;;:::o;18799:75::-;18842:3;18863:5;18856:12;;18799:75;;;:::o;18880:269::-;18990:39;19021:7;18990:39;:::i;:::-;19051:91;19100:41;19124:16;19100:41;:::i;:::-;19092:6;19085:4;19079:11;19051:91;:::i;:::-;19045:4;19038:105;18956:193;18880:269;;;:::o;19155:73::-;19200:3;19155:73;:::o;19234:189::-;19311:32;;:::i;:::-;19352:65;19410:6;19402;19396:4;19352:65;:::i;:::-;19287:136;19234:189;;:::o;19429:186::-;19489:120;19506:3;19499:5;19496:14;19489:120;;;19560:39;19597:1;19590:5;19560:39;:::i;:::-;19533:1;19526:5;19522:13;19513:22;;19489:120;;;19429:186;;:::o;19621:543::-;19722:2;19717:3;19714:11;19711:446;;;19756:38;19788:5;19756:38;:::i;:::-;19840:29;19858:10;19840:29;:::i;:::-;19830:8;19826:44;20023:2;20011:10;20008:18;20005:49;;;20044:8;20029:23;;20005:49;20067:80;20123:22;20141:3;20123:22;:::i;:::-;20113:8;20109:37;20096:11;20067:80;:::i;:::-;19726:431;;19711:446;19621:543;;;:::o;20170:117::-;20224:8;20274:5;20268:4;20264:16;20243:37;;20170:117;;;;:::o;20293:169::-;20337:6;20370:51;20418:1;20414:6;20406:5;20403:1;20399:13;20370:51;:::i;:::-;20366:56;20451:4;20445;20441:15;20431:25;;20344:118;20293:169;;;;:::o;20467:295::-;20543:4;20689:29;20714:3;20708:4;20689:29;:::i;:::-;20681:37;;20751:3;20748:1;20744:11;20738:4;20735:21;20727:29;;20467:295;;;;:::o;20767:1403::-;20891:44;20931:3;20926;20891:44;:::i;:::-;21000:18;20992:6;20989:30;20986:56;;;21022:18;;:::i;:::-;20986:56;21066:38;21098:4;21092:11;21066:38;:::i;:::-;21151:67;21211:6;21203;21197:4;21151:67;:::i;:::-;21245:1;21274:2;21266:6;21263:14;21291:1;21286:632;;;;21962:1;21979:6;21976:84;;;22035:9;22030:3;22026:19;22013:33;22004:42;;21976:84;22086:67;22146:6;22139:5;22086:67;:::i;:::-;22080:4;22073:81;21935:229;21256:908;;21286:632;21338:4;21334:9;21326:6;21322:22;21372:37;21404:4;21372:37;:::i;:::-;21431:1;21445:215;21459:7;21456:1;21453:14;21445:215;;;21545:9;21540:3;21536:19;21523:33;21515:6;21508:49;21596:1;21588:6;21584:14;21574:24;;21643:2;21632:9;21628:18;21615:31;;21482:4;21479:1;21475:12;21470:17;;21445:215;;;21688:6;21679:7;21676:19;21673:186;;;21753:9;21748:3;21744:19;21731:33;21796:48;21838:4;21830:6;21826:17;21815:9;21796:48;:::i;:::-;21788:6;21781:64;21696:163;21673:186;21905:1;21901;21893:6;21889:14;21885:22;21879:4;21872:36;21293:625;;;21256:908;;20866:1304;;;20767:1403;;;:::o;22176:174::-;22316:26;22312:1;22304:6;22300:14;22293:50;22176:174;:::o;22356:366::-;22498:3;22519:67;22583:2;22578:3;22519:67;:::i;:::-;22512:74;;22595:93;22684:3;22595:93;:::i;:::-;22713:2;22708:3;22704:12;22697:19;;22356:366;;;:::o;22728:419::-;22894:4;22932:2;22921:9;22917:18;22909:26;;22981:9;22975:4;22971:20;22967:1;22956:9;22952:17;22945:47;23009:131;23135:4;23009:131;:::i;:::-;23001:139;;22728:419;;;:::o;23153:228::-;23293:34;23289:1;23281:6;23277:14;23270:58;23362:11;23357:2;23349:6;23345:15;23338:36;23153:228;:::o;23387:366::-;23529:3;23550:67;23614:2;23609:3;23550:67;:::i;:::-;23543:74;;23626:93;23715:3;23626:93;:::i;:::-;23744:2;23739:3;23735:12;23728:19;;23387:366;;;:::o;23759:419::-;23925:4;23963:2;23952:9;23948:18;23940:26;;24012:9;24006:4;24002:20;23998:1;23987:9;23983:17;23976:47;24040:131;24166:4;24040:131;:::i;:::-;24032:139;;23759:419;;;:::o;24184:177::-;24324:29;24320:1;24312:6;24308:14;24301:53;24184:177;:::o;24367:366::-;24509:3;24530:67;24594:2;24589:3;24530:67;:::i;:::-;24523:74;;24606:93;24695:3;24606:93;:::i;:::-;24724:2;24719:3;24715:12;24708:19;;24367:366;;;:::o;24739:419::-;24905:4;24943:2;24932:9;24928:18;24920:26;;24992:9;24986:4;24982:20;24978:1;24967:9;24963:17;24956:47;25020:131;25146:4;25020:131;:::i;:::-;25012:139;;24739:419;;;:::o;25164:177::-;25304:29;25300:1;25292:6;25288:14;25281:53;25164:177;:::o;25347:366::-;25489:3;25510:67;25574:2;25569:3;25510:67;:::i;:::-;25503:74;;25586:93;25675:3;25586:93;:::i;:::-;25704:2;25699:3;25695:12;25688:19;;25347:366;;;:::o;25719:419::-;25885:4;25923:2;25912:9;25908:18;25900:26;;25972:9;25966:4;25962:20;25958:1;25947:9;25943:17;25936:47;26000:131;26126:4;26000:131;:::i;:::-;25992:139;;25719:419;;;:::o;26144:169::-;26284:21;26280:1;26272:6;26268:14;26261:45;26144:169;:::o;26319:366::-;26461:3;26482:67;26546:2;26541:3;26482:67;:::i;:::-;26475:74;;26558:93;26647:3;26558:93;:::i;:::-;26676:2;26671:3;26667:12;26660:19;;26319:366;;;:::o;26691:419::-;26857:4;26895:2;26884:9;26880:18;26872:26;;26944:9;26938:4;26934:20;26930:1;26919:9;26915:17;26908:47;26972:131;27098:4;26972:131;:::i;:::-;26964:139;;26691:419;;;:::o;27116:174::-;27256:26;27252:1;27244:6;27240:14;27233:50;27116:174;:::o;27296:366::-;27438:3;27459:67;27523:2;27518:3;27459:67;:::i;:::-;27452:74;;27535:93;27624:3;27535:93;:::i;:::-;27653:2;27648:3;27644:12;27637:19;;27296:366;;;:::o;27668:419::-;27834:4;27872:2;27861:9;27857:18;27849:26;;27921:9;27915:4;27911:20;27907:1;27896:9;27892:17;27885:47;27949:131;28075:4;27949:131;:::i;:::-;27941:139;;27668:419;;;:::o;28093:165::-;28233:17;28229:1;28221:6;28217:14;28210:41;28093:165;:::o;28264:366::-;28406:3;28427:67;28491:2;28486:3;28427:67;:::i;:::-;28420:74;;28503:93;28592:3;28503:93;:::i;:::-;28621:2;28616:3;28612:12;28605:19;;28264:366;;;:::o;28636:419::-;28802:4;28840:2;28829:9;28825:18;28817:26;;28889:9;28883:4;28879:20;28875:1;28864:9;28860:17;28853:47;28917:131;29043:4;28917:131;:::i;:::-;28909:139;;28636:419;;;:::o;29061:180::-;29109:77;29106:1;29099:88;29206:4;29203:1;29196:15;29230:4;29227:1;29220:15;29247:191;29287:3;29306:20;29324:1;29306:20;:::i;:::-;29301:25;;29340:20;29358:1;29340:20;:::i;:::-;29335:25;;29383:1;29380;29376:9;29369:16;;29404:3;29401:1;29398:10;29395:36;;;29411:18;;:::i;:::-;29395:36;29247:191;;;;:::o;29444:194::-;29484:4;29504:20;29522:1;29504:20;:::i;:::-;29499:25;;29538:20;29556:1;29538:20;:::i;:::-;29533:25;;29582:1;29579;29575:9;29567:17;;29606:1;29600:4;29597:11;29594:37;;;29611:18;;:::i;:::-;29594:37;29444:194;;;;:::o;29644:177::-;29784:29;29780:1;29772:6;29768:14;29761:53;29644:177;:::o;29827:366::-;29969:3;29990:67;30054:2;30049:3;29990:67;:::i;:::-;29983:74;;30066:93;30155:3;30066:93;:::i;:::-;30184:2;30179:3;30175:12;30168:19;;29827:366;;;:::o;30199:419::-;30365:4;30403:2;30392:9;30388:18;30380:26;;30452:9;30446:4;30442:20;30438:1;30427:9;30423:17;30416:47;30480:131;30606:4;30480:131;:::i;:::-;30472:139;;30199:419;;;:::o;30624:173::-;30764:25;30760:1;30752:6;30748:14;30741:49;30624:173;:::o;30803:366::-;30945:3;30966:67;31030:2;31025:3;30966:67;:::i;:::-;30959:74;;31042:93;31131:3;31042:93;:::i;:::-;31160:2;31155:3;31151:12;31144:19;;30803:366;;;:::o;31175:419::-;31341:4;31379:2;31368:9;31364:18;31356:26;;31428:9;31422:4;31418:20;31414:1;31403:9;31399:17;31392:47;31456:131;31582:4;31456:131;:::i;:::-;31448:139;;31175:419;;;:::o;31600:158::-;31740:10;31736:1;31728:6;31724:14;31717:34;31600:158;:::o;31764:365::-;31906:3;31927:66;31991:1;31986:3;31927:66;:::i;:::-;31920:73;;32002:93;32091:3;32002:93;:::i;:::-;32120:2;32115:3;32111:12;32104:19;;31764:365;;;:::o;32135:419::-;32301:4;32339:2;32328:9;32324:18;32316:26;;32388:9;32382:4;32378:20;32374:1;32363:9;32359:17;32352:47;32416:131;32542:4;32416:131;:::i;:::-;32408:139;;32135:419;;;:::o;32560:442::-;32709:4;32747:2;32736:9;32732:18;32724:26;;32760:71;32828:1;32817:9;32813:17;32804:6;32760:71;:::i;:::-;32841:72;32909:2;32898:9;32894:18;32885:6;32841:72;:::i;:::-;32923;32991:2;32980:9;32976:18;32967:6;32923:72;:::i;:::-;32560:442;;;;;;:::o;33008:233::-;33047:3;33070:24;33088:5;33070:24;:::i;:::-;33061:33;;33116:66;33109:5;33106:77;33103:103;;33186:18;;:::i;:::-;33103:103;33233:1;33226:5;33222:13;33215:20;;33008:233;;;:::o;33247:148::-;33349:11;33386:3;33371:18;;33247:148;;;;:::o;33401:390::-;33507:3;33535:39;33568:5;33535:39;:::i;:::-;33590:89;33672:6;33667:3;33590:89;:::i;:::-;33583:96;;33688:65;33746:6;33741:3;33734:4;33727:5;33723:16;33688:65;:::i;:::-;33778:6;33773:3;33769:16;33762:23;;33511:280;33401:390;;;;:::o;33797:435::-;33977:3;33999:95;34090:3;34081:6;33999:95;:::i;:::-;33992:102;;34111:95;34202:3;34193:6;34111:95;:::i;:::-;34104:102;;34223:3;34216:10;;33797:435;;;;;:::o;34238:160::-;34378:12;34374:1;34366:6;34362:14;34355:36;34238:160;:::o;34404:366::-;34546:3;34567:67;34631:2;34626:3;34567:67;:::i;:::-;34560:74;;34643:93;34732:3;34643:93;:::i;:::-;34761:2;34756:3;34752:12;34745:19;;34404:366;;;:::o;34776:419::-;34942:4;34980:2;34969:9;34965:18;34957:26;;35029:9;35023:4;35019:20;35015:1;35004:9;35000:17;34993:47;35057:131;35183:4;35057:131;:::i;:::-;35049:139;;34776:419;;;:::o;35201:225::-;35341:34;35337:1;35329:6;35325:14;35318:58;35410:8;35405:2;35397:6;35393:15;35386:33;35201:225;:::o;35432:366::-;35574:3;35595:67;35659:2;35654:3;35595:67;:::i;:::-;35588:74;;35671:93;35760:3;35671:93;:::i;:::-;35789:2;35784:3;35780:12;35773:19;;35432:366;;;:::o;35804:419::-;35970:4;36008:2;35997:9;35993:18;35985:26;;36057:9;36051:4;36047:20;36043:1;36032:9;36028:17;36021:47;36085:131;36211:4;36085:131;:::i;:::-;36077:139;;35804:419;;;:::o;36229:182::-;36369:34;36365:1;36357:6;36353:14;36346:58;36229:182;:::o;36417:366::-;36559:3;36580:67;36644:2;36639:3;36580:67;:::i;:::-;36573:74;;36656:93;36745:3;36656:93;:::i;:::-;36774:2;36769:3;36765:12;36758:19;;36417:366;;;:::o;36789:419::-;36955:4;36993:2;36982:9;36978:18;36970:26;;37042:9;37036:4;37032:20;37028:1;37017:9;37013:17;37006:47;37070:131;37196:4;37070:131;:::i;:::-;37062:139;;36789:419;;;:::o;37214:224::-;37354:34;37350:1;37342:6;37338:14;37331:58;37423:7;37418:2;37410:6;37406:15;37399:32;37214:224;:::o;37444:366::-;37586:3;37607:67;37671:2;37666:3;37607:67;:::i;:::-;37600:74;;37683:93;37772:3;37683:93;:::i;:::-;37801:2;37796:3;37792:12;37785:19;;37444:366;;;:::o;37816:419::-;37982:4;38020:2;38009:9;38005:18;37997:26;;38069:9;38063:4;38059:20;38055:1;38044:9;38040:17;38033:47;38097:131;38223:4;38097:131;:::i;:::-;38089:139;;37816:419;;;:::o;38241:223::-;38381:34;38377:1;38369:6;38365:14;38358:58;38450:6;38445:2;38437:6;38433:15;38426:31;38241:223;:::o;38470:366::-;38612:3;38633:67;38697:2;38692:3;38633:67;:::i;:::-;38626:74;;38709:93;38798:3;38709:93;:::i;:::-;38827:2;38822:3;38818:12;38811:19;;38470:366;;;:::o;38842:419::-;39008:4;39046:2;39035:9;39031:18;39023:26;;39095:9;39089:4;39085:20;39081:1;39070:9;39066:17;39059:47;39123:131;39249:4;39123:131;:::i;:::-;39115:139;;38842:419;;;:::o;39267:410::-;39307:7;39330:20;39348:1;39330:20;:::i;:::-;39325:25;;39364:20;39382:1;39364:20;:::i;:::-;39359:25;;39419:1;39416;39412:9;39441:30;39459:11;39441:30;:::i;:::-;39430:41;;39620:1;39611:7;39607:15;39604:1;39601:22;39581:1;39574:9;39554:83;39531:139;;39650:18;;:::i;:::-;39531:139;39315:362;39267:410;;;;:::o;39683:175::-;39823:27;39819:1;39811:6;39807:14;39800:51;39683:175;:::o;39864:366::-;40006:3;40027:67;40091:2;40086:3;40027:67;:::i;:::-;40020:74;;40103:93;40192:3;40103:93;:::i;:::-;40221:2;40216:3;40212:12;40205:19;;39864:366;;;:::o;40236:419::-;40402:4;40440:2;40429:9;40425:18;40417:26;;40489:9;40483:4;40479:20;40475:1;40464:9;40460:17;40453:47;40517:131;40643:4;40517:131;:::i;:::-;40509:139;;40236:419;;;:::o;40661:237::-;40801:34;40797:1;40789:6;40785:14;40778:58;40870:20;40865:2;40857:6;40853:15;40846:45;40661:237;:::o;40904:366::-;41046:3;41067:67;41131:2;41126:3;41067:67;:::i;:::-;41060:74;;41143:93;41232:3;41143:93;:::i;:::-;41261:2;41256:3;41252:12;41245:19;;40904:366;;;:::o;41276:419::-;41442:4;41480:2;41469:9;41465:18;41457:26;;41529:9;41523:4;41519:20;41515:1;41504:9;41500:17;41493:47;41557:131;41683:4;41557:131;:::i;:::-;41549:139;;41276:419;;;:::o;41701:180::-;41749:77;41746:1;41739:88;41846:4;41843:1;41836:15;41870:4;41867:1;41860:15;41887:98;41938:6;41972:5;41966:12;41956:22;;41887:98;;;:::o;41991:168::-;42074:11;42108:6;42103:3;42096:19;42148:4;42143:3;42139:14;42124:29;;41991:168;;;;:::o;42165:373::-;42251:3;42279:38;42311:5;42279:38;:::i;:::-;42333:70;42396:6;42391:3;42333:70;:::i;:::-;42326:77;;42412:65;42470:6;42465:3;42458:4;42451:5;42447:16;42412:65;:::i;:::-;42502:29;42524:6;42502:29;:::i;:::-;42497:3;42493:39;42486:46;;42255:283;42165:373;;;;:::o;42544:640::-;42739:4;42777:3;42766:9;42762:19;42754:27;;42791:71;42859:1;42848:9;42844:17;42835:6;42791:71;:::i;:::-;42872:72;42940:2;42929:9;42925:18;42916:6;42872:72;:::i;:::-;42954;43022:2;43011:9;43007:18;42998:6;42954:72;:::i;:::-;43073:9;43067:4;43063:20;43058:2;43047:9;43043:18;43036:48;43101:76;43172:4;43163:6;43101:76;:::i;:::-;43093:84;;42544:640;;;;;;;:::o;43190:141::-;43246:5;43277:6;43271:13;43262:22;;43293:32;43319:5;43293:32;:::i;:::-;43190:141;;;;:::o;43337:349::-;43406:6;43455:2;43443:9;43434:7;43430:23;43426:32;43423:119;;;43461:79;;:::i;:::-;43423:119;43581:1;43606:63;43661:7;43652:6;43641:9;43637:22;43606:63;:::i;:::-;43596:73;;43552:127;43337:349;;;;:::o;43692:182::-;43832:34;43828:1;43820:6;43816:14;43809:58;43692:182;:::o;43880:366::-;44022:3;44043:67;44107:2;44102:3;44043:67;:::i;:::-;44036:74;;44119:93;44208:3;44119:93;:::i;:::-;44237:2;44232:3;44228:12;44221:19;;43880:366;;;:::o;44252:419::-;44418:4;44456:2;44445:9;44441:18;44433:26;;44505:9;44499:4;44495:20;44491:1;44480:9;44476:17;44469:47;44533:131;44659:4;44533:131;:::i;:::-;44525:139;;44252:419;;;:::o;44677:178::-;44817:30;44813:1;44805:6;44801:14;44794:54;44677:178;:::o;44861:366::-;45003:3;45024:67;45088:2;45083:3;45024:67;:::i;:::-;45017:74;;45100:93;45189:3;45100:93;:::i;:::-;45218:2;45213:3;45209:12;45202:19;;44861:366;;;:::o;45233:419::-;45399:4;45437:2;45426:9;45422:18;45414:26;;45486:9;45480:4;45476:20;45472:1;45461:9;45457:17;45450:47;45514:131;45640:4;45514:131;:::i;:::-;45506:139;;45233:419;;;:::o

Swarm Source

ipfs://f042154d08458b0d02554760aa965e5e96e7c7a9c9ea3d2dbd5cc2046f0866f3
Loading...
Loading
Loading...
Loading
[ 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.