ETH Price: $3,936.91 (+5.72%)

Token

ERC-20: Onchain Power (POWER)

Overview

Max Total Supply

1,213 POWER

Holders

1,079

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
OnchainPower

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at zkevm.polygonscan.com on 2023-04-16
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/math/Math.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not 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 {}
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/OnchainPower.sol



pragma solidity >=0.8.0 <0.9.0;



library Base64 {
  string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)
            
            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }
            
            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }
        
        return result;
    }
  function buildImage(string memory _bgHue, string memory _eyesHue, string memory _pukeHue) internal pure returns(string memory) {
    return encode(bytes(abi.encodePacked(
      '<?xml version="1.0" encoding="utf-8"?><svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1024px" height="1024px" viewBox="0 0 1024 1024" preserveAspectRatio="xMidYMid meet">',
      '<g fill="hsl(', _bgHue, ',100%,80%)"><path d="M0 512 l0 -512 512 0 512 0 0 512 0 512 -512 0 -512 0 0 -512z m513.7 403.9 c3 -1.1 8.8 -6.3 10.4 -9.2 0.6 -1 1.9 -5.1 3 -9.2 1 -4.1 3.2 -9.6 4.7 -12.2 3.5 -6 6.2 -6.5 14.6 -2.7 15.6 7.1 35.3 -0.3 43.3 -16.1 3.3 -6.5 6.3 -23.9 6.4 -37.5 0 -5.8 0.6 -20.1 1.2 -31.8 l1.2 -21.4 6.7 -2.3 c43.6 -15.2 79.2 -44.7 109.4 -90.5 22.7 -34.4 35.7 -72.7 34 -100 -1.3 -20.8 -9.2 -39.4 -22.2 -52.4 -14.8 -14.8 -33.6 -22 -57.4 -21.9 -11.5 0.1 -13.5 0.4 -24.5 3.8 -8.3 2.5 -17 6.3 -28.5 12.2 -40.9 21.3 -49.1 25.1 -64.8 30.2 -31 9.8 -43.1 11.5 -80.7 11.6 -42.6 0 -52.9 -2.1 -112 -22.7 -25.8 -9.1 -52.2 1.2 -69 26.7 -5.9 9 -10.6 21.4 -12.4 32.5 -7.1 43.8 24.5 96.3 82.4 136.7 24 16.7 49.3 29.7 78 40 l8 2.9 -0.1 3.9 c0 2.2 -0.5 8.9 -1.2 14.9 -0.7 6 -1.2 18.5 -1.2 27.7 0 25.5 2.5 35.5 11.4 44.7 7 7.4 10.2 8.5 23 8.1 l11 -0.4 0.9 4 c0.4 2.2 1.2 6.9 1.8 10.4 1.6 10.1 5.1 15.6 12.4 19.4 3.6 1.9 6.4 2.1 10.2 0.6z m-144.6 -485.5 c37.8 -6.1 67.4 -28.2 82.9 -61.8 8.5 -18.4 12.2 -36.9 12.3 -61.6 0.1 -16.2 -0.1 -18.3 -2.7 -28.5 -4.6 -17.6 -11.6 -30.5 -23 -42.4 -18.6 -19.3 -45.1 -30.4 -72.6 -30.4 -12.1 -0.1 -16.7 0.7 -32 5.5 -40.1 12.5 -66.1 38.4 -76.7 76.3 -2.7 9.5 -2.8 11 -2.7 30.5 0.1 21.2 1.1 29.4 5.6 45.9 10.3 37.7 33.8 60.5 68.8 66.5 15.9 2.7 23.7 2.7 40.1 0z m261.2 0 c12.7 -2.4 25.2 -7.3 39.1 -15.4 11.3 -6.5 18.2 -11.7 26.9 -20.3 29.7 -29.3 38.3 -66.7 25 -109.2 -9.2 -29.3 -29.6 -54.6 -56.3 -69.7 -18.8 -10.6 -44 -15.5 -64 -12.4 -13 2 -18.9 3.7 -31.3 8.8 -38.7 16 -61.8 50.7 -66.8 100.3 -1.9 19.3 -0.3 37 5.1 56 7.7 27.2 28 48 55.5 56.8 21.9 7 46.7 8.9 66.8 5.1z"/></g>',
      '<g fill="#5c2929"><path d="M494.5 784.3 c-12.2 -0.7 -28.5 -2.6 -33.5 -3.8 -15.1 -3.6 -26.4 -7 -34.5 -10.2 -34.3 -13.6 -68.3 -34.5 -92 -56.5 -24.3 -22.5 -36.5 -39.3 -45.4 -62.2 -5.1 -13.2 -6.5 -22.9 -5.8 -41.5 0.7 -20.3 4.7 -31.8 15.6 -44.8 10.4 -12.5 23.7 -18.3 41.6 -18.3 11.3 0 12.8 0.4 41.6 10.3 33.2 11.5 53 15.6 79.9 16.4 34.9 1.1 68.1 -4.7 102 -17.7 7.9 -3 19.6 -8.9 54 -26.8 22.7 -11.8 36.2 -15 58 -13.8 14.1 0.8 22.2 2.6 32 7.3 14.1 6.7 26.9 22.8 31.7 39.5 2 7.4 2.9 33.4 1.3 43.9 -2.4 17.1 -7.3 31.8 -16.7 50.4 -7.6 15.2 -7.4 14.9 -13.6 24.4 -19 29.1 -46.9 57.3 -68.8 69.6 -14.2 7.9 -19.7 10.5 -22.5 10.5 -2.8 0 -3.3 -0.5 -4.9 -4.7 -5 -13.5 -13.9 -31.5 -21.9 -44.1 -2.9 -4.7 -18.5 -23 -23.7 -27.9 -8.9 -8.4 -34.6 -22.7 -46.4 -25.8 -10.5 -2.8 -18.2 -3 -25.8 -0.7 -9.8 2.9 -13.2 5.6 -17 13.2 -2.7 5.4 -3.2 7.6 -3.1 13 0.1 7.6 5 24.3 12 40.7 2.4 5.7 4.4 10.5 4.4 10.8 0 0.4 0.8 2.5 1.9 4.8 1 2.3 3.8 9.4 6.1 15.7 2.4 6.3 4.7 12.1 5.3 12.8 0.5 0.7 1.2 4.6 1.5 8.7 l0.5 7.5 -4.4 -0.2 c-2.4 -0.1 -6.6 -0.3 -9.4 -0.5z"/><path d="M685.4 230.6 c-0.3 -0.8 -0.4 -2.6 -0.2 -4.1 l0.3 -2.6 4 4 3.9 4.1 -3.7 0 c-2.3 0 -4 -0.5 -4.3 -1.4z"/></g>',
      '<g fill="hsl(', _eyesHue, ',100%,92%)"><path d="M328.5 428.3 c-25.4 -5.6 -39.6 -13.8 -50.9 -29.2 -13.1 -17.9 -20.6 -47.5 -20.6 -81.6 0 -46.9 17.6 -77.3 55.4 -96 20 -9.9 35.4 -13 59.9 -12.2 26.7 0.8 44.2 7.6 62.5 24.3 18.8 17 28 42.8 26.9 75.4 -0.8 22.5 -2.6 34.6 -7.7 50.1 -6.7 20.5 -18.6 37.4 -34.3 49.1 -9.2 6.8 -22.9 13.7 -31.7 15.8 -16.9 4.2 -22.7 4.9 -40 4.9 -9.6 -0.1 -18.4 -0.3 -19.5 -0.6z m-21.8 -124.8 c1.9 -0.8 5.9 -1.5 8.7 -1.5 5.5 0 8.7 -1.2 6.6 -2.5 -0.7 -0.4 -1 -2.7 -0.9 -5.9 0.1 -2.8 -0.3 -6.1 -0.9 -7.3 -0.7 -1.2 -1.2 -3.2 -1.2 -4.4 0 -3.9 -2.8 -5.9 -8.1 -5.9 -3.7 0 -5.3 0.5 -6.9 2.2 -1.1 1.2 -2 2.5 -2 3 0 0.4 -1.8 2 -4 3.4 -2.2 1.5 -4 3.1 -4 3.7 0 0.6 1.1 2.5 2.5 4.3 1.4 1.8 2.5 4.6 2.5 6.3 0 2.5 2.1 6.1 3.6 6.1 0.3 0 2.1 -0.7 4.1 -1.5z"/><path d="M582.5 427.5 c-26.2 -4.2 -42.1 -11.6 -55.1 -25.9 -7.3 -8 -14.1 -20.7 -17.4 -32.6 -9.7 -35 -4.5 -86.9 11.6 -114.3 12.8 -21.8 31.7 -36.3 57.4 -44.1 12.2 -3.6 19.6 -4.6 36.2 -4.6 20.1 0 33.9 3 49.2 10.7 19.3 9.7 38.7 30.3 48.3 51 7.2 15.7 9.8 25.9 11.2 44.9 2.4 31.4 -4.4 54.2 -22.3 74.9 -8.7 10.1 -12.9 13.8 -23.6 20.9 -14.8 9.8 -27.9 15.6 -43.7 19 -8.9 2 -39.8 2 -51.8 0.1z m84.9 -128.5 c2.3 0 4.7 -0.5 5.4 -1.2 1.9 -1.9 1.4 -5.3 -1.3 -7.8 -1.4 -1.3 -2.5 -3.4 -2.5 -4.6 0 -1.3 -0.6 -2.8 -1.2 -3.3 -7.9 -6.5 -7.7 -6.4 -10.2 -4.8 -1.3 0.9 -4.5 1.7 -7.2 1.9 l-4.9 0.3 -0.3 5 c-0.2 2.7 -0.8 5.5 -1.4 6.2 -1.5 1.8 -0.2 3.2 5.5 5.7 2.9 1.3 6.3 3.6 7.6 5.1 l2.4 2.8 1.9 -2.6 c1.6 -2.2 2.8 -2.7 6.2 -2.7z"/></g>',
      '<g fill="#010101">',
      '<path d="M500.5 918.3 c-7.3 -3.8 -10.8 -9.3 -12.4 -19.4 -0.6 -3.5 -1.4 -8.1 -1.8 -10.3 l-0.8 -3.9 -11.2 0.2 c-12.9 0.2 -16 -0.9 -22.9 -8.1 -9.2 -9.5 -11.4 -18.9 -11.4 -47.7 0 -15.7 1.1 -35.1 2.3 -42.5 0.1 -0.5 -3.4 -2.3 -7.8 -3.9 -69.1 -25.1 -125.3 -69.3 -149.2 -117.2 -16.9 -33.7 -16.4 -71.2 1.2 -98 9.2 -14 20.1 -22.4 36 -28.1 3.7 -1.3 8.1 -1.8 17.5 -1.8 11.5 0 13.2 0.2 21.5 3.1 36.2 12.8 56.4 18.6 74.5 21.5 5.6 0.8 17.5 1.3 34.5 1.3 34.3 -0.1 47.4 -2 77.7 -11.6 15.7 -5.1 23.9 -8.9 64.8 -30.2 11.4 -5.9 20.2 -9.7 28.5 -12.3 11.4 -3.5 12.7 -3.7 27 -3.8 16.1 -0.1 24.8 1.3 36.5 5.9 39.6 15.5 56.4 61.2 41.5 113 -6 20.7 -15.7 41.5 -28.9 61.5 -30.2 45.8 -65.8 75.3 -109.4 90.5 l-6.7 2.3 -1.2 21.4 c-0.6 11.7 -1.2 26 -1.2 31.8 -0.1 13.6 -3.1 31 -6.4 37.5 -3.4 6.9 -11 13.7 -18.3 16.5 -4.6 1.9 -7.9 2.4 -15.4 2.4 -8.3 0.1 -10.2 -0.3 -15.3 -2.6 l-5.7 -2.7 -1.5 2.5 c-0.8 1.3 -2.2 3.5 -3 4.8 -0.8 1.3 -2.3 5.8 -3.4 10 -1.1 4.1 -2.4 8.3 -3 9.3 -1.6 2.9 -7.4 8.1 -10.4 9.2 -4.1 1.6 -12.7 1.3 -16.2 -0.6z m13.4 -13 c1.8 -1.9 3.3 -5.1 4.5 -9.7 5.4 -21.8 15.9 -29.3 30.3 -21.6 6.5 3.5 10.3 3.7 17.8 1.1 7.2 -2.6 11.6 -6.1 14.8 -12 4.4 -7.9 4.5 -9.1 7.4 -64.8 0.3 -6.2 0.4 -11.3 0.2 -11.3 -0.2 0 -9.8 1.9 -21.4 4.1 -42.8 8.4 -64.9 9.4 -98.7 4.3 -5.7 -0.8 -11.3 -1.7 -12.4 -2 -2.5 -0.6 -2.7 0.2 -4.4 16.6 -2.1 20.6 -0.6 40.6 3.7 50.3 1.9 4.2 4 6.9 7.2 9.4 4.5 3.4 4.8 3.5 11.6 2.9 3.9 -0.3 9.1 -0.8 11.6 -1.2 4.2 -0.5 4.8 -0.3 7.2 2.5 2.7 3.3 5.3 10.9 6.8 20.5 1.2 7 2 8.8 5.5 11.5 3.5 2.8 5 2.6 8.3 -0.6z m-9.3 -127.9 c-0.3 -2.6 -1 -5.2 -1.5 -5.8 -0.4 -0.6 -2.7 -6.3 -5.1 -12.6 -2.3 -6.3 -5.1 -13.4 -6.1 -15.7 -1.1 -2.3 -1.9 -4.4 -1.9 -4.8 0 -0.3 -2 -5.1 -4.4 -10.8 -2.4 -5.6 -6.1 -15.6 -8.2 -22.2 -3.3 -10.4 -3.8 -13.3 -3.9 -21.5 0 -8.7 0.3 -10.1 3.2 -16 3.9 -7.8 7 -10.1 17.9 -13.5 7.2 -2.2 8.6 -2.4 16.4 -1.5 4.7 0.5 11.2 1.7 14.5 2.5 11.7 3.1 37.4 17.4 46.4 25.8 5.2 4.9 20.8 23.2 23.7 27.9 8 12.6 16.9 30.6 21.9 44 l1.7 4.6 3.8 -1.6 c6.6 -3 21 -11.5 28.4 -16.9 19.2 -14.1 40.8 -37.7 56.3 -61.4 6.2 -9.5 6 -9.2 13.6 -24.4 9.4 -18.6 14.3 -33.3 16.8 -50.4 1.4 -10.1 0.7 -30.2 -1.5 -37.9 -4.6 -16.6 -17.5 -32.8 -31.6 -39.5 -18.2 -8.7 -42.4 -9.9 -62.9 -3.1 -4.2 1.4 -13.7 5.7 -21.1 9.6 -52.2 27.2 -59.9 30.5 -87.2 37.2 -24.9 6.1 -43.8 8 -71.7 7.3 -29.8 -0.7 -48.4 -4.4 -83 -16.4 -27 -9.3 -30.7 -10.3 -38.6 -10.3 -23.5 0 -44 16.9 -52 43 -2.2 7.5 -3.1 26.6 -1.6 37.1 2.9 19.7 15.4 43.6 33.1 63.2 23.5 25.9 54.7 48.8 88.2 64.6 21.5 10.2 32 13.9 55.8 19.6 5 1.2 21.3 3.1 33.5 3.8 2.8 0.2 5.6 0.4 6.4 0.5 1.1 0.2 1.2 -0.8 0.7 -4.4z m39.4 -2.3 c5.2 -1 13.6 -2.7 18.5 -3.6 21.5 -4.1 43.5 -10.8 43.5 -13.2 0 -2 -9 -21.8 -13.6 -29.9 -8.7 -15.6 -15.2 -24 -27.4 -35.7 -16.8 -16.2 -32.7 -24.8 -50.6 -27.7 -6.9 -1.1 -10.3 -0.5 -17.4 3 -4.3 2.2 -8.9 10.6 -8.9 16.5 -0.1 4.2 6.6 27.8 10 35.5 1.1 2.5 4.3 10.6 7 18 2.8 7.4 6.7 17.8 8.8 23 2.1 5.2 4.2 11.3 4.6 13.4 l0.6 3.9 7.7 -0.6 c4.2 -0.3 12 -1.5 17.2 -2.6z"/>',
      '<path d="M339.5 435.4 c-10 -1 -23.7 -3.9 -31 -6.7 -25.6 -9.6 -43.5 -31.8 -52 -64.4 -2.1 -8.2 -5.3 -26.6 -5.3 -31.3 -0.6 -29.7 -0.2 -34.9 3.4 -49 7.9 -30.3 28.4 -54.8 57.8 -68.5 19.6 -9.2 35.5 -13 54.1 -12.9 30.2 0.1 55.8 10.5 75.1 30.5 11.4 11.9 18.4 24.8 23 42.4 2.7 10.5 2.9 12 2.8 31.5 -0.1 17 -0.5 22.5 -2.4 32 -5.5 28 -14.8 46.8 -31.3 63.4 -20.6 20.7 -46.4 31.4 -79.7 32.9 -5.8 0.3 -12.3 0.3 -14.5 0.1z m32 -11.3 c17.3 -3.7 17 -3.6 31.2 -10.2 16.6 -7.9 33 -24.4 42.2 -42.8 8.5 -16.7 12.8 -36.8 13.7 -63.1 1 -29 -8.8 -55.1 -26.8 -71.4 -17.3 -15.8 -35.7 -23.4 -59.4 -24.3 -21 -0.9 -37.6 2.7 -57 12.2 -23.4 11.6 -39.1 27.9 -48.1 50.2 -13.7 34.1 -7.2 93.4 13.3 121.4 11.3 15.4 25.5 23.6 50.9 29.2 1.1 0.3 8.5 0.5 16.5 0.6 10.6 0 16.9 -0.5 23.5 -1.8z"/><path d="M297.6 306.4 c-1.6 -1.6 -2 -2.7 -1.7 -5.6 0.1 -0.9 -1.2 -3.6 -2.8 -5.9 -3.8 -5.2 -3.9 -8.4 -0.5 -11.2 3.5 -2.9 6.5 -5.9 8.6 -8.5 1.6 -1.9 2.8 -2.2 9.6 -2.2 8.8 0 10.9 1.2 11.5 6.6 0.2 1.7 1.2 4.2 2.1 5.6 1.5 2.3 1.6 3.2 0.5 6.1 -1 2.9 -1 3.8 0.4 5.8 3.5 4.9 0.9 7.9 -6.7 7.9 -3 0 -7 0.7 -8.9 1.5 -4.7 1.9 -10.1 1.9 -12.1 -0.1z"/><path d="M595.9 435 c-31 -2.4 -52.6 -10.8 -69.2 -26.9 -17.3 -16.7 -25.8 -39.2 -27.3 -72.1 -2.1 -45 10.6 -82.6 35.9 -106.7 20.6 -19.6 54.5 -31.6 84.2 -29.9 13.4 0.8 25.3 3.3 36.5 7.9 15.5 6.3 25.4 13 38.6 26.1 17.4 17.4 28.2 38.2 34 65.6 2.1 10.3 2.4 35.4 0.5 44.5 -4.6 21.2 -14.3 38.9 -29.8 54.2 -8.7 8.6 -15.6 13.8 -26.9 20.3 -25.1 14.6 -46.6 19.3 -76.5 17z m35.4 -10.6 c15.8 -3.4 28.9 -9.2 43.7 -19 10.7 -7.1 14.9 -10.8 23.6 -20.9 15.9 -18.4 22.5 -36.7 22.5 -62 -0.1 -32.8 -11.8 -61.5 -34 -83.5 -20.9 -20.8 -44 -30.3 -72.6 -29.9 -14.3 0.1 -21.1 1.1 -32.5 4.5 -25.7 7.8 -44.6 22.3 -57.4 44.1 -15.7 26.8 -20.8 74.7 -11.6 108.3 7.9 28.8 28.6 48.8 57.7 55.6 19.2 4.5 46.9 5.8 60.6 2.8z"/><path d="M654.3 304.9 c-1.5 -1.7 -5.2 -4.2 -8.1 -5.5 -6.6 -3 -8.3 -6.1 -5.9 -10.7 1.2 -2.1 1.5 -4.3 1.1 -6.3 -0.9 -4.5 2.2 -7.5 7 -6.7 2.3 0.4 4.2 0 5.7 -1.1 1.3 -0.9 3.9 -1.6 5.7 -1.6 3.1 0 4.5 0.8 11 6.1 0.6 0.5 1.2 1.9 1.2 3.1 0 1.2 1.1 3.4 2.5 4.8 3.5 3.6 3.8 11.5 0.6 14.1 -1.6 1.3 -3.1 1.6 -5.2 1.2 -2.5 -0.5 -3.5 -0.1 -5.9 2.6 -3.6 3.9 -6.1 3.9 -9.7 0z"/>',
      '</g><g fill="hsl(', _pukeHue, ', 60%, 40%)"><path d="M501.5 907.7 c-2.5 -2.5 -3.5 -4.5 -4 -8.3 -0.4 -2.7 -1.4 -7.6 -2.2 -10.9 -3 -11.2 -6.2 -15.3 -10.7 -13.5 -1.5 0.5 -6.7 1 -11.5 1 -8.5 0 -9 -0.1 -13.3 -3.4 -9.3 -7.1 -12.6 -22.2 -11.5 -52.1 0.6 -14.3 1.9 -27.9 3.1 -31.2 0.4 -0.9 1.6 -0.8 4.8 0.2 5.9 1.7 23.7 4.3 37.8 5.4 11.2 0.9 27.6 0.2 42.5 -1.8 8.2 -1 46.4 -8.5 51.5 -10 1.9 -0.6 3.7 -1.1 3.9 -1.1 1 0 -2.4 66.2 -3.9 73.9 -1.3 6.9 -5.4 14.4 -9.7 17.7 -5 3.8 -13.3 6.4 -20.6 6.4 -5.2 0 -7.5 -0.6 -12.2 -3.1 -3.8 -2 -6.5 -2.9 -8 -2.5 -6.4 1.6 -12.9 11.4 -16.1 24.2 -2.3 9.2 -5.4 12.4 -11.9 12.4 -4 0 -5.2 -0.5 -8 -3.3z"/></g><g fill="#b64949"><path d="M515.5 777.4 c-0.4 -2.2 -2.5 -8.2 -4.6 -13.4 -2.1 -5.2 -6 -15.6 -8.8 -23 -2.7 -7.4 -5.9 -15.5 -7 -18 -1.1 -2.5 -3.8 -10.6 -6 -18 -3.2 -10.5 -4.1 -15.1 -4 -20.5 0.1 -21.4 17.1 -28.6 45 -19.2 14.1 4.8 24.4 11.4 37.9 24.4 12.2 11.7 18.7 20.1 27.4 35.7 5 8.7 15.6 32.6 15.6 35 0 2.7 -23.2 9.9 -45.5 14.1 -4.9 0.9 -13.3 2.6 -18.5 3.7 -5.2 1.1 -14.3 2.2 -20.2 2.5 l-10.7 0.6 -0.6 -3.9z"/></g>',
      '</svg>'
    )));
  }
}

contract OnchainPower is ERC721Enumerable, Ownable {
  using Strings for uint256;

  uint256 public cost = 0.00023 ether;

  struct ItemData { 
    string name;
    string description;
    string bgHue;
    string eyesHue;
    string pukeHue;
   }
  
  mapping (uint256 => ItemData) public itemsData;

  constructor() ERC721("Onchain Power", "POWER") {}

  function randomNum(uint256 _minNumber, uint256 _maxNumber, uint256 startAddressIndex, uint256 _salt) private view returns(uint256) {
    uint endAddressIndex = startAddressIndex + 8;
    bytes memory addressBytes = abi.encodePacked(msg.sender);
    bytes memory addressRandomnessSeed = new bytes(endAddressIndex - startAddressIndex);
    for(uint i = startAddressIndex; i < endAddressIndex; i++) {
        addressRandomnessSeed[i-startAddressIndex] = addressBytes[i];
    }
    uint256 randomNumberModule = _maxNumber - _minNumber;
    uint256 randomNumber = _minNumber + uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, addressRandomnessSeed, _salt))) % randomNumberModule;
    return randomNumber;
  }

  function mint(uint256 _mintAmount) public payable {
    require(_mintAmount > 0, "Need to mint at least 1 NFT");
    require(msg.value >= cost * _mintAmount, "Insufficient funds");
    
    uint256 supply = totalSupply();
    for (uint256 i = 1; i <= _mintAmount; i++) {
      ItemData memory newItemData = ItemData(
      string(abi.encodePacked('Onchain Power #', uint256(supply + i).toString())), 
      "Awesome onchain NFT collection that can help you test new blockchain projects.",
      randomNum(10, 350, 4, supply + i).toString(),
      randomNum(10, 350, 8, supply + i).toString(),
      randomNum(10, 350, 12, supply + i).toString());
      itemsData[supply + i] = newItemData;
      _safeMint(msg.sender, supply + i);
    }
  }

  function buildMetadata(uint256 _tokenId) private view returns(string memory) {
      ItemData memory currentItemData = itemsData[_tokenId];
      return string(abi.encodePacked(
              'data:application/json;base64,', Base64.encode(bytes(abi.encodePacked(
                          '{"name":"', 
                          currentItemData.name,
                          '", "description":"', 
                          currentItemData.description,
                          '", "image": "', 
                          'data:image/svg+xml;base64,', 
                          Base64.buildImage(currentItemData.bgHue, currentItemData.eyesHue, currentItemData.pukeHue),
                          '"}')))));
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
      require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token");
      return buildMetadata(_tokenId);
  }
 
  function withdraw() public payable onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os, "Failed to send Ether");
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint256","name":"","type":"uint256"}],"name":"itemsData","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"bgHue","type":"string"},{"internalType":"string","name":"eyesHue","type":"string"},{"internalType":"string","name":"pukeHue","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405265d12f0c4c6000600b553480156200001b57600080fd5b506040518060400160405280600d81526020016c27b731b430b4b7102837bbb2b960991b815250604051806040016040528060058152602001642827aba2a960d91b81525081600090816200007191906200019e565b5060016200008082826200019e565b5050506200009d62000097620000a360201b60201c565b620000a7565b6200026a565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200012457607f821691505b6020821081036200014557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019957600081815260208120601f850160051c81016020861015620001745750805b601f850160051c820191505b81811015620001955782815560010162000180565b5050505b505050565b81516001600160401b03811115620001ba57620001ba620000f9565b620001d281620001cb84546200010f565b846200014b565b602080601f8311600181146200020a5760008415620001f15750858301515b600019600386901b1c1916600185901b17855562000195565b600085815260208120601f198616915b828110156200023b578886015182559484019460019091019084016200021a565b50858210156200025a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615d9f806200027a6000396000f3fe6080604052600436106101405760003560e01c80636352211e116100b6578063a22cb4651161006f578063a22cb46514610352578063af65ae5214610372578063b88d4fde146103a3578063c87b56dd146103c3578063e985e9c5146103e3578063f2fde38b1461042c57600080fd5b80636352211e146102b757806370a08231146102d7578063715018a6146102f75780638da5cb5b1461030c57806395d89b411461032a578063a0712d681461033f57600080fd5b806318160ddd1161010857806318160ddd1461021a57806323b872dd1461022f5780632f745c591461024f5780633ccfd60b1461026f57806342842e0e146102775780634f6ccce71461029757600080fd5b806301ffc9a71461014557806306fdde031461017a578063081812fc1461019c578063095ea7b3146101d457806313faede6146101f6575b600080fd5b34801561015157600080fd5b50610165610160366004612283565b61044c565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610477565b60405161017191906122f7565b3480156101a857600080fd5b506101bc6101b736600461230a565b610509565b6040516001600160a01b039091168152602001610171565b3480156101e057600080fd5b506101f46101ef36600461233f565b610530565b005b34801561020257600080fd5b5061020c600b5481565b604051908152602001610171565b34801561022657600080fd5b5060085461020c565b34801561023b57600080fd5b506101f461024a366004612369565b61064a565b34801561025b57600080fd5b5061020c61026a36600461233f565b61067b565b6101f4610711565b34801561028357600080fd5b506101f4610292366004612369565b6107c7565b3480156102a357600080fd5b5061020c6102b236600461230a565b6107e2565b3480156102c357600080fd5b506101bc6102d236600461230a565b610875565b3480156102e357600080fd5b5061020c6102f23660046123a5565b6108d5565b34801561030357600080fd5b506101f461095b565b34801561031857600080fd5b50600a546001600160a01b03166101bc565b34801561033657600080fd5b5061018f61096f565b6101f461034d36600461230a565b61097e565b34801561035e57600080fd5b506101f461036d3660046123c0565b610b9e565b34801561037e57600080fd5b5061039261038d36600461230a565b610bad565b6040516101719594939291906123fc565b3480156103af57600080fd5b506101f46103be36600461247f565b610e83565b3480156103cf57600080fd5b5061018f6103de36600461230a565b610ebb565b3480156103ef57600080fd5b506101656103fe36600461255b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561043857600080fd5b506101f46104473660046123a5565b610f43565b60006001600160e01b0319821663780e9d6360e01b1480610471575061047182610fb9565b92915050565b6060600080546104869061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546104b29061258e565b80156104ff5780601f106104d4576101008083540402835291602001916104ff565b820191906000526020600020905b8154815290600101906020018083116104e257829003601f168201915b5050505050905090565b600061051482611009565b506000908152600460205260409020546001600160a01b031690565b600061053b82610875565b9050806001600160a01b0316836001600160a01b0316036105ad5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105c957506105c981336103fe565b61063b5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016105a4565b6106458383611068565b505050565b61065433826110d6565b6106705760405162461bcd60e51b81526004016105a4906125c8565b610645838383611155565b6000610686836108d5565b82106106e85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105a4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6107196112c6565b600061072d600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610777576040519150601f19603f3d011682016040523d82523d6000602084013e61077c565b606091505b50509050806107c45760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016105a4565b50565b61064583838360405180602001604052806000815250610e83565b60006107ed60085490565b82106108505760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105a4565b6008828154811061086357610863612615565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104715760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a4565b60006001600160a01b03821661093f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105a4565b506001600160a01b031660009081526003602052604090205490565b6109636112c6565b61096d6000611320565b565b6060600180546104869061258e565b600081116109ce5760405162461bcd60e51b815260206004820152601b60248201527f4e65656420746f206d696e74206174206c656173742031204e4654000000000060448201526064016105a4565b80600b546109dc9190612641565b341015610a205760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016105a4565b6000610a2b60085490565b905060015b8281116106455760006040518060a00160405280610a588486610a539190612658565b611372565b604051602001610a689190612687565b60405160208183030381529060405281526020016040518060800160405280604e8152602001615cdc604e91398152602001610ab6610a53600a61015e6004610ab1898b612658565b611405565b8152602001610ad2610a53600a61015e6008610ab1898b612658565b8152602001610aee610a53600a61015e600c610ab1898b612658565b9052905080600c6000610b018587612658565b8152602081019190915260400160002081518190610b1f908261270c565b5060208201516001820190610b34908261270c565b5060408201516002820190610b49908261270c565b5060608201516003820190610b5e908261270c565b5060808201516004820190610b73908261270c565b50610b8b9150339050610b868486612658565b611568565b5080610b96816127cc565b915050610a30565b610ba9338383611582565b5050565b600c60205260009081526040902080548190610bc89061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf49061258e565b8015610c415780601f10610c1657610100808354040283529160200191610c41565b820191906000526020600020905b815481529060010190602001808311610c2457829003601f168201915b505050505090806001018054610c569061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c829061258e565b8015610ccf5780601f10610ca457610100808354040283529160200191610ccf565b820191906000526020600020905b815481529060010190602001808311610cb257829003601f168201915b505050505090806002018054610ce49061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d109061258e565b8015610d5d5780601f10610d3257610100808354040283529160200191610d5d565b820191906000526020600020905b815481529060010190602001808311610d4057829003601f168201915b505050505090806003018054610d729061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9e9061258e565b8015610deb5780601f10610dc057610100808354040283529160200191610deb565b820191906000526020600020905b815481529060010190602001808311610dce57829003601f168201915b505050505090806004018054610e009061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2c9061258e565b8015610e795780601f10610e4e57610100808354040283529160200191610e79565b820191906000526020600020905b815481529060010190602001808311610e5c57829003601f168201915b5050505050905085565b610e8d33836110d6565b610ea95760405162461bcd60e51b81526004016105a4906125c8565b610eb584848484611650565b50505050565b6000818152600260205260409020546060906001600160a01b0316610f3a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105a4565b61047182611683565b610f4b6112c6565b6001600160a01b038116610fb05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a4565b6107c481611320565b60006001600160e01b031982166380ac58cd60e01b1480610fea57506001600160e01b03198216635b5e139f60e01b145b8061047157506301ffc9a760e01b6001600160e01b0319831614610471565b6000818152600260205260409020546001600160a01b03166107c45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a4565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061109d82610875565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806110e283610875565b9050806001600160a01b0316846001600160a01b0316148061112957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061114d5750836001600160a01b031661114284610509565b6001600160a01b0316145b949350505050565b826001600160a01b031661116882610875565b6001600160a01b03161461118e5760405162461bcd60e51b81526004016105a4906127e5565b6001600160a01b0382166111f05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105a4565b6111fd83838360016119f2565b826001600160a01b031661121082610875565b6001600160a01b0316146112365760405162461bcd60e51b81526004016105a4906127e5565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b0316331461096d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a4565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061137f83611b32565b600101905060008167ffffffffffffffff81111561139f5761139f612469565b6040519080825280601f01601f1916602001820160405280156113c9576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846113d357509392505050565b600080611413846008612658565b604080513360601b6bffffffffffffffffffffffff1916602082015281516014818303018152603490910190915290915060006114508684612840565b67ffffffffffffffff81111561146857611468612469565b6040519080825280601f01601f191660200182016040528015611492576020820181803683370190505b509050855b83811015611504578281815181106114b1576114b1612615565b01602001516001600160f81b031916826114cb8984612840565b815181106114db576114db612615565b60200101906001600160f81b031916908160001a905350806114fc816127cc565b915050611497565b5060006115118989612840565b90506000814233858a60405160200161152d9493929190612853565b6040516020818303038152906040528051906020012060001c6115509190612899565b61155a908b612658565b9a9950505050505050505050565b610ba9828260405180602001604052806000815250611c0a565b816001600160a01b0316836001600160a01b0316036115e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105a4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61165b848484611155565b61166784848484611c3d565b610eb55760405162461bcd60e51b81526004016105a4906128ad565b60606000600c60008481526020019081526020016000206040518060a00160405290816000820180546116b59061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546116e19061258e565b801561172e5780601f106117035761010080835404028352916020019161172e565b820191906000526020600020905b81548152906001019060200180831161171157829003601f168201915b505050505081526020016001820180546117479061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546117739061258e565b80156117c05780601f10611795576101008083540402835291602001916117c0565b820191906000526020600020905b8154815290600101906020018083116117a357829003601f168201915b505050505081526020016002820180546117d99061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546118059061258e565b80156118525780601f1061182757610100808354040283529160200191611852565b820191906000526020600020905b81548152906001019060200180831161183557829003601f168201915b5050505050815260200160038201805461186b9061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546118979061258e565b80156118e45780601f106118b9576101008083540402835291602001916118e4565b820191906000526020600020905b8154815290600101906020018083116118c757829003601f168201915b505050505081526020016004820180546118fd9061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546119299061258e565b80156119765780601f1061194b57610100808354040283529160200191611976565b820191906000526020600020905b81548152906001019060200180831161195957829003601f168201915b50505050508152505090506119cb816000015182602001516119a5846040015185606001518660800151611d3b565b6040516020016119b7939291906128ff565b604051602081830303815290604052611d55565b6040516020016119db91906129c6565b604051602081830303815290604052915050919050565b6119fe84848484611ebc565b6001811115611a6d5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016105a4565b816001600160a01b038516611ac957611ac481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611aec565b836001600160a01b0316856001600160a01b031614611aec57611aec8582611f44565b6001600160a01b038416611b0857611b0381611fe1565b611b2b565b846001600160a01b0316846001600160a01b031614611b2b57611b2b8482612090565b5050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611b715772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b9d576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611bbb57662386f26fc10000830492506010015b6305f5e1008310611bd3576305f5e100830492506008015b6127108310611be757612710830492506004015b60648310611bf9576064830492506002015b600a83106104715760010192915050565b611c1483836120d4565b611c216000848484611c3d565b6106455760405162461bcd60e51b81526004016105a4906128ad565b60006001600160a01b0384163b15611d3357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c81903390899088908890600401612a0b565b6020604051808303816000875af1925050508015611cbc575060408051601f3d908101601f19168201909252611cb991810190612a48565b60015b611d19573d808015611cea576040519150601f19603f3d011682016040523d82523d6000602084013e611cef565b606091505b508051600003611d115760405162461bcd60e51b81526004016105a4906128ad565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061114d565b50600161114d565b606061114d8484846040516020016119b793929190612a65565b60608151600003611d7457505060408051602081019091526000815290565b6000604051806060016040528060408152602001615d2a6040913990506000600384516002611da39190612658565b611dad9190615cb1565b611db8906004612641565b90506000611dc7826020612658565b67ffffffffffffffff811115611ddf57611ddf612469565b6040519080825280601f01601f191660200182016040528015611e09576020820181803683370190505b509050818152600183018586518101602084015b81831015611e775760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401611e1d565b600389510660018114611e915760028114611ea257611eae565b613d3d60f01b600119830152611eae565b603d60f81b6000198301525b509398975050505050505050565b6001811115610eb5576001600160a01b03841615611f02576001600160a01b03841660009081526003602052604081208054839290611efc908490612840565b90915550505b6001600160a01b03831615610eb5576001600160a01b03831660009081526003602052604081208054839290611f39908490612658565b909155505050505050565b60006001611f51846108d5565b611f5b9190612840565b600083815260076020526040902054909150808214611fae576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611ff390600190612840565b6000838152600960205260408120546008805493945090928490811061201b5761201b612615565b90600052602060002001549050806008838154811061203c5761203c612615565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061207457612074615cc5565b6001900381819060005260206000200160009055905550505050565b600061209b836108d5565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661212a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105a4565b6000818152600260205260409020546001600160a01b03161561218f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a4565b61219d6000838360016119f2565b6000818152600260205260409020546001600160a01b0316156122025760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a4565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146107c457600080fd5b60006020828403121561229557600080fd5b81356122a08161226d565b9392505050565b60005b838110156122c25781810151838201526020016122aa565b50506000910152565b600081518084526122e38160208601602086016122a7565b601f01601f19169290920160200192915050565b6020815260006122a060208301846122cb565b60006020828403121561231c57600080fd5b5035919050565b80356001600160a01b038116811461233a57600080fd5b919050565b6000806040838503121561235257600080fd5b61235b83612323565b946020939093013593505050565b60008060006060848603121561237e57600080fd5b61238784612323565b925061239560208501612323565b9150604084013590509250925092565b6000602082840312156123b757600080fd5b6122a082612323565b600080604083850312156123d357600080fd5b6123dc83612323565b9150602083013580151581146123f157600080fd5b809150509250929050565b60a08152600061240f60a08301886122cb565b828103602084015261242181886122cb565b9050828103604084015261243581876122cb565b9050828103606084015261244981866122cb565b9050828103608084015261245d81856122cb565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561249557600080fd5b61249e85612323565b93506124ac60208601612323565b925060408501359150606085013567ffffffffffffffff808211156124d057600080fd5b818701915087601f8301126124e457600080fd5b8135818111156124f6576124f6612469565b604051601f8201601f19908116603f0116810190838211818310171561251e5761251e612469565b816040528281528a602084870101111561253757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561256e57600080fd5b61257783612323565b915061258560208401612323565b90509250929050565b600181811c908216806125a257607f821691505b6020821081036125c257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176104715761047161262b565b808201808211156104715761047161262b565b6000815161267d8185602086016122a7565b9290920192915050565b6e4f6e636861696e20506f776572202360881b8152600082516126b181600f8501602087016122a7565b91909101600f0192915050565b601f82111561064557600081815260208120601f850160051c810160208610156126e55750805b601f850160051c820191505b81811015612704578281556001016126f1565b505050505050565b815167ffffffffffffffff81111561272657612726612469565b61273a81612734845461258e565b846126be565b602080601f83116001811461276f57600084156127575750858301515b600019600386901b1c1916600185901b178555612704565b600085815260208120601f198616915b8281101561279e5788860151825594840194600190910190840161277f565b50858210156127bc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000600182016127de576127de61262b565b5060010190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b818103818111156104715761047161262b565b8481526bffffffffffffffffffffffff198460601b166020820152600083516128838160348501602088016122a7565b6034920191820192909252605401949350505050565b6000826128a8576128a861282a565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b683d913730b6b2911d1160b91b815283516000906129248160098501602089016122a7565b71111610113232b9b1b934b83a34b7b7111d1160711b600991840191820152845161295681601b8401602089016122a7565b6c1116101134b6b0b3b2911d101160991b601b92909101918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602882015283516129aa8160428401602088016122a7565b61227d60f01b6042929091019182015260440195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516129fe81601d8501602087016122a7565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a3e908301846122cb565b9695505050505050565b600060208284031215612a5a57600080fd5b81516122a08161226d565b7f3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d22757481527f662d38223f3e3c7376672076657273696f6e3d22312e302220786d6c6e733d2260208201527f687474703a2f2f7777772e77332e6f72672f323030302f73766722207769647460408201527f683d2231303234707822206865696768743d223130323470782220766965774260608201527f6f783d223020302031303234203130323422207072657365727665417370656360808201527f74526174696f3d22784d6964594d6964206d656574223e00000000000000000060a08201526c078ce40ccd2d8d87a44d0e6d85609b1b60b782015260008451612b718160c48501602089016122a7565b7f2c313030252c38302529223e3c7061746820643d224d3020353132206c30202d60c4918401918201527f353132203531322030203531322030203020353132203020353132202d35313260e48201527f2030202d35313220302030202d3531327a206d3531332e37203430332e3920636101048201527f33202d312e3120382e38202d362e332031302e34202d392e3220302e36202d316101248201527f20312e39202d352e312033202d392e322031202d342e3120332e32202d392e366101448201527f20342e37202d31322e3220332e35202d3620362e32202d362e352031342e36206101648201527f2d322e372031352e3620372e312033352e33202d302e332034332e33202d31366101848201527f2e3120332e33202d362e3520362e33202d32332e3920362e34202d33372e35206101a48201527f30202d352e3820302e36202d32302e3120312e32202d33312e38206c312e32206101c48201527f2d32312e3420362e37202d322e33206334332e36202d31352e322037392e32206101e48201527f2d34342e37203130392e34202d39302e352032322e37202d33342e342033352e6102048201527f37202d37322e37203334202d313030202d312e33202d32302e38202d392e32206102248201527f2d33392e34202d32322e32202d35322e34202d31342e38202d31342e38202d336102448201527f332e36202d3232202d35372e34202d32312e39202d31312e3520302e31202d316102648201527f332e3520302e34202d32342e3520332e38202d382e3320322e35202d313720366102848201527f2e33202d32382e352031322e32202d34302e392032312e33202d34392e3120326102a48201527f352e31202d36342e382033302e32202d333120392e38202d34332e312031312e6102c48201527f35202d38302e372031312e36202d34322e362030202d35322e39202d322e31206102e48201527f2d313132202d32322e37202d32352e38202d392e31202d35322e3220312e32206103048201527f2d36392032362e37202d352e392039202d31302e362032312e34202d31322e346103248201527f2033322e35202d372e312034332e382032342e352039362e332038322e3420316103448201527f33362e372032342031362e372034392e332032392e37203738203430206c38206103648201527f322e39202d302e3120332e3920633020322e32202d302e3520382e39202d312e6103848201527f322031342e39202d302e372036202d312e322031382e35202d312e322032372e6103a48201527f3720302032352e3520322e352033352e352031312e342034342e37203720372e6103c48201527f342031302e3220382e3520323320382e31206c3131202d302e3420302e3920346103e48201527f2063302e3420322e3220312e3220362e3920312e382031302e3420312e3620316104048201527f302e3120352e312031352e362031322e342031392e3420332e3620312e3920366104248201527f2e3420322e312031302e3220302e367a206d2d3134342e36202d3438352e35206104448201527f6333372e38202d362e312036372e34202d32382e322038322e39202d36312e386104648201527f20382e35202d31382e342031322e32202d33362e392031322e33202d36312e366104848201527f20302e31202d31362e32202d302e31202d31382e33202d322e37202d32382e356104a48201527f202d342e36202d31372e36202d31312e36202d33302e35202d3233202d34322e6104c48201527f34202d31382e36202d31392e33202d34352e31202d33302e34202d37322e36206104e48201527f2d33302e34202d31322e31202d302e31202d31362e3720302e37202d333220356105048201527f2e35202d34302e312031322e35202d36362e312033382e34202d37362e3720376105248201527f362e33202d322e3720392e35202d322e38203131202d322e372033302e3520306105448201527f2e312032312e3220312e312032392e3420352e362034352e392031302e3320336105648201527f372e372033332e382036302e352036382e382036362e352031352e3920322e376105848201527f2032332e3720322e372034302e3120307a206d3236312e322030206331322e376105a48201527f202d322e342032352e32202d372e332033392e31202d31352e342031312e33206105c48201527f2d362e352031382e32202d31312e372032362e39202d32302e332032392e37206105e48201527f2d32392e332033382e33202d36362e37203235202d3130392e32202d392e32206106048201527f2d32392e33202d32392e36202d35342e36202d35362e33202d36392e37202d316106248201527f382e38202d31302e36202d3434202d31352e35202d3634202d31322e34202d316106448201527f332032202d31382e3920332e37202d33312e3320382e38202d33382e372031366106648201527f202d36312e382035302e37202d36362e38203130302e33202d312e392031392e6106848201527f33202d302e3320333720352e3120353620372e372032372e32203238203438206106a48201527f35352e352035362e382032312e3920372034362e3720382e392036362e3820356106c4820152691718bd11179f1e17b39f60b11b6106e4820152612a3e615c9f6157cc6157c66157a9614d78613fb3613f956138af6138a96138906106ee8c017f3c672066696c6c3d2223356332393239223e3c7061746820643d224d3439342e81527f35203738342e3320632d31322e32202d302e37202d32382e35202d322e36202d60208201527f33332e35202d332e38202d31352e31202d332e36202d32362e34202d37202d3360408201527f342e35202d31302e32202d33342e33202d31332e36202d36382e33202d33342e60608201527f35202d3932202d35362e35202d32342e33202d32322e35202d33362e35202d3360808201527f392e33202d34352e34202d36322e32202d352e31202d31332e32202d362e352060a08201527f2d32322e39202d352e38202d34312e3520302e37202d32302e3320342e37202d60c08201527f33312e382031352e36202d34342e382031302e34202d31322e352032332e372060e08201527f2d31382e332034312e36202d31382e332031312e3320302031322e3820302e346101008201527f2034312e362031302e332033332e322031312e352035332031352e362037392e6101208201527f392031362e342033342e3920312e312036382e31202d342e3720313032202d316101408201527f372e3720372e39202d332031392e36202d382e39203534202d32362e382032326101608201527f2e37202d31312e382033362e32202d3135203538202d31332e382031342e31206101808201527f302e382032322e3220322e3620333220372e332031342e3120362e372032362e6101a08201527f392032322e382033312e372033392e35203220372e3420322e392033332e34206101c08201527f312e332034332e39202d322e342031372e31202d372e332033312e38202d31366101e08201527f2e372035302e34202d372e362031352e32202d372e342031342e39202d31332e6102008201527f362032342e34202d31392032392e31202d34362e392035372e33202d36382e386102208201527f2036392e36202d31342e3220372e39202d31392e372031302e35202d32322e356102408201527f2031302e35202d322e382030202d332e33202d302e35202d342e39202d342e376102608201527f202d35202d31332e35202d31332e39202d33312e35202d32312e39202d34342e6102808201527f31202d322e39202d342e37202d31382e35202d3233202d32332e37202d32372e6102a08201527f39202d382e39202d382e34202d33342e36202d32322e37202d34362e34202d326102c08201527f352e38202d31302e35202d322e38202d31382e32202d33202d32352e38202d306102e08201527f2e37202d392e3820322e39202d31332e3220352e36202d31372031332e32202d6103008201527f322e3720352e34202d332e3220372e36202d332e3120313320302e3120372e366103208201527f20352032342e332031322034302e3720322e3420352e3720342e342031302e356103408201527f20342e342031302e38203020302e3420302e3820322e3520312e3920342e38206103608201527f3120322e3320332e3820392e3420362e312031352e3720322e3420362e3320346103808201527f2e372031322e3120352e332031322e3820302e3520302e3720312e3220342e366103a08201527f20312e3520382e37206c302e3520372e35202d342e34202d302e3220632d322e6103c08201527f34202d302e31202d362e36202d302e33202d392e34202d302e357a222f3e3c706103e08201527f61746820643d224d3638352e34203233302e3620632d302e33202d302e38202d6104008201527f302e34202d322e36202d302e32202d342e31206c302e33202d322e36203420346104208201527f20332e3920342e31202d332e37203020632d322e332030202d34202d302e352061044082015270169a1719901698971a3d11179f1e17b39f60791b6104608201526104710190565b6c078ce40ccd2d8d87a44d0e6d85609b1b8152600d0190565b8e61266b565b7f2c313030252c39322529223e3c7061746820643d224d3332382e35203432382e81527f3320632d32352e34202d352e36202d33392e36202d31332e38202d35302e392060208201527f2d32392e32202d31332e31202d31372e39202d32302e36202d34372e35202d3260408201527f302e36202d38312e362030202d34362e392031372e36202d37372e332035352e60608201527f34202d3936203230202d392e392033352e34202d31332035392e39202d31322e60808201527f322032362e3720302e382034342e3220372e362036322e352032342e3320313860a08201527f2e382031372032382034322e382032362e392037352e34202d302e382032322e60c08201527f35202d322e362033342e36202d372e372035302e31202d362e372032302e352060e08201527f2d31382e362033372e34202d33342e332034392e31202d392e3220362e38202d6101008201527f32322e392031332e37202d33312e372031352e38202d31362e3920342e32202d6101208201527f32322e3720342e39202d343020342e39202d392e36202d302e31202d31382e346101408201527f202d302e33202d31392e35202d302e367a206d2d32312e38202d3132342e38206101608201527f63312e39202d302e3820352e39202d312e3520382e37202d312e3520352e35206101808201527f3020382e37202d312e3220362e36202d322e35202d302e37202d302e34202d316101a08201527f202d322e37202d302e39202d352e3920302e31202d322e38202d302e33202d366101c08201527f2e31202d302e39202d372e33202d302e37202d312e32202d312e32202d332e326101e08201527f202d312e32202d342e342030202d332e39202d322e38202d352e39202d382e316102008201527f202d352e39202d332e372030202d352e3320302e35202d362e3920322e32202d6102208201527f312e3120312e32202d3220322e35202d322033203020302e34202d312e3820326102408201527f202d3420332e34202d322e3220312e35202d3420332e31202d3420332e3720306102608201527f20302e3620312e3120322e3520322e3520342e3320312e3420312e3820322e356102808201527f20342e3620322e3520362e33203020322e3520322e3120362e3120332e3620366102a08201527f2e3120302e33203020322e31202d302e3720342e31202d312e357a222f3e3c706102c08201527f61746820643d224d3538322e35203432372e3520632d32362e32202d342e32206102e08201527f2d34322e31202d31312e36202d35352e31202d32352e39202d372e33202d38206103008201527f2d31342e31202d32302e37202d31372e34202d33322e36202d392e37202d33356103208201527f202d342e35202d38362e392031312e36202d3131342e332031322e38202d32316103408201527f2e382033312e37202d33362e332035372e34202d34342e312031322e32202d336103608201527f2e362031392e36202d342e362033362e32202d342e362032302e3120302033336103808201527f2e3920332034392e322031302e372031392e3320392e372033382e372033302e6103a08201527f332034382e3320353120372e322031352e3720392e382032352e392031312e326103c08201527f2034342e3920322e342033312e34202d342e342035342e32202d32322e3320376103e08201527f342e39202d382e372031302e31202d31322e392031332e38202d32332e3620326104008201527f302e39202d31342e3820392e38202d32372e392031352e36202d34332e3720316104208201527f39202d382e392032202d33392e382032202d35312e3820302e317a206d38342e6104408201527f39202d3132382e352063322e33203020342e37202d302e3520352e34202d312e6104608201527f3220312e39202d312e3920312e34202d352e33202d312e33202d372e38202d316104808201527f2e34202d312e33202d322e35202d332e34202d322e35202d342e362030202d316104a08201527f2e33202d302e36202d322e38202d312e32202d332e33202d372e39202d362e356104c08201527f202d372e37202d362e34202d31302e32202d342e38202d312e3320302e39202d6104e08201527f342e3520312e37202d372e3220312e39206c2d342e3920302e33202d302e33206105008201527f3520632d302e3220322e37202d302e3820352e35202d312e3420362e32202d316105208201527f2e3520312e38202d302e3220332e3220352e3520352e3720322e3920312e33206105408201527f362e3320332e3620372e3620352e31206c322e3420322e3820312e39202d322e6105608201527f362063312e36202d322e3220322e38202d322e3720362e32202d322e377a222f610580820152641f1e17b39f60d91b6105a08201526105a50190565b711e33903334b6361e9111981898189818911f60711b815260120190565b7f3c7061746820643d224d3530302e35203931382e3320632d372e33202d332e3881527f202d31302e38202d392e33202d31322e34202d31392e34202d302e36202d332e60208201527f35202d312e34202d382e31202d312e38202d31302e33206c2d302e38202d332e60408201527f39202d31312e3220302e3220632d31322e3920302e32202d3136202d302e392060608201527f2d32322e39202d382e31202d392e32202d392e35202d31312e34202d31382e3960808201527f202d31312e34202d34372e372030202d31352e3720312e31202d33352e31203260a08201527f2e33202d34322e3520302e31202d302e35202d332e34202d322e33202d372e3860c08201527f202d332e39202d36392e31202d32352e31202d3132352e33202d36392e33202d60e08201527f3134392e32202d3131372e32202d31362e39202d33332e37202d31362e34202d6101008201527f37312e3220312e32202d393820392e32202d31342032302e31202d32322e34206101208201527f3336202d32382e3120332e37202d312e3320382e31202d312e382031372e35206101408201527f2d312e382031312e3520302031332e3220302e322032312e3520332e312033366101608201527f2e322031322e382035362e342031382e362037342e352032312e3520352e36206101808201527f302e382031372e3520312e332033342e3520312e332033342e33202d302e31206101a08201527f34372e34202d322037372e37202d31312e362031352e37202d352e312032332e6101c08201527f39202d382e392036342e38202d33302e322031312e34202d352e392032302e326101e08201527f202d392e372032382e35202d31322e332031312e34202d332e352031322e37206102008201527f2d332e37203237202d332e382031362e31202d302e312032342e3820312e33206102208201527f33362e3520352e392033392e362031352e352035362e342036312e322034312e6102408201527f3520313133202d362032302e37202d31352e372034312e35202d32382e3920366102608201527f312e35202d33302e322034352e38202d36352e382037352e33202d3130392e346102808201527f2039302e35206c2d362e3720322e33202d312e322032312e3420632d302e36206102a08201527f31312e37202d312e32203236202d312e322033312e38202d302e312031332e366102c08201527f202d332e31203331202d362e342033372e35202d332e3420362e39202d3131206102e08201527f31332e37202d31382e332031362e35202d342e3620312e39202d372e3920322e6103008201527f34202d31352e3420322e34202d382e3320302e31202d31302e32202d302e33206103208201527f2d31352e33202d322e36206c2d352e37202d322e37202d312e3520322e3520636103408201527f2d302e3820312e33202d322e3220332e35202d3320342e38202d302e3820312e6103608201527f33202d322e3320352e38202d332e34203130202d312e3120342e31202d322e346103808201527f20382e33202d3320392e33202d312e3620322e39202d372e3420382e31202d316103a08201527f302e3420392e32202d342e3120312e36202d31322e3720312e33202d31362e326103c08201527f202d302e367a206d31332e34202d31332063312e38202d312e3920332e33202d6103e08201527f352e3120342e35202d392e3720352e34202d32312e382031352e39202d32392e6104008201527f332033302e33202d32312e3620362e3520332e352031302e3320332e372031376104208201527f2e3820312e3120372e32202d322e362031312e36202d362e312031342e38202d6104408201527f313220342e34202d372e3920342e35202d392e3120372e34202d36342e3820306104608201527f2e33202d362e3220302e34202d31312e3320302e32202d31312e33202d302e326104808201527f2030202d392e3820312e39202d32312e3420342e31202d34322e3820382e34206104a08201527f2d36342e3920392e34202d39382e3720342e33202d352e37202d302e38202d316104c08201527f312e33202d312e37202d31322e34202d32202d322e35202d302e36202d322e376104e08201527f20302e32202d342e342031362e36202d322e312032302e36202d302e362034306105008201527f2e3620332e372035302e3320312e3920342e32203420362e3920372e3220392e6105208201527f3420342e3520332e3420342e3820332e352031312e3620322e3920332e39202d6105408201527f302e3320392e31202d302e382031312e36202d312e3220342e32202d302e35206105608201527f342e38202d302e3320372e3220322e3520322e3720332e3320352e332031302e6105808201527f3920362e382032302e3520312e322037203220382e3820352e352031312e35206105a08201527f332e3520322e38203520322e3620382e33202d302e367a206d2d392e33202d316105c08201527f32372e3920632d302e33202d322e36202d31202d352e32202d312e35202d352e6105e08201527f38202d302e34202d302e36202d322e37202d362e33202d352e31202d31322e366106008201527f202d322e33202d362e33202d352e31202d31332e34202d362e31202d31352e376106208201527f202d312e31202d322e33202d312e39202d342e34202d312e39202d342e3820306106408201527f202d302e33202d32202d352e31202d342e34202d31302e38202d322e34202d356106608201527f2e36202d362e31202d31352e36202d382e32202d32322e32202d332e33202d316106808201527f302e34202d332e38202d31332e33202d332e39202d32312e352030202d382e376106a08201527f20302e33202d31302e3120332e32202d313620332e39202d372e382037202d316106c08201527f302e312031372e39202d31332e3520372e32202d322e3220382e36202d322e346106e08201527f2031362e34202d312e3520342e3720302e352031312e3220312e372031342e356107008201527f20322e352031312e3720332e312033372e342031372e342034362e342032352e6107208201527f3820352e3220342e392032302e382032332e322032332e372032372e392038206107408201527f31322e362031362e392033302e362032312e39203434206c312e3720342e36206107608201527f332e38202d312e362063362e36202d33203231202d31312e352032382e34202d6107808201527f31362e392031392e32202d31342e312034302e38202d33372e372035362e33206107a08201527f2d36312e3420362e32202d392e352036202d392e322031332e36202d32342e346107c08201527f20392e34202d31382e362031342e33202d33332e332031362e38202d35302e346107e08201527f20312e34202d31302e3120302e37202d33302e32202d312e35202d33372e39206108008201527f2d342e36202d31362e36202d31372e35202d33322e38202d33312e36202d33396108208201527f2e35202d31382e32202d382e37202d34322e34202d392e39202d36322e39202d6108408201527f332e31202d342e3220312e34202d31332e3720352e37202d32312e3120392e366108608201527f202d35322e322032372e32202d35392e392033302e35202d38372e322033372e6108808201527f32202d32342e3920362e31202d34332e382038202d37312e3720372e33202d326108a08201527f392e38202d302e37202d34382e34202d342e34202d3833202d31362e34202d326108c08201527f37202d392e33202d33302e37202d31302e33202d33382e36202d31302e33202d6108e08201527f32332e352030202d34342031362e39202d3532203433202d322e3220372e35206109008201527f2d332e312032362e36202d312e362033372e3120322e392031392e372031352e6109208201527f342034332e362033332e312036332e322032332e352032352e392035342e37206109408201527f34382e382038382e322036342e362032312e352031302e322033322031332e396109608201527f2035352e382031392e36203520312e322032312e3320332e312033332e3520336109808201527f2e3820322e3820302e3220352e3620302e3420362e3420302e3520312e3120306109a08201527f2e3220312e32202d302e3820302e37202d342e347a206d33392e34202d322e336109c08201527f2063352e32202d312031332e36202d322e372031382e35202d332e362032312e6109e08201527f35202d342e312034332e35202d31302e382034332e35202d31332e322030202d610a008201527f32202d39202d32312e38202d31332e36202d32392e39202d382e37202d31352e610a208201527f36202d31352e32202d3234202d32372e34202d33352e37202d31362e38202d31610a408201527f362e32202d33322e37202d32342e38202d35302e36202d32372e37202d362e39610a608201527f202d312e31202d31302e33202d302e35202d31372e342033202d342e3320322e610a808201527f32202d382e392031302e36202d382e392031362e35202d302e3120342e322036610aa08201527f2e362032372e382031302033352e3520312e3120322e3520342e332031302e36610ac08201527f203720313820322e3820372e3420362e372031372e3820382e3820323320322e610ae08201527f3120352e3220342e322031312e3320342e362031332e34206c302e3620332e39610b008201527f20372e37202d302e362063342e32202d302e33203132202d312e352031372e32610b2082015268101699171b3d11179f60b91b610b40820152610b490190565b7f3c7061746820643d224d3333392e35203433352e3420632d3130202d31202d3281527f332e37202d332e39202d3331202d362e37202d32352e36202d392e36202d343360208201527f2e35202d33312e38202d3532202d36342e34202d322e31202d382e32202d352e60408201527f33202d32362e36202d352e33202d33312e33202d302e36202d32392e37202d3060608201527f2e32202d33342e3920332e34202d343920372e39202d33302e332032382e342060808201527f2d35342e382035372e38202d36382e352031392e36202d392e322033352e352060a08201527f2d31332035342e31202d31322e392033302e3220302e312035352e382031302e60c08201527f352037352e312033302e352031312e342031312e392031382e342032342e382060e08201527f32332034322e3420322e372031302e3520322e3920313220322e382033312e356101008201527f202d302e31203137202d302e352032322e35202d322e34203332202d352e35206101208201527f3238202d31342e382034362e38202d33312e332036332e34202d32302e3620326101408201527f302e37202d34362e342033312e34202d37392e372033322e39202d352e3820306101608201527f2e33202d31322e3320302e33202d31342e3520302e317a206d3332202d31312e6101808201527f33206331372e33202d332e37203137202d332e362033312e32202d31302e32206101a08201527f31362e36202d372e39203333202d32342e342034322e32202d34322e3820382e6101c08201527f35202d31362e372031322e38202d33362e382031332e37202d36332e312031206101e08201527f2d3239202d382e38202d35352e31202d32362e38202d37312e34202d31372e336102008201527f202d31352e38202d33352e37202d32332e34202d35392e34202d32342e33202d6102208201527f3231202d302e39202d33372e3620322e37202d35372031322e32202d32332e346102408201527f2031312e36202d33392e312032372e39202d34382e312035302e32202d31332e6102608201527f372033342e31202d372e322039332e342031332e33203132312e342031312e336102808201527f2031352e342032352e352032332e362035302e392032392e3220312e3120302e6102a08201527f3320382e3520302e352031362e3520302e362031302e3620302031362e39202d6102c08201527f302e352032332e35202d312e387a222f3e3c7061746820643d224d3239372e366102e08201527f203330362e3420632d312e36202d312e36202d32202d322e37202d312e37202d6103008201527f352e3620302e31202d302e39202d312e32202d332e36202d322e38202d352e396103208201527f202d332e38202d352e32202d332e39202d382e34202d302e35202d31312e32206103408201527f332e35202d322e3920362e35202d352e3920382e36202d382e3520312e36202d6103608201527f312e3920322e38202d322e3220392e36202d322e3220382e3820302031302e396103808201527f20312e322031312e3520362e3620302e3220312e3720312e3220342e3220322e6103a08201527f3120352e3620312e3520322e3320312e3620332e3220302e3520362e31202d316103c08201527f20322e39202d3120332e3820302e3420352e3820332e3520342e3920302e39206103e08201527f372e39202d362e3720372e39202d332030202d3720302e37202d382e3920312e6104008201527f35202d342e3720312e39202d31302e3120312e39202d31322e31202d302e317a6104208201527f222f3e3c7061746820643d224d3539352e392034333520632d3331202d322e346104408201527f202d35322e36202d31302e38202d36392e32202d32362e39202d31372e33202d6104608201527f31362e37202d32352e38202d33392e32202d32372e33202d37322e31202d322e6104808201527f31202d34352031302e36202d38322e362033352e39202d3130362e372032302e6104a08201527f36202d31392e362035342e35202d33312e362038342e32202d32392e392031336104c08201527f2e3420302e382032352e3320332e332033362e3520372e392031352e3520362e6104e08201527f332032352e342031332033382e362032362e312031372e342031372e342032386105008201527f2e322033382e322033342036352e3620322e312031302e3320322e342033352e6105208201527f3420302e352034342e35202d342e362032312e32202d31342e332033382e39206105408201527f2d32392e382035342e32202d382e3720382e36202d31352e362031332e38202d6105608201527f32362e392032302e33202d32352e312031342e36202d34362e362031392e33206105808201527f2d37362e352031377a206d33352e34202d31302e36206331352e38202d332e346105a08201527f2032382e39202d392e322034332e37202d31392031302e37202d372e312031346105c08201527f2e39202d31302e382032332e36202d32302e392031352e39202d31382e3420326105e08201527f322e35202d33362e372032322e35202d3632202d302e31202d33322e38202d316106008201527f312e38202d36312e35202d3334202d38332e35202d32302e39202d32302e38206106208201527f2d3434202d33302e33202d37322e36202d32392e39202d31342e3320302e31206106408201527f2d32312e3120312e31202d33322e3520342e35202d32352e3720372e38202d346106608201527f342e362032322e33202d35372e342034342e31202d31352e372032362e38202d6106808201527f32302e382037342e37202d31312e36203130382e3320372e392032382e3820326106a08201527f382e362034382e382035372e372035352e362031392e3220342e352034362e396106c08201527f20352e382036302e3620322e387a222f3e3c7061746820643d224d3635342e336106e08201527f203330342e3920632d312e35202d312e37202d352e32202d342e32202d382e316107008201527f202d352e35202d362e36202d33202d382e33202d362e31202d352e39202d31306107208201527f2e3720312e32202d322e3120312e35202d342e3320312e31202d362e33202d306107408201527f2e39202d342e3520322e32202d372e352037202d362e3720322e3320302e34206107608201527f342e32203020352e37202d312e3120312e33202d302e3920332e39202d312e366107808201527f20352e37202d312e3620332e31203020342e3520302e3820313120362e3120306107a08201527f2e3620302e3520312e3220312e3920312e3220332e31203020312e3220312e316107c08201527f20332e3420322e3520342e3820332e3520332e3620332e382031312e3520302e6107e08201527f362031342e31202d312e3620312e33202d332e3120312e36202d352e3220312e6108008201527f32202d322e35202d302e35202d332e35202d302e31202d352e3920322e36202d6108208201527f332e3620332e39202d362e3120332e39202d392e3720307a222f3e000000000061084082015261085b0190565b700785ece7c78ce40ccd2d8d87a44d0e6d85607b1b815260110190565b8761266b565b7f2c203630252c2034302529223e3c7061746820643d224d3530312e352039303781527f2e3720632d322e35202d322e35202d332e35202d342e35202d34202d382e332060208201527f2d302e34202d322e37202d312e34202d372e36202d322e32202d31302e39202d60408201527f33202d31312e32202d362e32202d31352e33202d31302e37202d31332e35202d60608201527f312e3520302e35202d362e372031202d31312e352031202d382e352030202d3960808201527f202d302e31202d31332e33202d332e34202d392e33202d372e31202d31322e3660a08201527f202d32322e32202d31312e35202d35322e3120302e36202d31342e3320312e3960c08201527f202d32372e3920332e31202d33312e3220302e34202d302e3920312e36202d3060e08201527f2e3820342e3820302e3220352e3920312e372032332e3720342e332033372e386101008201527f20352e342031312e3220302e392032372e3620302e322034322e35202d312e386101208201527f20382e32202d312034362e34202d382e352035312e35202d313020312e39202d6101408201527f302e3620332e37202d312e3120332e39202d312e3120312030202d322e3420366101608201527f362e32202d332e392037332e39202d312e3320362e39202d352e342031342e346101808201527f202d392e372031372e37202d3520332e38202d31332e3320362e34202d32302e6101a08201527f3620362e34202d352e322030202d372e35202d302e36202d31322e32202d332e6101c08201527f31202d332e38202d32202d362e35202d322e39202d38202d322e35202d362e346101e08201527f20312e36202d31322e392031312e34202d31362e312032342e32202d322e33206102008201527f392e32202d352e342031322e34202d31312e392031322e34202d342030202d356102208201527f2e32202d302e35202d38202d332e337a222f3e3c2f673e3c672066696c6c3d226102408201527f23623634393439223e3c7061746820643d224d3531352e35203737372e3420636102608201527f2d302e34202d322e32202d322e35202d382e32202d342e36202d31332e34202d6102808201527f322e31202d352e32202d36202d31352e36202d382e38202d3233202d322e37206102a08201527f2d372e34202d352e39202d31352e35202d37202d3138202d312e31202d322e356102c08201527f202d332e38202d31302e36202d36202d3138202d332e32202d31302e35202d346102e08201527f2e31202d31352e31202d34202d32302e3520302e31202d32312e342031372e316103008201527f202d32382e36203435202d31392e322031342e3120342e382032342e342031316103208201527f2e342033372e392032342e342031322e322031312e372031382e372032302e316103408201527f2032372e342033352e37203520382e372031352e362033322e362031352e36206103608201527f3335203020322e37202d32332e3220392e39202d34352e352031342e31202d346103808201527f2e3920302e39202d31332e3320322e36202d31382e3520332e37202d352e32206103a08201527f312e31202d31342e3320322e32202d32302e3220322e35206c2d31302e3720306103c082015273171b101698171b101699971cbd11179f1e17b39f60611b6103e08201526103f40190565b651e17b9bb339f60d11b815260060190565b600082615cc057615cc061282a565b500490565b634e487b7160e01b600052603160045260246000fdfe417765736f6d65206f6e636861696e204e465420636f6c6c656374696f6e20746861742063616e2068656c7020796f752074657374206e657720626c6f636b636861696e2070726f6a656374732e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202267571787e8c73abcebf8cd34c3bb5dc1ea1d78d50f90a33e6425cd959a0e5f64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101405760003560e01c80636352211e116100b6578063a22cb4651161006f578063a22cb46514610352578063af65ae5214610372578063b88d4fde146103a3578063c87b56dd146103c3578063e985e9c5146103e3578063f2fde38b1461042c57600080fd5b80636352211e146102b757806370a08231146102d7578063715018a6146102f75780638da5cb5b1461030c57806395d89b411461032a578063a0712d681461033f57600080fd5b806318160ddd1161010857806318160ddd1461021a57806323b872dd1461022f5780632f745c591461024f5780633ccfd60b1461026f57806342842e0e146102775780634f6ccce71461029757600080fd5b806301ffc9a71461014557806306fdde031461017a578063081812fc1461019c578063095ea7b3146101d457806313faede6146101f6575b600080fd5b34801561015157600080fd5b50610165610160366004612283565b61044c565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610477565b60405161017191906122f7565b3480156101a857600080fd5b506101bc6101b736600461230a565b610509565b6040516001600160a01b039091168152602001610171565b3480156101e057600080fd5b506101f46101ef36600461233f565b610530565b005b34801561020257600080fd5b5061020c600b5481565b604051908152602001610171565b34801561022657600080fd5b5060085461020c565b34801561023b57600080fd5b506101f461024a366004612369565b61064a565b34801561025b57600080fd5b5061020c61026a36600461233f565b61067b565b6101f4610711565b34801561028357600080fd5b506101f4610292366004612369565b6107c7565b3480156102a357600080fd5b5061020c6102b236600461230a565b6107e2565b3480156102c357600080fd5b506101bc6102d236600461230a565b610875565b3480156102e357600080fd5b5061020c6102f23660046123a5565b6108d5565b34801561030357600080fd5b506101f461095b565b34801561031857600080fd5b50600a546001600160a01b03166101bc565b34801561033657600080fd5b5061018f61096f565b6101f461034d36600461230a565b61097e565b34801561035e57600080fd5b506101f461036d3660046123c0565b610b9e565b34801561037e57600080fd5b5061039261038d36600461230a565b610bad565b6040516101719594939291906123fc565b3480156103af57600080fd5b506101f46103be36600461247f565b610e83565b3480156103cf57600080fd5b5061018f6103de36600461230a565b610ebb565b3480156103ef57600080fd5b506101656103fe36600461255b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561043857600080fd5b506101f46104473660046123a5565b610f43565b60006001600160e01b0319821663780e9d6360e01b1480610471575061047182610fb9565b92915050565b6060600080546104869061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546104b29061258e565b80156104ff5780601f106104d4576101008083540402835291602001916104ff565b820191906000526020600020905b8154815290600101906020018083116104e257829003601f168201915b5050505050905090565b600061051482611009565b506000908152600460205260409020546001600160a01b031690565b600061053b82610875565b9050806001600160a01b0316836001600160a01b0316036105ad5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105c957506105c981336103fe565b61063b5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016105a4565b6106458383611068565b505050565b61065433826110d6565b6106705760405162461bcd60e51b81526004016105a4906125c8565b610645838383611155565b6000610686836108d5565b82106106e85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105a4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6107196112c6565b600061072d600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610777576040519150601f19603f3d011682016040523d82523d6000602084013e61077c565b606091505b50509050806107c45760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016105a4565b50565b61064583838360405180602001604052806000815250610e83565b60006107ed60085490565b82106108505760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105a4565b6008828154811061086357610863612615565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104715760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a4565b60006001600160a01b03821661093f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105a4565b506001600160a01b031660009081526003602052604090205490565b6109636112c6565b61096d6000611320565b565b6060600180546104869061258e565b600081116109ce5760405162461bcd60e51b815260206004820152601b60248201527f4e65656420746f206d696e74206174206c656173742031204e4654000000000060448201526064016105a4565b80600b546109dc9190612641565b341015610a205760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016105a4565b6000610a2b60085490565b905060015b8281116106455760006040518060a00160405280610a588486610a539190612658565b611372565b604051602001610a689190612687565b60405160208183030381529060405281526020016040518060800160405280604e8152602001615cdc604e91398152602001610ab6610a53600a61015e6004610ab1898b612658565b611405565b8152602001610ad2610a53600a61015e6008610ab1898b612658565b8152602001610aee610a53600a61015e600c610ab1898b612658565b9052905080600c6000610b018587612658565b8152602081019190915260400160002081518190610b1f908261270c565b5060208201516001820190610b34908261270c565b5060408201516002820190610b49908261270c565b5060608201516003820190610b5e908261270c565b5060808201516004820190610b73908261270c565b50610b8b9150339050610b868486612658565b611568565b5080610b96816127cc565b915050610a30565b610ba9338383611582565b5050565b600c60205260009081526040902080548190610bc89061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf49061258e565b8015610c415780601f10610c1657610100808354040283529160200191610c41565b820191906000526020600020905b815481529060010190602001808311610c2457829003601f168201915b505050505090806001018054610c569061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c829061258e565b8015610ccf5780601f10610ca457610100808354040283529160200191610ccf565b820191906000526020600020905b815481529060010190602001808311610cb257829003601f168201915b505050505090806002018054610ce49061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d109061258e565b8015610d5d5780601f10610d3257610100808354040283529160200191610d5d565b820191906000526020600020905b815481529060010190602001808311610d4057829003601f168201915b505050505090806003018054610d729061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9e9061258e565b8015610deb5780601f10610dc057610100808354040283529160200191610deb565b820191906000526020600020905b815481529060010190602001808311610dce57829003601f168201915b505050505090806004018054610e009061258e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2c9061258e565b8015610e795780601f10610e4e57610100808354040283529160200191610e79565b820191906000526020600020905b815481529060010190602001808311610e5c57829003601f168201915b5050505050905085565b610e8d33836110d6565b610ea95760405162461bcd60e51b81526004016105a4906125c8565b610eb584848484611650565b50505050565b6000818152600260205260409020546060906001600160a01b0316610f3a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105a4565b61047182611683565b610f4b6112c6565b6001600160a01b038116610fb05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a4565b6107c481611320565b60006001600160e01b031982166380ac58cd60e01b1480610fea57506001600160e01b03198216635b5e139f60e01b145b8061047157506301ffc9a760e01b6001600160e01b0319831614610471565b6000818152600260205260409020546001600160a01b03166107c45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a4565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061109d82610875565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806110e283610875565b9050806001600160a01b0316846001600160a01b0316148061112957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061114d5750836001600160a01b031661114284610509565b6001600160a01b0316145b949350505050565b826001600160a01b031661116882610875565b6001600160a01b03161461118e5760405162461bcd60e51b81526004016105a4906127e5565b6001600160a01b0382166111f05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105a4565b6111fd83838360016119f2565b826001600160a01b031661121082610875565b6001600160a01b0316146112365760405162461bcd60e51b81526004016105a4906127e5565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b0316331461096d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a4565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061137f83611b32565b600101905060008167ffffffffffffffff81111561139f5761139f612469565b6040519080825280601f01601f1916602001820160405280156113c9576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846113d357509392505050565b600080611413846008612658565b604080513360601b6bffffffffffffffffffffffff1916602082015281516014818303018152603490910190915290915060006114508684612840565b67ffffffffffffffff81111561146857611468612469565b6040519080825280601f01601f191660200182016040528015611492576020820181803683370190505b509050855b83811015611504578281815181106114b1576114b1612615565b01602001516001600160f81b031916826114cb8984612840565b815181106114db576114db612615565b60200101906001600160f81b031916908160001a905350806114fc816127cc565b915050611497565b5060006115118989612840565b90506000814233858a60405160200161152d9493929190612853565b6040516020818303038152906040528051906020012060001c6115509190612899565b61155a908b612658565b9a9950505050505050505050565b610ba9828260405180602001604052806000815250611c0a565b816001600160a01b0316836001600160a01b0316036115e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105a4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61165b848484611155565b61166784848484611c3d565b610eb55760405162461bcd60e51b81526004016105a4906128ad565b60606000600c60008481526020019081526020016000206040518060a00160405290816000820180546116b59061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546116e19061258e565b801561172e5780601f106117035761010080835404028352916020019161172e565b820191906000526020600020905b81548152906001019060200180831161171157829003601f168201915b505050505081526020016001820180546117479061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546117739061258e565b80156117c05780601f10611795576101008083540402835291602001916117c0565b820191906000526020600020905b8154815290600101906020018083116117a357829003601f168201915b505050505081526020016002820180546117d99061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546118059061258e565b80156118525780601f1061182757610100808354040283529160200191611852565b820191906000526020600020905b81548152906001019060200180831161183557829003601f168201915b5050505050815260200160038201805461186b9061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546118979061258e565b80156118e45780601f106118b9576101008083540402835291602001916118e4565b820191906000526020600020905b8154815290600101906020018083116118c757829003601f168201915b505050505081526020016004820180546118fd9061258e565b80601f01602080910402602001604051908101604052809291908181526020018280546119299061258e565b80156119765780601f1061194b57610100808354040283529160200191611976565b820191906000526020600020905b81548152906001019060200180831161195957829003601f168201915b50505050508152505090506119cb816000015182602001516119a5846040015185606001518660800151611d3b565b6040516020016119b7939291906128ff565b604051602081830303815290604052611d55565b6040516020016119db91906129c6565b604051602081830303815290604052915050919050565b6119fe84848484611ebc565b6001811115611a6d5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016105a4565b816001600160a01b038516611ac957611ac481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611aec565b836001600160a01b0316856001600160a01b031614611aec57611aec8582611f44565b6001600160a01b038416611b0857611b0381611fe1565b611b2b565b846001600160a01b0316846001600160a01b031614611b2b57611b2b8482612090565b5050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611b715772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b9d576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611bbb57662386f26fc10000830492506010015b6305f5e1008310611bd3576305f5e100830492506008015b6127108310611be757612710830492506004015b60648310611bf9576064830492506002015b600a83106104715760010192915050565b611c1483836120d4565b611c216000848484611c3d565b6106455760405162461bcd60e51b81526004016105a4906128ad565b60006001600160a01b0384163b15611d3357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c81903390899088908890600401612a0b565b6020604051808303816000875af1925050508015611cbc575060408051601f3d908101601f19168201909252611cb991810190612a48565b60015b611d19573d808015611cea576040519150601f19603f3d011682016040523d82523d6000602084013e611cef565b606091505b508051600003611d115760405162461bcd60e51b81526004016105a4906128ad565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061114d565b50600161114d565b606061114d8484846040516020016119b793929190612a65565b60608151600003611d7457505060408051602081019091526000815290565b6000604051806060016040528060408152602001615d2a6040913990506000600384516002611da39190612658565b611dad9190615cb1565b611db8906004612641565b90506000611dc7826020612658565b67ffffffffffffffff811115611ddf57611ddf612469565b6040519080825280601f01601f191660200182016040528015611e09576020820181803683370190505b509050818152600183018586518101602084015b81831015611e775760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401611e1d565b600389510660018114611e915760028114611ea257611eae565b613d3d60f01b600119830152611eae565b603d60f81b6000198301525b509398975050505050505050565b6001811115610eb5576001600160a01b03841615611f02576001600160a01b03841660009081526003602052604081208054839290611efc908490612840565b90915550505b6001600160a01b03831615610eb5576001600160a01b03831660009081526003602052604081208054839290611f39908490612658565b909155505050505050565b60006001611f51846108d5565b611f5b9190612840565b600083815260076020526040902054909150808214611fae576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611ff390600190612840565b6000838152600960205260408120546008805493945090928490811061201b5761201b612615565b90600052602060002001549050806008838154811061203c5761203c612615565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061207457612074615cc5565b6001900381819060005260206000200160009055905550505050565b600061209b836108d5565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661212a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105a4565b6000818152600260205260409020546001600160a01b03161561218f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a4565b61219d6000838360016119f2565b6000818152600260205260409020546001600160a01b0316156122025760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a4565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146107c457600080fd5b60006020828403121561229557600080fd5b81356122a08161226d565b9392505050565b60005b838110156122c25781810151838201526020016122aa565b50506000910152565b600081518084526122e38160208601602086016122a7565b601f01601f19169290920160200192915050565b6020815260006122a060208301846122cb565b60006020828403121561231c57600080fd5b5035919050565b80356001600160a01b038116811461233a57600080fd5b919050565b6000806040838503121561235257600080fd5b61235b83612323565b946020939093013593505050565b60008060006060848603121561237e57600080fd5b61238784612323565b925061239560208501612323565b9150604084013590509250925092565b6000602082840312156123b757600080fd5b6122a082612323565b600080604083850312156123d357600080fd5b6123dc83612323565b9150602083013580151581146123f157600080fd5b809150509250929050565b60a08152600061240f60a08301886122cb565b828103602084015261242181886122cb565b9050828103604084015261243581876122cb565b9050828103606084015261244981866122cb565b9050828103608084015261245d81856122cb565b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561249557600080fd5b61249e85612323565b93506124ac60208601612323565b925060408501359150606085013567ffffffffffffffff808211156124d057600080fd5b818701915087601f8301126124e457600080fd5b8135818111156124f6576124f6612469565b604051601f8201601f19908116603f0116810190838211818310171561251e5761251e612469565b816040528281528a602084870101111561253757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561256e57600080fd5b61257783612323565b915061258560208401612323565b90509250929050565b600181811c908216806125a257607f821691505b6020821081036125c257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176104715761047161262b565b808201808211156104715761047161262b565b6000815161267d8185602086016122a7565b9290920192915050565b6e4f6e636861696e20506f776572202360881b8152600082516126b181600f8501602087016122a7565b91909101600f0192915050565b601f82111561064557600081815260208120601f850160051c810160208610156126e55750805b601f850160051c820191505b81811015612704578281556001016126f1565b505050505050565b815167ffffffffffffffff81111561272657612726612469565b61273a81612734845461258e565b846126be565b602080601f83116001811461276f57600084156127575750858301515b600019600386901b1c1916600185901b178555612704565b600085815260208120601f198616915b8281101561279e5788860151825594840194600190910190840161277f565b50858210156127bc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000600182016127de576127de61262b565b5060010190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b818103818111156104715761047161262b565b8481526bffffffffffffffffffffffff198460601b166020820152600083516128838160348501602088016122a7565b6034920191820192909252605401949350505050565b6000826128a8576128a861282a565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b683d913730b6b2911d1160b91b815283516000906129248160098501602089016122a7565b71111610113232b9b1b934b83a34b7b7111d1160711b600991840191820152845161295681601b8401602089016122a7565b6c1116101134b6b0b3b2911d101160991b601b92909101918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602882015283516129aa8160428401602088016122a7565b61227d60f01b6042929091019182015260440195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516129fe81601d8501602087016122a7565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a3e908301846122cb565b9695505050505050565b600060208284031215612a5a57600080fd5b81516122a08161226d565b7f3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d22757481527f662d38223f3e3c7376672076657273696f6e3d22312e302220786d6c6e733d2260208201527f687474703a2f2f7777772e77332e6f72672f323030302f73766722207769647460408201527f683d2231303234707822206865696768743d223130323470782220766965774260608201527f6f783d223020302031303234203130323422207072657365727665417370656360808201527f74526174696f3d22784d6964594d6964206d656574223e00000000000000000060a08201526c078ce40ccd2d8d87a44d0e6d85609b1b60b782015260008451612b718160c48501602089016122a7565b7f2c313030252c38302529223e3c7061746820643d224d3020353132206c30202d60c4918401918201527f353132203531322030203531322030203020353132203020353132202d35313260e48201527f2030202d35313220302030202d3531327a206d3531332e37203430332e3920636101048201527f33202d312e3120382e38202d362e332031302e34202d392e3220302e36202d316101248201527f20312e39202d352e312033202d392e322031202d342e3120332e32202d392e366101448201527f20342e37202d31322e3220332e35202d3620362e32202d362e352031342e36206101648201527f2d322e372031352e3620372e312033352e33202d302e332034332e33202d31366101848201527f2e3120332e33202d362e3520362e33202d32332e3920362e34202d33372e35206101a48201527f30202d352e3820302e36202d32302e3120312e32202d33312e38206c312e32206101c48201527f2d32312e3420362e37202d322e33206334332e36202d31352e322037392e32206101e48201527f2d34342e37203130392e34202d39302e352032322e37202d33342e342033352e6102048201527f37202d37322e37203334202d313030202d312e33202d32302e38202d392e32206102248201527f2d33392e34202d32322e32202d35322e34202d31342e38202d31342e38202d336102448201527f332e36202d3232202d35372e34202d32312e39202d31312e3520302e31202d316102648201527f332e3520302e34202d32342e3520332e38202d382e3320322e35202d313720366102848201527f2e33202d32382e352031322e32202d34302e392032312e33202d34392e3120326102a48201527f352e31202d36342e382033302e32202d333120392e38202d34332e312031312e6102c48201527f35202d38302e372031312e36202d34322e362030202d35322e39202d322e31206102e48201527f2d313132202d32322e37202d32352e38202d392e31202d35322e3220312e32206103048201527f2d36392032362e37202d352e392039202d31302e362032312e34202d31322e346103248201527f2033322e35202d372e312034332e382032342e352039362e332038322e3420316103448201527f33362e372032342031362e372034392e332032392e37203738203430206c38206103648201527f322e39202d302e3120332e3920633020322e32202d302e3520382e39202d312e6103848201527f322031342e39202d302e372036202d312e322031382e35202d312e322032372e6103a48201527f3720302032352e3520322e352033352e352031312e342034342e37203720372e6103c48201527f342031302e3220382e3520323320382e31206c3131202d302e3420302e3920346103e48201527f2063302e3420322e3220312e3220362e3920312e382031302e3420312e3620316104048201527f302e3120352e312031352e362031322e342031392e3420332e3620312e3920366104248201527f2e3420322e312031302e3220302e367a206d2d3134342e36202d3438352e35206104448201527f6333372e38202d362e312036372e34202d32382e322038322e39202d36312e386104648201527f20382e35202d31382e342031322e32202d33362e392031322e33202d36312e366104848201527f20302e31202d31362e32202d302e31202d31382e33202d322e37202d32382e356104a48201527f202d342e36202d31372e36202d31312e36202d33302e35202d3233202d34322e6104c48201527f34202d31382e36202d31392e33202d34352e31202d33302e34202d37322e36206104e48201527f2d33302e34202d31322e31202d302e31202d31362e3720302e37202d333220356105048201527f2e35202d34302e312031322e35202d36362e312033382e34202d37362e3720376105248201527f362e33202d322e3720392e35202d322e38203131202d322e372033302e3520306105448201527f2e312032312e3220312e312032392e3420352e362034352e392031302e3320336105648201527f372e372033332e382036302e352036382e382036362e352031352e3920322e376105848201527f2032332e3720322e372034302e3120307a206d3236312e322030206331322e376105a48201527f202d322e342032352e32202d372e332033392e31202d31352e342031312e33206105c48201527f2d362e352031382e32202d31312e372032362e39202d32302e332032392e37206105e48201527f2d32392e332033382e33202d36362e37203235202d3130392e32202d392e32206106048201527f2d32392e33202d32392e36202d35342e36202d35362e33202d36392e37202d316106248201527f382e38202d31302e36202d3434202d31352e35202d3634202d31322e34202d316106448201527f332032202d31382e3920332e37202d33312e3320382e38202d33382e372031366106648201527f202d36312e382035302e37202d36362e38203130302e33202d312e392031392e6106848201527f33202d302e3320333720352e3120353620372e372032372e32203238203438206106a48201527f35352e352035362e382032312e3920372034362e3720382e392036362e3820356106c4820152691718bd11179f1e17b39f60b11b6106e4820152612a3e615c9f6157cc6157c66157a9614d78613fb3613f956138af6138a96138906106ee8c017f3c672066696c6c3d2223356332393239223e3c7061746820643d224d3439342e81527f35203738342e3320632d31322e32202d302e37202d32382e35202d322e36202d60208201527f33332e35202d332e38202d31352e31202d332e36202d32362e34202d37202d3360408201527f342e35202d31302e32202d33342e33202d31332e36202d36382e33202d33342e60608201527f35202d3932202d35362e35202d32342e33202d32322e35202d33362e35202d3360808201527f392e33202d34352e34202d36322e32202d352e31202d31332e32202d362e352060a08201527f2d32322e39202d352e38202d34312e3520302e37202d32302e3320342e37202d60c08201527f33312e382031352e36202d34342e382031302e34202d31322e352032332e372060e08201527f2d31382e332034312e36202d31382e332031312e3320302031322e3820302e346101008201527f2034312e362031302e332033332e322031312e352035332031352e362037392e6101208201527f392031362e342033342e3920312e312036382e31202d342e3720313032202d316101408201527f372e3720372e39202d332031392e36202d382e39203534202d32362e382032326101608201527f2e37202d31312e382033362e32202d3135203538202d31332e382031342e31206101808201527f302e382032322e3220322e3620333220372e332031342e3120362e372032362e6101a08201527f392032322e382033312e372033392e35203220372e3420322e392033332e34206101c08201527f312e332034332e39202d322e342031372e31202d372e332033312e38202d31366101e08201527f2e372035302e34202d372e362031352e32202d372e342031342e39202d31332e6102008201527f362032342e34202d31392032392e31202d34362e392035372e33202d36382e386102208201527f2036392e36202d31342e3220372e39202d31392e372031302e35202d32322e356102408201527f2031302e35202d322e382030202d332e33202d302e35202d342e39202d342e376102608201527f202d35202d31332e35202d31332e39202d33312e35202d32312e39202d34342e6102808201527f31202d322e39202d342e37202d31382e35202d3233202d32332e37202d32372e6102a08201527f39202d382e39202d382e34202d33342e36202d32322e37202d34362e34202d326102c08201527f352e38202d31302e35202d322e38202d31382e32202d33202d32352e38202d306102e08201527f2e37202d392e3820322e39202d31332e3220352e36202d31372031332e32202d6103008201527f322e3720352e34202d332e3220372e36202d332e3120313320302e3120372e366103208201527f20352032342e332031322034302e3720322e3420352e3720342e342031302e356103408201527f20342e342031302e38203020302e3420302e3820322e3520312e3920342e38206103608201527f3120322e3320332e3820392e3420362e312031352e3720322e3420362e3320346103808201527f2e372031322e3120352e332031322e3820302e3520302e3720312e3220342e366103a08201527f20312e3520382e37206c302e3520372e35202d342e34202d302e3220632d322e6103c08201527f34202d302e31202d362e36202d302e33202d392e34202d302e357a222f3e3c706103e08201527f61746820643d224d3638352e34203233302e3620632d302e33202d302e38202d6104008201527f302e34202d322e36202d302e32202d342e31206c302e33202d322e36203420346104208201527f20332e3920342e31202d332e37203020632d322e332030202d34202d302e352061044082015270169a1719901698971a3d11179f1e17b39f60791b6104608201526104710190565b6c078ce40ccd2d8d87a44d0e6d85609b1b8152600d0190565b8e61266b565b7f2c313030252c39322529223e3c7061746820643d224d3332382e35203432382e81527f3320632d32352e34202d352e36202d33392e36202d31332e38202d35302e392060208201527f2d32392e32202d31332e31202d31372e39202d32302e36202d34372e35202d3260408201527f302e36202d38312e362030202d34362e392031372e36202d37372e332035352e60608201527f34202d3936203230202d392e392033352e34202d31332035392e39202d31322e60808201527f322032362e3720302e382034342e3220372e362036322e352032342e3320313860a08201527f2e382031372032382034322e382032362e392037352e34202d302e382032322e60c08201527f35202d322e362033342e36202d372e372035302e31202d362e372032302e352060e08201527f2d31382e362033372e34202d33342e332034392e31202d392e3220362e38202d6101008201527f32322e392031332e37202d33312e372031352e38202d31362e3920342e32202d6101208201527f32322e3720342e39202d343020342e39202d392e36202d302e31202d31382e346101408201527f202d302e33202d31392e35202d302e367a206d2d32312e38202d3132342e38206101608201527f63312e39202d302e3820352e39202d312e3520382e37202d312e3520352e35206101808201527f3020382e37202d312e3220362e36202d322e35202d302e37202d302e34202d316101a08201527f202d322e37202d302e39202d352e3920302e31202d322e38202d302e33202d366101c08201527f2e31202d302e39202d372e33202d302e37202d312e32202d312e32202d332e326101e08201527f202d312e32202d342e342030202d332e39202d322e38202d352e39202d382e316102008201527f202d352e39202d332e372030202d352e3320302e35202d362e3920322e32202d6102208201527f312e3120312e32202d3220322e35202d322033203020302e34202d312e3820326102408201527f202d3420332e34202d322e3220312e35202d3420332e31202d3420332e3720306102608201527f20302e3620312e3120322e3520322e3520342e3320312e3420312e3820322e356102808201527f20342e3620322e3520362e33203020322e3520322e3120362e3120332e3620366102a08201527f2e3120302e33203020322e31202d302e3720342e31202d312e357a222f3e3c706102c08201527f61746820643d224d3538322e35203432372e3520632d32362e32202d342e32206102e08201527f2d34322e31202d31312e36202d35352e31202d32352e39202d372e33202d38206103008201527f2d31342e31202d32302e37202d31372e34202d33322e36202d392e37202d33356103208201527f202d342e35202d38362e392031312e36202d3131342e332031322e38202d32316103408201527f2e382033312e37202d33362e332035372e34202d34342e312031322e32202d336103608201527f2e362031392e36202d342e362033362e32202d342e362032302e3120302033336103808201527f2e3920332034392e322031302e372031392e3320392e372033382e372033302e6103a08201527f332034382e3320353120372e322031352e3720392e382032352e392031312e326103c08201527f2034342e3920322e342033312e34202d342e342035342e32202d32322e3320376103e08201527f342e39202d382e372031302e31202d31322e392031332e38202d32332e3620326104008201527f302e39202d31342e3820392e38202d32372e392031352e36202d34332e3720316104208201527f39202d382e392032202d33392e382032202d35312e3820302e317a206d38342e6104408201527f39202d3132382e352063322e33203020342e37202d302e3520352e34202d312e6104608201527f3220312e39202d312e3920312e34202d352e33202d312e33202d372e38202d316104808201527f2e34202d312e33202d322e35202d332e34202d322e35202d342e362030202d316104a08201527f2e33202d302e36202d322e38202d312e32202d332e33202d372e39202d362e356104c08201527f202d372e37202d362e34202d31302e32202d342e38202d312e3320302e39202d6104e08201527f342e3520312e37202d372e3220312e39206c2d342e3920302e33202d302e33206105008201527f3520632d302e3220322e37202d302e3820352e35202d312e3420362e32202d316105208201527f2e3520312e38202d302e3220332e3220352e3520352e3720322e3920312e33206105408201527f362e3320332e3620372e3620352e31206c322e3420322e3820312e39202d322e6105608201527f362063312e36202d322e3220322e38202d322e3720362e32202d322e377a222f610580820152641f1e17b39f60d91b6105a08201526105a50190565b711e33903334b6361e9111981898189818911f60711b815260120190565b7f3c7061746820643d224d3530302e35203931382e3320632d372e33202d332e3881527f202d31302e38202d392e33202d31322e34202d31392e34202d302e36202d332e60208201527f35202d312e34202d382e31202d312e38202d31302e33206c2d302e38202d332e60408201527f39202d31312e3220302e3220632d31322e3920302e32202d3136202d302e392060608201527f2d32322e39202d382e31202d392e32202d392e35202d31312e34202d31382e3960808201527f202d31312e34202d34372e372030202d31352e3720312e31202d33352e31203260a08201527f2e33202d34322e3520302e31202d302e35202d332e34202d322e33202d372e3860c08201527f202d332e39202d36392e31202d32352e31202d3132352e33202d36392e33202d60e08201527f3134392e32202d3131372e32202d31362e39202d33332e37202d31362e34202d6101008201527f37312e3220312e32202d393820392e32202d31342032302e31202d32322e34206101208201527f3336202d32382e3120332e37202d312e3320382e31202d312e382031372e35206101408201527f2d312e382031312e3520302031332e3220302e322032312e3520332e312033366101608201527f2e322031322e382035362e342031382e362037342e352032312e3520352e36206101808201527f302e382031372e3520312e332033342e3520312e332033342e33202d302e31206101a08201527f34372e34202d322037372e37202d31312e362031352e37202d352e312032332e6101c08201527f39202d382e392036342e38202d33302e322031312e34202d352e392032302e326101e08201527f202d392e372032382e35202d31322e332031312e34202d332e352031322e37206102008201527f2d332e37203237202d332e382031362e31202d302e312032342e3820312e33206102208201527f33362e3520352e392033392e362031352e352035362e342036312e322034312e6102408201527f3520313133202d362032302e37202d31352e372034312e35202d32382e3920366102608201527f312e35202d33302e322034352e38202d36352e382037352e33202d3130392e346102808201527f2039302e35206c2d362e3720322e33202d312e322032312e3420632d302e36206102a08201527f31312e37202d312e32203236202d312e322033312e38202d302e312031332e366102c08201527f202d332e31203331202d362e342033372e35202d332e3420362e39202d3131206102e08201527f31332e37202d31382e332031362e35202d342e3620312e39202d372e3920322e6103008201527f34202d31352e3420322e34202d382e3320302e31202d31302e32202d302e33206103208201527f2d31352e33202d322e36206c2d352e37202d322e37202d312e3520322e3520636103408201527f2d302e3820312e33202d322e3220332e35202d3320342e38202d302e3820312e6103608201527f33202d322e3320352e38202d332e34203130202d312e3120342e31202d322e346103808201527f20382e33202d3320392e33202d312e3620322e39202d372e3420382e31202d316103a08201527f302e3420392e32202d342e3120312e36202d31322e3720312e33202d31362e326103c08201527f202d302e367a206d31332e34202d31332063312e38202d312e3920332e33202d6103e08201527f352e3120342e35202d392e3720352e34202d32312e382031352e39202d32392e6104008201527f332033302e33202d32312e3620362e3520332e352031302e3320332e372031376104208201527f2e3820312e3120372e32202d322e362031312e36202d362e312031342e38202d6104408201527f313220342e34202d372e3920342e35202d392e3120372e34202d36342e3820306104608201527f2e33202d362e3220302e34202d31312e3320302e32202d31312e33202d302e326104808201527f2030202d392e3820312e39202d32312e3420342e31202d34322e3820382e34206104a08201527f2d36342e3920392e34202d39382e3720342e33202d352e37202d302e38202d316104c08201527f312e33202d312e37202d31322e34202d32202d322e35202d302e36202d322e376104e08201527f20302e32202d342e342031362e36202d322e312032302e36202d302e362034306105008201527f2e3620332e372035302e3320312e3920342e32203420362e3920372e3220392e6105208201527f3420342e3520332e3420342e3820332e352031312e3620322e3920332e39202d6105408201527f302e3320392e31202d302e382031312e36202d312e3220342e32202d302e35206105608201527f342e38202d302e3320372e3220322e3520322e3720332e3320352e332031302e6105808201527f3920362e382032302e3520312e322037203220382e3820352e352031312e35206105a08201527f332e3520322e38203520322e3620382e33202d302e367a206d2d392e33202d316105c08201527f32372e3920632d302e33202d322e36202d31202d352e32202d312e35202d352e6105e08201527f38202d302e34202d302e36202d322e37202d362e33202d352e31202d31322e366106008201527f202d322e33202d362e33202d352e31202d31332e34202d362e31202d31352e376106208201527f202d312e31202d322e33202d312e39202d342e34202d312e39202d342e3820306106408201527f202d302e33202d32202d352e31202d342e34202d31302e38202d322e34202d356106608201527f2e36202d362e31202d31352e36202d382e32202d32322e32202d332e33202d316106808201527f302e34202d332e38202d31332e33202d332e39202d32312e352030202d382e376106a08201527f20302e33202d31302e3120332e32202d313620332e39202d372e382037202d316106c08201527f302e312031372e39202d31332e3520372e32202d322e3220382e36202d322e346106e08201527f2031362e34202d312e3520342e3720302e352031312e3220312e372031342e356107008201527f20322e352031312e3720332e312033372e342031372e342034362e342032352e6107208201527f3820352e3220342e392032302e382032332e322032332e372032372e392038206107408201527f31322e362031362e392033302e362032312e39203434206c312e3720342e36206107608201527f332e38202d312e362063362e36202d33203231202d31312e352032382e34202d6107808201527f31362e392031392e32202d31342e312034302e38202d33372e372035362e33206107a08201527f2d36312e3420362e32202d392e352036202d392e322031332e36202d32342e346107c08201527f20392e34202d31382e362031342e33202d33332e332031362e38202d35302e346107e08201527f20312e34202d31302e3120302e37202d33302e32202d312e35202d33372e39206108008201527f2d342e36202d31362e36202d31372e35202d33322e38202d33312e36202d33396108208201527f2e35202d31382e32202d382e37202d34322e34202d392e39202d36322e39202d6108408201527f332e31202d342e3220312e34202d31332e3720352e37202d32312e3120392e366108608201527f202d35322e322032372e32202d35392e392033302e35202d38372e322033372e6108808201527f32202d32342e3920362e31202d34332e382038202d37312e3720372e33202d326108a08201527f392e38202d302e37202d34382e34202d342e34202d3833202d31362e34202d326108c08201527f37202d392e33202d33302e37202d31302e33202d33382e36202d31302e33202d6108e08201527f32332e352030202d34342031362e39202d3532203433202d322e3220372e35206109008201527f2d332e312032362e36202d312e362033372e3120322e392031392e372031352e6109208201527f342034332e362033332e312036332e322032332e352032352e392035342e37206109408201527f34382e382038382e322036342e362032312e352031302e322033322031332e396109608201527f2035352e382031392e36203520312e322032312e3320332e312033332e3520336109808201527f2e3820322e3820302e3220352e3620302e3420362e3420302e3520312e3120306109a08201527f2e3220312e32202d302e3820302e37202d342e347a206d33392e34202d322e336109c08201527f2063352e32202d312031332e36202d322e372031382e35202d332e362032312e6109e08201527f35202d342e312034332e35202d31302e382034332e35202d31332e322030202d610a008201527f32202d39202d32312e38202d31332e36202d32392e39202d382e37202d31352e610a208201527f36202d31352e32202d3234202d32372e34202d33352e37202d31362e38202d31610a408201527f362e32202d33322e37202d32342e38202d35302e36202d32372e37202d362e39610a608201527f202d312e31202d31302e33202d302e35202d31372e342033202d342e3320322e610a808201527f32202d382e392031302e36202d382e392031362e35202d302e3120342e322036610aa08201527f2e362032372e382031302033352e3520312e3120322e3520342e332031302e36610ac08201527f203720313820322e3820372e3420362e372031372e3820382e3820323320322e610ae08201527f3120352e3220342e322031312e3320342e362031332e34206c302e3620332e39610b008201527f20372e37202d302e362063342e32202d302e33203132202d312e352031372e32610b2082015268101699171b3d11179f60b91b610b40820152610b490190565b7f3c7061746820643d224d3333392e35203433352e3420632d3130202d31202d3281527f332e37202d332e39202d3331202d362e37202d32352e36202d392e36202d343360208201527f2e35202d33312e38202d3532202d36342e34202d322e31202d382e32202d352e60408201527f33202d32362e36202d352e33202d33312e33202d302e36202d32392e37202d3060608201527f2e32202d33342e3920332e34202d343920372e39202d33302e332032382e342060808201527f2d35342e382035372e38202d36382e352031392e36202d392e322033352e352060a08201527f2d31332035342e31202d31322e392033302e3220302e312035352e382031302e60c08201527f352037352e312033302e352031312e342031312e392031382e342032342e382060e08201527f32332034322e3420322e372031302e3520322e3920313220322e382033312e356101008201527f202d302e31203137202d302e352032322e35202d322e34203332202d352e35206101208201527f3238202d31342e382034362e38202d33312e332036332e34202d32302e3620326101408201527f302e37202d34362e342033312e34202d37392e372033322e39202d352e3820306101608201527f2e33202d31322e3320302e33202d31342e3520302e317a206d3332202d31312e6101808201527f33206331372e33202d332e37203137202d332e362033312e32202d31302e32206101a08201527f31362e36202d372e39203333202d32342e342034322e32202d34322e3820382e6101c08201527f35202d31362e372031322e38202d33362e382031332e37202d36332e312031206101e08201527f2d3239202d382e38202d35352e31202d32362e38202d37312e34202d31372e336102008201527f202d31352e38202d33352e37202d32332e34202d35392e34202d32342e33202d6102208201527f3231202d302e39202d33372e3620322e37202d35372031322e32202d32332e346102408201527f2031312e36202d33392e312032372e39202d34382e312035302e32202d31332e6102608201527f372033342e31202d372e322039332e342031332e33203132312e342031312e336102808201527f2031352e342032352e352032332e362035302e392032392e3220312e3120302e6102a08201527f3320382e3520302e352031362e3520302e362031302e3620302031362e39202d6102c08201527f302e352032332e35202d312e387a222f3e3c7061746820643d224d3239372e366102e08201527f203330362e3420632d312e36202d312e36202d32202d322e37202d312e37202d6103008201527f352e3620302e31202d302e39202d312e32202d332e36202d322e38202d352e396103208201527f202d332e38202d352e32202d332e39202d382e34202d302e35202d31312e32206103408201527f332e35202d322e3920362e35202d352e3920382e36202d382e3520312e36202d6103608201527f312e3920322e38202d322e3220392e36202d322e3220382e3820302031302e396103808201527f20312e322031312e3520362e3620302e3220312e3720312e3220342e3220322e6103a08201527f3120352e3620312e3520322e3320312e3620332e3220302e3520362e31202d316103c08201527f20322e39202d3120332e3820302e3420352e3820332e3520342e3920302e39206103e08201527f372e39202d362e3720372e39202d332030202d3720302e37202d382e3920312e6104008201527f35202d342e3720312e39202d31302e3120312e39202d31322e31202d302e317a6104208201527f222f3e3c7061746820643d224d3539352e392034333520632d3331202d322e346104408201527f202d35322e36202d31302e38202d36392e32202d32362e39202d31372e33202d6104608201527f31362e37202d32352e38202d33392e32202d32372e33202d37322e31202d322e6104808201527f31202d34352031302e36202d38322e362033352e39202d3130362e372032302e6104a08201527f36202d31392e362035342e35202d33312e362038342e32202d32392e392031336104c08201527f2e3420302e382032352e3320332e332033362e3520372e392031352e3520362e6104e08201527f332032352e342031332033382e362032362e312031372e342031372e342032386105008201527f2e322033382e322033342036352e3620322e312031302e3320322e342033352e6105208201527f3420302e352034342e35202d342e362032312e32202d31342e332033382e39206105408201527f2d32392e382035342e32202d382e3720382e36202d31352e362031332e38202d6105608201527f32362e392032302e33202d32352e312031342e36202d34362e362031392e33206105808201527f2d37362e352031377a206d33352e34202d31302e36206331352e38202d332e346105a08201527f2032382e39202d392e322034332e37202d31392031302e37202d372e312031346105c08201527f2e39202d31302e382032332e36202d32302e392031352e39202d31382e3420326105e08201527f322e35202d33362e372032322e35202d3632202d302e31202d33322e38202d316106008201527f312e38202d36312e35202d3334202d38332e35202d32302e39202d32302e38206106208201527f2d3434202d33302e33202d37322e36202d32392e39202d31342e3320302e31206106408201527f2d32312e3120312e31202d33322e3520342e35202d32352e3720372e38202d346106608201527f342e362032322e33202d35372e342034342e31202d31352e372032362e38202d6106808201527f32302e382037342e37202d31312e36203130382e3320372e392032382e3820326106a08201527f382e362034382e382035372e372035352e362031392e3220342e352034362e396106c08201527f20352e382036302e3620322e387a222f3e3c7061746820643d224d3635342e336106e08201527f203330342e3920632d312e35202d312e37202d352e32202d342e32202d382e316107008201527f202d352e35202d362e36202d33202d382e33202d362e31202d352e39202d31306107208201527f2e3720312e32202d322e3120312e35202d342e3320312e31202d362e33202d306107408201527f2e39202d342e3520322e32202d372e352037202d362e3720322e3320302e34206107608201527f342e32203020352e37202d312e3120312e33202d302e3920332e39202d312e366107808201527f20352e37202d312e3620332e31203020342e3520302e3820313120362e3120306107a08201527f2e3620302e3520312e3220312e3920312e3220332e31203020312e3220312e316107c08201527f20332e3420322e3520342e3820332e3520332e3620332e382031312e3520302e6107e08201527f362031342e31202d312e3620312e33202d332e3120312e36202d352e3220312e6108008201527f32202d322e35202d302e35202d332e35202d302e31202d352e3920322e36202d6108208201527f332e3620332e39202d362e3120332e39202d392e3720307a222f3e000000000061084082015261085b0190565b700785ece7c78ce40ccd2d8d87a44d0e6d85607b1b815260110190565b8761266b565b7f2c203630252c2034302529223e3c7061746820643d224d3530312e352039303781527f2e3720632d322e35202d322e35202d332e35202d342e35202d34202d382e332060208201527f2d302e34202d322e37202d312e34202d372e36202d322e32202d31302e39202d60408201527f33202d31312e32202d362e32202d31352e33202d31302e37202d31332e35202d60608201527f312e3520302e35202d362e372031202d31312e352031202d382e352030202d3960808201527f202d302e31202d31332e33202d332e34202d392e33202d372e31202d31322e3660a08201527f202d32322e32202d31312e35202d35322e3120302e36202d31342e3320312e3960c08201527f202d32372e3920332e31202d33312e3220302e34202d302e3920312e36202d3060e08201527f2e3820342e3820302e3220352e3920312e372032332e3720342e332033372e386101008201527f20352e342031312e3220302e392032372e3620302e322034322e35202d312e386101208201527f20382e32202d312034362e34202d382e352035312e35202d313020312e39202d6101408201527f302e3620332e37202d312e3120332e39202d312e3120312030202d322e3420366101608201527f362e32202d332e392037332e39202d312e3320362e39202d352e342031342e346101808201527f202d392e372031372e37202d3520332e38202d31332e3320362e34202d32302e6101a08201527f3620362e34202d352e322030202d372e35202d302e36202d31322e32202d332e6101c08201527f31202d332e38202d32202d362e35202d322e39202d38202d322e35202d362e346101e08201527f20312e36202d31322e392031312e34202d31362e312032342e32202d322e33206102008201527f392e32202d352e342031322e34202d31312e392031322e34202d342030202d356102208201527f2e32202d302e35202d38202d332e337a222f3e3c2f673e3c672066696c6c3d226102408201527f23623634393439223e3c7061746820643d224d3531352e35203737372e3420636102608201527f2d302e34202d322e32202d322e35202d382e32202d342e36202d31332e34202d6102808201527f322e31202d352e32202d36202d31352e36202d382e38202d3233202d322e37206102a08201527f2d372e34202d352e39202d31352e35202d37202d3138202d312e31202d322e356102c08201527f202d332e38202d31302e36202d36202d3138202d332e32202d31302e35202d346102e08201527f2e31202d31352e31202d34202d32302e3520302e31202d32312e342031372e316103008201527f202d32382e36203435202d31392e322031342e3120342e382032342e342031316103208201527f2e342033372e392032342e342031322e322031312e372031382e372032302e316103408201527f2032372e342033352e37203520382e372031352e362033322e362031352e36206103608201527f3335203020322e37202d32332e3220392e39202d34352e352031342e31202d346103808201527f2e3920302e39202d31332e3320322e36202d31382e3520332e37202d352e32206103a08201527f312e31202d31342e3320322e32202d32302e3220322e35206c2d31302e3720306103c082015273171b101698171b101699971cbd11179f1e17b39f60611b6103e08201526103f40190565b651e17b9bb339f60d11b815260060190565b600082615cc057615cc061282a565b500490565b634e487b7160e01b600052603160045260246000fdfe417765736f6d65206f6e636861696e204e465420636f6c6c656374696f6e20746861742063616e2068656c7020796f752074657374206e657720626c6f636b636861696e2070726f6a656374732e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202267571787e8c73abcebf8cd34c3bb5dc1ea1d78d50f90a33e6425cd959a0e5f64736f6c63430008120033

Deployed Bytecode Sourcemap

75492:2999:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56525:224;;;;;;;;;;-1:-1:-1;56525:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;56525:224:0;;;;;;;;40587:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42099:171::-;;;;;;;;;;-1:-1:-1;42099:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1719:32:1;;;1701:51;;1689:2;1674:18;42099:171:0;1555:203:1;41617:416:0;;;;;;;;;;-1:-1:-1;41617:416:0;;;;;:::i;:::-;;:::i;:::-;;75580:35;;;;;;;;;;;;;;;;;;;2346:25:1;;;2334:2;2319:18;75580:35:0;2200:177:1;57165:113:0;;;;;;;;;;-1:-1:-1;57253:10:0;:17;57165:113;;42799:335;;;;;;;;;;-1:-1:-1;42799:335:0;;;;;:::i;:::-;;:::i;56833:256::-;;;;;;;;;;-1:-1:-1;56833:256:0;;;;;:::i;:::-;;:::i;78319:169::-;;;:::i;43205:185::-;;;;;;;;;;-1:-1:-1;43205:185:0;;;;;:::i;:::-;;:::i;57355:233::-;;;;;;;;;;-1:-1:-1;57355:233:0;;;;;:::i;:::-;;:::i;40297:223::-;;;;;;;;;;-1:-1:-1;40297:223:0;;;;;:::i;:::-;;:::i;40028:207::-;;;;;;;;;;-1:-1:-1;40028:207:0;;;;;:::i;:::-;;:::i;18010:103::-;;;;;;;;;;;;;:::i;17362:87::-;;;;;;;;;;-1:-1:-1;17435:6:0;;-1:-1:-1;;;;;17435:6:0;17362:87;;40756:104;;;;;;;;;;;;;:::i;76600:755::-;;;;;;:::i;:::-;;:::i;42342:155::-;;;;;;;;;;-1:-1:-1;42342:155:0;;;;;:::i;:::-;;:::i;75758:46::-;;;;;;;;;;-1:-1:-1;75758:46:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;43461:322::-;;;;;;;;;;-1:-1:-1;43461:322:0;;;;;:::i;:::-;;:::i;78093:219::-;;;;;;;;;;-1:-1:-1;78093:219:0;;;;;:::i;:::-;;:::i;42568:164::-;;;;;;;;;;-1:-1:-1;42568:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;42689:25:0;;;42665:4;42689:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42568:164;18268:201;;;;;;;;;;-1:-1:-1;18268:201:0;;;;;:::i;:::-;;:::i;56525:224::-;56627:4;-1:-1:-1;;;;;;56651:50:0;;-1:-1:-1;;;56651:50:0;;:90;;;56705:36;56729:11;56705:23;:36::i;:::-;56644:97;56525:224;-1:-1:-1;;56525:224:0:o;40587:100::-;40641:13;40674:5;40667:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40587:100;:::o;42099:171::-;42175:7;42195:23;42210:7;42195:14;:23::i;:::-;-1:-1:-1;42238:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42238:24:0;;42099:171::o;41617:416::-;41698:13;41714:23;41729:7;41714:14;:23::i;:::-;41698:39;;41762:5;-1:-1:-1;;;;;41756:11:0;:2;-1:-1:-1;;;;;41756:11:0;;41748:57;;;;-1:-1:-1;;;41748:57:0;;6320:2:1;41748:57:0;;;6302:21:1;6359:2;6339:18;;;6332:30;6398:34;6378:18;;;6371:62;-1:-1:-1;;;6449:18:1;;;6442:31;6490:19;;41748:57:0;;;;;;;;;15993:10;-1:-1:-1;;;;;41840:21:0;;;;:62;;-1:-1:-1;41865:37:0;41882:5;15993:10;42568:164;:::i;41865:37::-;41818:173;;;;-1:-1:-1;;;41818:173:0;;6722:2:1;41818:173:0;;;6704:21:1;6761:2;6741:18;;;6734:30;6800:34;6780:18;;;6773:62;6871:31;6851:18;;;6844:59;6920:19;;41818:173:0;6520:425:1;41818:173:0;42004:21;42013:2;42017:7;42004:8;:21::i;:::-;41687:346;41617:416;;:::o;42799:335::-;42994:41;15993:10;43027:7;42994:18;:41::i;:::-;42986:99;;;;-1:-1:-1;;;42986:99:0;;;;;;;:::i;:::-;43098:28;43108:4;43114:2;43118:7;43098:9;:28::i;56833:256::-;56930:7;56966:23;56983:5;56966:16;:23::i;:::-;56958:5;:31;56950:87;;;;-1:-1:-1;;;56950:87:0;;7566:2:1;56950:87:0;;;7548:21:1;7605:2;7585:18;;;7578:30;7644:34;7624:18;;;7617:62;-1:-1:-1;;;7695:18:1;;;7688:41;7746:19;;56950:87:0;7364:407:1;56950:87:0;-1:-1:-1;;;;;;57055:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;56833:256::o;78319:169::-;17248:13;:11;:13::i;:::-;78372:7:::1;78393;17435:6:::0;;-1:-1:-1;;;;;17435:6:0;;17362:87;78393:7:::1;-1:-1:-1::0;;;;;78385:21:0::1;78414;78385:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78371:69;;;78455:2;78447:35;;;::::0;-1:-1:-1;;;78447:35:0;;8188:2:1;78447:35:0::1;::::0;::::1;8170:21:1::0;8227:2;8207:18;;;8200:30;-1:-1:-1;;;8246:18:1;;;8239:50;8306:18;;78447:35:0::1;7986:344:1::0;78447:35:0::1;78364:124;78319:169::o:0;43205:185::-;43343:39;43360:4;43366:2;43370:7;43343:39;;;;;;;;;;;;:16;:39::i;57355:233::-;57430:7;57466:30;57253:10;:17;;57165:113;57466:30;57458:5;:38;57450:95;;;;-1:-1:-1;;;57450:95:0;;8537:2:1;57450:95:0;;;8519:21:1;8576:2;8556:18;;;8549:30;8615:34;8595:18;;;8588:62;-1:-1:-1;;;8666:18:1;;;8659:42;8718:19;;57450:95:0;8335:408:1;57450:95:0;57563:10;57574:5;57563:17;;;;;;;;:::i;:::-;;;;;;;;;57556:24;;57355:233;;;:::o;40297:223::-;40369:7;45184:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45184:16:0;;40433:56;;;;-1:-1:-1;;;40433:56:0;;9082:2:1;40433:56:0;;;9064:21:1;9121:2;9101:18;;;9094:30;-1:-1:-1;;;9140:18:1;;;9133:54;9204:18;;40433:56:0;8880:348:1;40028:207:0;40100:7;-1:-1:-1;;;;;40128:19:0;;40120:73;;;;-1:-1:-1;;;40120:73:0;;9435:2:1;40120:73:0;;;9417:21:1;9474:2;9454:18;;;9447:30;9513:34;9493:18;;;9486:62;-1:-1:-1;;;9564:18:1;;;9557:39;9613:19;;40120:73:0;9233:405:1;40120:73:0;-1:-1:-1;;;;;;40211:16:0;;;;;:9;:16;;;;;;;40028:207::o;18010:103::-;17248:13;:11;:13::i;:::-;18075:30:::1;18102:1;18075:18;:30::i;:::-;18010:103::o:0;40756:104::-;40812:13;40845:7;40838:14;;;;;:::i;76600:755::-;76679:1;76665:11;:15;76657:55;;;;-1:-1:-1;;;76657:55:0;;9845:2:1;76657:55:0;;;9827:21:1;9884:2;9864:18;;;9857:30;9923:29;9903:18;;;9896:57;9970:18;;76657:55:0;9643:351:1;76657:55:0;76747:11;76740:4;;:18;;;;:::i;:::-;76727:9;:31;;76719:62;;;;-1:-1:-1;;;76719:62:0;;10506:2:1;76719:62:0;;;10488:21:1;10545:2;10525:18;;;10518:30;-1:-1:-1;;;10564:18:1;;;10557:48;10622:18;;76719:62:0;10304:342:1;76719:62:0;76794:14;76811:13;57253:10;:17;;57165:113;76811:13;76794:30;-1:-1:-1;76848:1:0;76831:519;76856:11;76851:1;:16;76831:519;;76883:27;76913:343;;;;;;;;76973:30;76990:1;76981:6;:10;;;;:::i;:::-;76973:28;:30::i;:::-;76937:67;;;;;;;;:::i;:::-;;;;;;;;;;;;;76913:343;;;;;;;;;;;;;;;;;;;;;;;;;77104:44;:33;77114:2;77118:3;77123:1;77126:10;77135:1;77126:6;:10;:::i;:::-;77104:9;:33::i;:44::-;76913:343;;;;77157:44;:33;77167:2;77171:3;77176:1;77179:10;77188:1;77179:6;:10;:::i;77157:44::-;76913:343;;;;77210:45;:34;77220:2;77224:3;77229:2;77233:10;77242:1;77233:6;:10;:::i;77210:45::-;76913:343;;76883:373;-1:-1:-1;76883:373:0;77265:9;:21;77275:10;77284:1;77275:6;:10;:::i;:::-;77265:21;;;;;;;;;;;-1:-1:-1;77265:21:0;:35;;:21;;:35;;:21;:35;:::i;:::-;-1:-1:-1;77265:35:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77265:35:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77265:35:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77265:35:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77309:33:0;;-1:-1:-1;77319:10:0;;-1:-1:-1;77331:10:0;77340:1;77331:6;:10;:::i;:::-;77309:9;:33::i;:::-;-1:-1:-1;76869:3:0;;;;:::i;:::-;;;;76831:519;;42342:155;42437:52;15993:10;42470:8;42480;42437:18;:52::i;:::-;42342:155;;:::o;75758:46::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43461:322::-;43635:41;15993:10;43668:7;43635:18;:41::i;:::-;43627:99;;;;-1:-1:-1;;;43627:99:0;;;;;;;:::i;:::-;43737:38;43751:4;43757:2;43761:7;43770:4;43737:13;:38::i;:::-;43461:322;;;;:::o;78093:219::-;45586:4;45184:16;;;:7;:16;;;;;;78167:13;;-1:-1:-1;;;;;45184:16:0;78191:76;;;;-1:-1:-1;;;78191:76:0;;13982:2:1;78191:76:0;;;13964:21:1;14021:2;14001:18;;;13994:30;14060:34;14040:18;;;14033:62;-1:-1:-1;;;14111:18:1;;;14104:45;14166:19;;78191:76:0;13780:411:1;78191:76:0;78283:23;78297:8;78283:13;:23::i;18268:201::-;17248:13;:11;:13::i;:::-;-1:-1:-1;;;;;18357:22:0;::::1;18349:73;;;::::0;-1:-1:-1;;;18349:73:0;;14398:2:1;18349:73:0::1;::::0;::::1;14380:21:1::0;14437:2;14417:18;;;14410:30;14476:34;14456:18;;;14449:62;-1:-1:-1;;;14527:18:1;;;14520:36;14573:19;;18349:73:0::1;14196:402:1::0;18349:73:0::1;18433:28;18452:8;18433:18;:28::i;39659:305::-:0;39761:4;-1:-1:-1;;;;;;39798:40:0;;-1:-1:-1;;;39798:40:0;;:105;;-1:-1:-1;;;;;;;39855:48:0;;-1:-1:-1;;;39855:48:0;39798:105;:158;;;-1:-1:-1;;;;;;;;;;31200:40:0;;;39920:36;31091:157;51918:135;45586:4;45184:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45184:16:0;51992:53;;;;-1:-1:-1;;;51992:53:0;;9082:2:1;51992:53:0;;;9064:21:1;9121:2;9101:18;;;9094:30;-1:-1:-1;;;9140:18:1;;;9133:54;9204:18;;51992:53:0;8880:348:1;51197:174:0;51272:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;51272:29:0;-1:-1:-1;;;;;51272:29:0;;;;;;;;:24;;51326:23;51272:24;51326:14;:23::i;:::-;-1:-1:-1;;;;;51317:46:0;;;;;;;;;;;51197:174;;:::o;45816:264::-;45909:4;45926:13;45942:23;45957:7;45942:14;:23::i;:::-;45926:39;;45995:5;-1:-1:-1;;;;;45984:16:0;:7;-1:-1:-1;;;;;45984:16:0;;:52;;;-1:-1:-1;;;;;;42689:25:0;;;42665:4;42689:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46004:32;45984:87;;;;46064:7;-1:-1:-1;;;;;46040:31:0;:20;46052:7;46040:11;:20::i;:::-;-1:-1:-1;;;;;46040:31:0;;45984:87;45976:96;45816:264;-1:-1:-1;;;;45816:264:0:o;49815:1263::-;49974:4;-1:-1:-1;;;;;49947:31:0;:23;49962:7;49947:14;:23::i;:::-;-1:-1:-1;;;;;49947:31:0;;49939:81;;;;-1:-1:-1;;;49939:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50039:16:0;;50031:65;;;;-1:-1:-1;;;50031:65:0;;15211:2:1;50031:65:0;;;15193:21:1;15250:2;15230:18;;;15223:30;15289:34;15269:18;;;15262:62;-1:-1:-1;;;15340:18:1;;;15333:34;15384:19;;50031:65:0;15009:400:1;50031:65:0;50109:42;50130:4;50136:2;50140:7;50149:1;50109:20;:42::i;:::-;50281:4;-1:-1:-1;;;;;50254:31:0;:23;50269:7;50254:14;:23::i;:::-;-1:-1:-1;;;;;50254:31:0;;50246:81;;;;-1:-1:-1;;;50246:81:0;;;;;;;:::i;:::-;50399:24;;;;:15;:24;;;;;;;;50392:31;;-1:-1:-1;;;;;;50392:31:0;;;;;;-1:-1:-1;;;;;50875:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;50875:20:0;;;50910:13;;;;;;;;;:18;;50392:31;50910:18;;;50950:16;;;:7;:16;;;;;;:21;;;;;;;;;;50989:27;;50415:7;;50989:27;;;41687:346;41617:416;;:::o;17527:132::-;17435:6;;-1:-1:-1;;;;;17435:6:0;15993:10;17591:23;17583:68;;;;-1:-1:-1;;;17583:68:0;;15616:2:1;17583:68:0;;;15598:21:1;;;15635:18;;;15628:30;15694:34;15674:18;;;15667:62;15746:18;;17583:68:0;15414:356:1;18629:191:0;18722:6;;;-1:-1:-1;;;;;18739:17:0;;;-1:-1:-1;;;;;;18739:17:0;;;;;;;18772:40;;18722:6;;;18739:17;18722:6;;18772:40;;18703:16;;18772:40;18692:128;18629:191;:::o;13340:716::-;13396:13;13447:14;13464:17;13475:5;13464:10;:17::i;:::-;13484:1;13464:21;13447:38;;13500:20;13534:6;13523:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13523:18:0;-1:-1:-1;13500:41:0;-1:-1:-1;13665:28:0;;;13681:2;13665:28;13722:288;-1:-1:-1;;13754:5:0;-1:-1:-1;;;13891:2:0;13880:14;;13875:30;13754:5;13862:44;13952:2;13943:11;;;-1:-1:-1;13973:21:0;13722:288;13973:21;-1:-1:-1;14031:6:0;13340:716;-1:-1:-1;;;13340:716:0:o;75866:728::-;75988:7;;76027:21;:17;76047:1;76027:21;:::i;:::-;76083:28;;;76100:10;16056:2:1;16052:15;-1:-1:-1;;16048:53:1;76083:28:0;;;16036:66:1;76083:28:0;;;;;;;;;16118:12:1;;;;76083:28:0;;;76004:44;;-1:-1:-1;76055:25:0;76165:35;76183:17;76004:44;76165:35;:::i;:::-;76155:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76155:46:0;-1:-1:-1;76118:83:0;-1:-1:-1;76221:17:0;76208:137;76244:15;76240:1;:19;76208:137;;;76322:12;76335:1;76322:15;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;76322:15:0;76277:21;76299:19;76301:17;76299:1;:19;:::i;:::-;76277:42;;;;;;;;:::i;:::-;;;;:60;-1:-1:-1;;;;;76277:60:0;;;;;;;;-1:-1:-1;76261:3:0;;;;:::i;:::-;;;;76208:137;;;-1:-1:-1;76351:26:0;76380:23;76393:10;76380;:23;:::i;:::-;76351:52;;76410:20;76544:18;76481:15;76498:10;76510:21;76533:5;76464:75;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76454:86;;;;;;76446:95;;:116;;;;:::i;:::-;76433:129;;:10;:129;:::i;:::-;76410:152;75866:728;-1:-1:-1;;;;;;;;;;75866:728:0:o;46422:110::-;46498:26;46508:2;46512:7;46498:26;;;;;;;;;;;;:9;:26::i;51514:315::-;51669:8;-1:-1:-1;;;;;51660:17:0;:5;-1:-1:-1;;;;;51660:17:0;;51652:55;;;;-1:-1:-1;;;51652:55:0;;17154:2:1;51652:55:0;;;17136:21:1;17193:2;17173:18;;;17166:30;17232:27;17212:18;;;17205:55;17277:18;;51652:55:0;16952:349:1;51652:55:0;-1:-1:-1;;;;;51718:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;51718:46:0;;;;;;;;;;51780:41;;540::1;;;51780::0;;513:18:1;51780:41:0;;;;;;;51514:315;;;:::o;44664:313::-;44820:28;44830:4;44836:2;44840:7;44820:9;:28::i;:::-;44867:47;44890:4;44896:2;44900:7;44909:4;44867:22;:47::i;:::-;44859:110;;;;-1:-1:-1;;;44859:110:0;;;;;;;:::i;77361:726::-;77423:13;77447:31;77481:9;:19;77491:8;77481:19;;;;;;;;;;;77447:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77589:490;77695:15;:20;;;77794:15;:27;;;77953:90;77971:15;:21;;;77994:15;:23;;;78019:15;:23;;;77953:17;:90::i;:::-;77609:468;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77589:13;:490::i;:::-;77523:557;;;;;;;;:::i;:::-;;;;;;;;;;;;;77509:572;;;77361:726;;;:::o;57662:915::-;57839:61;57866:4;57872:2;57876:12;57890:9;57839:26;:61::i;:::-;57929:1;57917:9;:13;57913:222;;;58060:63;;-1:-1:-1;;;58060:63:0;;19943:2:1;58060:63:0;;;19925:21:1;19982:2;19962:18;;;19955:30;20021:34;20001:18;;;19994:62;-1:-1:-1;;;20072:18:1;;;20065:51;20133:19;;58060:63:0;19741:417:1;57913:222:0;58165:12;-1:-1:-1;;;;;58194:18:0;;58190:187;;58229:40;58261:7;59404:10;:17;;59377:24;;;;:15;:24;;;;;:44;;;59432:24;;;;;;;;;;;;59300:164;58229:40;58190:187;;;58299:2;-1:-1:-1;;;;;58291:10:0;:4;-1:-1:-1;;;;;58291:10:0;;58287:90;;58318:47;58351:4;58357:7;58318:32;:47::i;:::-;-1:-1:-1;;;;;58391:16:0;;58387:183;;58424:45;58461:7;58424:36;:45::i;:::-;58387:183;;;58497:4;-1:-1:-1;;;;;58491:10:0;:2;-1:-1:-1;;;;;58491:10:0;;58487:83;;58518:40;58546:2;58550:7;58518:27;:40::i;:::-;57828:749;57662:915;;;;:::o;10206:922::-;10259:7;;-1:-1:-1;;;10337:15:0;;10333:102;;-1:-1:-1;;;10373:15:0;;;-1:-1:-1;10417:2:0;10407:12;10333:102;10462:6;10453:5;:15;10449:102;;10498:6;10489:15;;;-1:-1:-1;10533:2:0;10523:12;10449:102;10578:6;10569:5;:15;10565:102;;10614:6;10605:15;;;-1:-1:-1;10649:2:0;10639:12;10565:102;10694:5;10685;:14;10681:99;;10729:5;10720:14;;;-1:-1:-1;10763:1:0;10753:11;10681:99;10807:5;10798;:14;10794:99;;10842:5;10833:14;;;-1:-1:-1;10876:1:0;10866:11;10794:99;10920:5;10911;:14;10907:99;;10955:5;10946:14;;;-1:-1:-1;10989:1:0;10979:11;10907:99;11033:5;11024;:14;11020:66;;11069:1;11059:11;11114:6;10206:922;-1:-1:-1;;10206:922:0:o;46759:319::-;46888:18;46894:2;46898:7;46888:5;:18::i;:::-;46939:53;46970:1;46974:2;46978:7;46987:4;46939:22;:53::i;:::-;46917:153;;;;-1:-1:-1;;;46917:153:0;;;;;;;:::i;52617:853::-;52771:4;-1:-1:-1;;;;;52792:13:0;;20355:19;:23;52788:675;;52828:71;;-1:-1:-1;;;52828:71:0;;-1:-1:-1;;;;;52828:36:0;;;;;:71;;15993:10;;52879:4;;52885:7;;52894:4;;52828:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52828:71:0;;;;;;;;-1:-1:-1;;52828:71:0;;;;;;;;;;;;:::i;:::-;;;52824:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53069:6;:13;53086:1;53069:18;53065:328;;53112:60;;-1:-1:-1;;;53112:60:0;;;;;;;:::i;53065:328::-;53343:6;53337:13;53328:6;53324:2;53320:15;53313:38;52824:584;-1:-1:-1;;;;;;52950:51:0;-1:-1:-1;;;52950:51:0;;-1:-1:-1;52943:58:0;;52788:675;-1:-1:-1;53447:4:0;53440:11;;64711:10774;64823:13;64852:10627;65101:6;67863:8;74429;64865:10612;;;;;;;;;;:::i;62670:2037::-;62728:13;62758:4;:11;62773:1;62758:16;62754:31;;-1:-1:-1;;62776:9:0;;;;;;;;;-1:-1:-1;62776:9:0;;;62670:2037::o;62754:31::-;62845:19;62867:5;;;;;;;;;;;;;;;;;62845:27;;62924:18;62970:1;62951:4;:11;62965:1;62951:15;;;;:::i;:::-;62950:21;;;;:::i;:::-;62945:27;;:1;:27;:::i;:::-;62924:48;-1:-1:-1;63055:20:0;63089:15;62924:48;63102:2;63089:15;:::i;:::-;63078:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63078:27:0;;63055:50;;63202:10;63194:6;63187:26;63309:1;63302:5;63298:13;63380:4;63431;63425:11;63416:7;63412:25;63539:2;63531:6;63527:15;63624:810;63643:6;63634:7;63631:19;63624:810;;;63709:1;63696:15;;;63790:14;;63943:4;63931:2;63927:14;;;63923:25;;63909:40;;63903:47;63898:3;63894:57;;;63876:76;;64071:2;64067:14;;;64063:25;;64049:40;;64043:47;64034:57;;63997:1;63982:17;;64016:76;64212:1;64207:14;;;64203:25;;64189:40;;64183:47;64174:57;;64122:17;;;64156:76;64343:25;;64329:40;;64323:47;64314:57;;64262:17;;;64296:76;;;;64402:17;;63624:810;;;64519:1;64512:4;64506:11;64502:19;64540:1;64535:54;;;;64608:1;64603:52;;;;64495:160;;64535:54;-1:-1:-1;;;;;64551:17:0;;64544:43;64535:54;;64603:52;-1:-1:-1;;;;;64619:17:0;;64612:41;64495:160;-1:-1:-1;64693:6:0;;62670:2037;-1:-1:-1;;;;;;;;62670:2037:0:o;54202:410::-;54392:1;54380:9;:13;54376:229;;;-1:-1:-1;;;;;54414:18:0;;;54410:87;;-1:-1:-1;;;;;54453:15:0;;;;;;:9;:15;;;;;:28;;54472:9;;54453:15;:28;;54472:9;;54453:28;:::i;:::-;;;;-1:-1:-1;;54410:87:0;-1:-1:-1;;;;;54515:16:0;;;54511:83;;-1:-1:-1;;;;;54552:13:0;;;;;;:9;:13;;;;;:26;;54569:9;;54552:13;:26;;54569:9;;54552:26;:::i;:::-;;;;-1:-1:-1;;54202:410:0;;;;:::o;60091:988::-;60357:22;60407:1;60382:22;60399:4;60382:16;:22::i;:::-;:26;;;;:::i;:::-;60419:18;60440:26;;;:17;:26;;;;;;60357:51;;-1:-1:-1;60573:28:0;;;60569:328;;-1:-1:-1;;;;;60640:18:0;;60618:19;60640:18;;;:12;:18;;;;;;;;:34;;;;;;;;;60691:30;;;;;;:44;;;60808:30;;:17;:30;;;;;:43;;;60569:328;-1:-1:-1;60993:26:0;;;;:17;:26;;;;;;;;60986:33;;;-1:-1:-1;;;;;61037:18:0;;;;;:12;:18;;;;;:34;;;;;;;61030:41;60091:988::o;61374:1079::-;61652:10;:17;61627:22;;61652:21;;61672:1;;61652:21;:::i;:::-;61684:18;61705:24;;;:15;:24;;;;;;62078:10;:26;;61627:46;;-1:-1:-1;61705:24:0;;61627:46;;62078:26;;;;;;:::i;:::-;;;;;;;;;62056:48;;62142:11;62117:10;62128;62117:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;62222:28;;;:15;:28;;;;;;;:41;;;62394:24;;;;;62387:31;62429:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;61445:1008;;;61374:1079;:::o;58878:221::-;58963:14;58980:20;58997:2;58980:16;:20::i;:::-;-1:-1:-1;;;;;59011:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;59056:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;58878:221:0:o;47414:942::-;-1:-1:-1;;;;;47494:16:0;;47486:61;;;;-1:-1:-1;;;47486:61:0;;46896:2:1;47486:61:0;;;46878:21:1;;;46915:18;;;46908:30;46974:34;46954:18;;;46947:62;47026:18;;47486:61:0;46694:356:1;47486:61:0;45586:4;45184:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45184:16:0;45610:31;47558:58;;;;-1:-1:-1;;;47558:58:0;;47257:2:1;47558:58:0;;;47239:21:1;47296:2;47276:18;;;47269:30;47335;47315:18;;;47308:58;47383:18;;47558:58:0;47055:352:1;47558:58:0;47629:48;47658:1;47662:2;47666:7;47675:1;47629:20;:48::i;:::-;45586:4;45184:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45184:16:0;45610:31;47767:58;;;;-1:-1:-1;;;47767:58:0;;47257:2:1;47767:58:0;;;47239:21:1;47296:2;47276:18;;;47269:30;47335;47315:18;;;47308:58;47383:18;;47767:58:0;47055:352:1;47767:58:0;-1:-1:-1;;;;;48174:13:0;;;;;;:9;:13;;;;;;;;:18;;48191:1;48174:18;;;48216:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48216:21:0;;;;;48255:33;48224:7;;48174:13;;48255:33;;48174:13;;48255:33;42342:155;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:1;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:1:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1370:180::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1521:23:1;;1370:180;-1:-1:-1;1370:180:1:o;1763:173::-;1831:20;;-1:-1:-1;;;;;1880:31:1;;1870:42;;1860:70;;1926:1;1923;1916:12;1860:70;1763:173;;;:::o;1941:254::-;2009:6;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;2109:29;2128:9;2109:29;:::i;:::-;2099:39;2185:2;2170:18;;;;2157:32;;-1:-1:-1;;;1941:254:1:o;2382:328::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:52;;;2544:1;2541;2534:12;2496:52;2567:29;2586:9;2567:29;:::i;:::-;2557:39;;2615:38;2649:2;2638:9;2634:18;2615:38;:::i;:::-;2605:48;;2700:2;2689:9;2685:18;2672:32;2662:42;;2382:328;;;;;:::o;2715:186::-;2774:6;2827:2;2815:9;2806:7;2802:23;2798:32;2795:52;;;2843:1;2840;2833:12;2795:52;2866:29;2885:9;2866:29;:::i;2906:347::-;2971:6;2979;3032:2;3020:9;3011:7;3007:23;3003:32;3000:52;;;3048:1;3045;3038:12;3000:52;3071:29;3090:9;3071:29;:::i;:::-;3061:39;;3150:2;3139:9;3135:18;3122:32;3197:5;3190:13;3183:21;3176:5;3173:32;3163:60;;3219:1;3216;3209:12;3163:60;3242:5;3232:15;;;2906:347;;;;;:::o;3258:930::-;3599:3;3588:9;3581:22;3562:4;3626:57;3678:3;3667:9;3663:19;3655:6;3626:57;:::i;:::-;3731:9;3723:6;3719:22;3714:2;3703:9;3699:18;3692:50;3765:44;3802:6;3794;3765:44;:::i;:::-;3751:58;;3857:9;3849:6;3845:22;3840:2;3829:9;3825:18;3818:50;3891:44;3928:6;3920;3891:44;:::i;:::-;3877:58;;3983:9;3975:6;3971:22;3966:2;3955:9;3951:18;3944:50;4017:44;4054:6;4046;4017:44;:::i;:::-;4003:58;;4110:9;4102:6;4098:22;4092:3;4081:9;4077:19;4070:51;4138:44;4175:6;4167;4138:44;:::i;:::-;4130:52;3258:930;-1:-1:-1;;;;;;;;3258:930:1:o;4193:127::-;4254:10;4249:3;4245:20;4242:1;4235:31;4285:4;4282:1;4275:15;4309:4;4306:1;4299:15;4325:1138;4420:6;4428;4436;4444;4497:3;4485:9;4476:7;4472:23;4468:33;4465:53;;;4514:1;4511;4504:12;4465:53;4537:29;4556:9;4537:29;:::i;:::-;4527:39;;4585:38;4619:2;4608:9;4604:18;4585:38;:::i;:::-;4575:48;;4670:2;4659:9;4655:18;4642:32;4632:42;;4725:2;4714:9;4710:18;4697:32;4748:18;4789:2;4781:6;4778:14;4775:34;;;4805:1;4802;4795:12;4775:34;4843:6;4832:9;4828:22;4818:32;;4888:7;4881:4;4877:2;4873:13;4869:27;4859:55;;4910:1;4907;4900:12;4859:55;4946:2;4933:16;4968:2;4964;4961:10;4958:36;;;4974:18;;:::i;:::-;5049:2;5043:9;5017:2;5103:13;;-1:-1:-1;;5099:22:1;;;5123:2;5095:31;5091:40;5079:53;;;5147:18;;;5167:22;;;5144:46;5141:72;;;5193:18;;:::i;:::-;5233:10;5229:2;5222:22;5268:2;5260:6;5253:18;5308:7;5303:2;5298;5294;5290:11;5286:20;5283:33;5280:53;;;5329:1;5326;5319:12;5280:53;5385:2;5380;5376;5372:11;5367:2;5359:6;5355:15;5342:46;5430:1;5425:2;5420;5412:6;5408:15;5404:24;5397:35;5451:6;5441:16;;;;;;;4325:1138;;;;;;;:::o;5468:260::-;5536:6;5544;5597:2;5585:9;5576:7;5572:23;5568:32;5565:52;;;5613:1;5610;5603:12;5565:52;5636:29;5655:9;5636:29;:::i;:::-;5626:39;;5684:38;5718:2;5707:9;5703:18;5684:38;:::i;:::-;5674:48;;5468:260;;;;;:::o;5733:380::-;5812:1;5808:12;;;;5855;;;5876:61;;5930:4;5922:6;5918:17;5908:27;;5876:61;5983:2;5975:6;5972:14;5952:18;5949:38;5946:161;;6029:10;6024:3;6020:20;6017:1;6010:31;6064:4;6061:1;6054:15;6092:4;6089:1;6082:15;5946:161;;5733:380;;;:::o;6950:409::-;7152:2;7134:21;;;7191:2;7171:18;;;7164:30;7230:34;7225:2;7210:18;;7203:62;-1:-1:-1;;;7296:2:1;7281:18;;7274:43;7349:3;7334:19;;6950:409::o;8748:127::-;8809:10;8804:3;8800:20;8797:1;8790:31;8840:4;8837:1;8830:15;8864:4;8861:1;8854:15;9999:127;10060:10;10055:3;10051:20;10048:1;10041:31;10091:4;10088:1;10081:15;10115:4;10112:1;10105:15;10131:168;10204:9;;;10235;;10252:15;;;10246:22;;10232:37;10222:71;;10273:18;;:::i;10651:125::-;10716:9;;;10737:10;;;10734:36;;;10750:18;;:::i;10781:198::-;10823:3;10861:5;10855:12;10876:65;10934:6;10929:3;10922:4;10915:5;10911:16;10876:65;:::i;:::-;10957:16;;;;;10781:198;-1:-1:-1;;10781:198:1:o;10984:447::-;-1:-1:-1;;;11241:3:1;11234:30;11216:3;11293:6;11287:13;11309:75;11377:6;11372:2;11367:3;11363:12;11356:4;11348:6;11344:17;11309:75;:::i;:::-;11404:16;;;;11422:2;11400:25;;10984:447;-1:-1:-1;;10984:447:1:o;11562:545::-;11664:2;11659:3;11656:11;11653:448;;;11700:1;11725:5;11721:2;11714:17;11770:4;11766:2;11756:19;11840:2;11828:10;11824:19;11821:1;11817:27;11811:4;11807:38;11876:4;11864:10;11861:20;11858:47;;;-1:-1:-1;11899:4:1;11858:47;11954:2;11949:3;11945:12;11942:1;11938:20;11932:4;11928:31;11918:41;;12009:82;12027:2;12020:5;12017:13;12009:82;;;12072:17;;;12053:1;12042:13;12009:82;;;12013:3;;;11562:545;;;:::o;12283:1352::-;12409:3;12403:10;12436:18;12428:6;12425:30;12422:56;;;12458:18;;:::i;:::-;12487:97;12577:6;12537:38;12569:4;12563:11;12537:38;:::i;:::-;12531:4;12487:97;:::i;:::-;12639:4;;12703:2;12692:14;;12720:1;12715:663;;;;13422:1;13439:6;13436:89;;;-1:-1:-1;13491:19:1;;;13485:26;13436:89;-1:-1:-1;;12240:1:1;12236:11;;;12232:24;12228:29;12218:40;12264:1;12260:11;;;12215:57;13538:81;;12685:944;;12715:663;11509:1;11502:14;;;11546:4;11533:18;;-1:-1:-1;;12751:20:1;;;12869:236;12883:7;12880:1;12877:14;12869:236;;;12972:19;;;12966:26;12951:42;;13064:27;;;;13032:1;13020:14;;;;12899:19;;12869:236;;;12873:3;13133:6;13124:7;13121:19;13118:201;;;13194:19;;;13188:26;-1:-1:-1;;13277:1:1;13273:14;;;13289:3;13269:24;13265:37;13261:42;13246:58;13231:74;;13118:201;-1:-1:-1;;;;;13365:1:1;13349:14;;;13345:22;13332:36;;-1:-1:-1;12283:1352:1:o;13640:135::-;13679:3;13700:17;;;13697:43;;13720:18;;:::i;:::-;-1:-1:-1;13767:1:1;13756:13;;13640:135::o;14603:401::-;14805:2;14787:21;;;14844:2;14824:18;;;14817:30;14883:34;14878:2;14863:18;;14856:62;-1:-1:-1;;;14949:2:1;14934:18;;14927:35;14994:3;14979:19;;14603:401::o;15775:127::-;15836:10;15831:3;15827:20;15824:1;15817:31;15867:4;15864:1;15857:15;15891:4;15888:1;15881:15;16141:128;16208:9;;;16229:11;;;16226:37;;;16243:18;;:::i;16274:556::-;16517:6;16512:3;16505:19;16579:26;16575:31;16566:6;16562:2;16558:15;16554:53;16549:2;16544:3;16540:12;16533:75;16487:3;16637:6;16631:13;16653:73;16719:6;16714:2;16709:3;16705:12;16700:2;16692:6;16688:15;16653:73;:::i;:::-;16785:2;16745:16;;16777:11;;;16770:27;;;;16821:2;16813:11;;16274:556;-1:-1:-1;;;;16274:556:1:o;16835:112::-;16867:1;16893;16883:35;;16898:18;;:::i;:::-;-1:-1:-1;16932:9:1;;16835:112::o;17306:414::-;17508:2;17490:21;;;17547:2;17527:18;;;17520:30;17586:34;17581:2;17566:18;;17559:62;-1:-1:-1;;;17652:2:1;17637:18;;17630:48;17710:3;17695:19;;17306:414::o;17725:1545::-;-1:-1:-1;;;18475:43:1;;18541:13;;18457:3;;18563:74;18541:13;18626:1;18617:11;;18610:4;18598:17;;18563:74;:::i;:::-;-1:-1:-1;;;18696:1:1;18656:16;;;18688:10;;;18681:68;18774:13;;18796:76;18774:13;18858:2;18850:11;;18843:4;18831:17;;18796:76;:::i;:::-;-1:-1:-1;;;18932:2:1;18891:17;;;;18924:11;;;18917:59;19005:28;19000:2;18992:11;;18985:49;19059:13;;19081:76;19059:13;19143:2;19135:11;;19128:4;19116:17;;19081:76;:::i;:::-;-1:-1:-1;;;19217:2:1;19176:17;;;;19209:11;;;19202:35;19261:2;19253:11;;17725:1545;-1:-1:-1;;;;;17725:1545:1:o;19275:461::-;19537:31;19532:3;19525:44;19507:3;19598:6;19592:13;19614:75;19682:6;19677:2;19672:3;19668:12;19661:4;19653:6;19649:17;19614:75;:::i;:::-;19709:16;;;;19727:2;19705:25;;19275:461;-1:-1:-1;;19275:461:1:o;20163:500::-;-1:-1:-1;;;;;20432:15:1;;;20414:34;;20484:15;;20479:2;20464:18;;20457:43;20531:2;20516:18;;20509:34;;;20579:3;20574:2;20559:18;;20552:31;;;20357:4;;20600:57;;20637:19;;20629:6;20600:57;:::i;:::-;20592:65;20163:500;-1:-1:-1;;;;;;20163:500:1:o;20668:249::-;20737:6;20790:2;20778:9;20769:7;20765:23;20761:32;20758:52;;;20806:1;20803;20796:12;20758:52;20838:9;20832:16;20857:30;20881:5;20857:30;:::i;40518:5914::-;41987:66;41982:3;41975:79;42084:66;42079:2;42074:3;42070:12;42063:88;42181:66;42176:2;42171:3;42167:12;42160:88;42278:66;42273:2;42268:3;42264:12;42257:88;42376:66;42370:3;42365;42361:13;42354:89;42474:66;42468:3;42463;42459:13;42452:89;42581:28;42576:3;42572:38;42566:3;42561;42557:13;42550:61;41957:3;42640:6;42634:13;42656:74;42723:6;42717:3;42712;42708:13;42703:2;42695:6;42691:15;42656:74;:::i;:::-;42795:66;42789:3;42749:16;;;42781:12;;;42774:88;42892:34;42886:3;42878:12;;42871:56;42957:34;42951:3;42943:12;;42936:56;43022:34;43016:3;43008:12;;43001:56;43087:34;43081:3;43073:12;;43066:56;43152:34;43146:3;43138:12;;43131:56;43217:34;43211:3;43203:12;;43196:56;43282:34;43276:3;43268:12;;43261:56;43347:34;43341:3;43333:12;;43326:56;43412:34;43406:3;43398:12;;43391:56;43477:34;43471:3;43463:12;;43456:56;43542:34;43536:3;43528:12;;43521:56;43607:34;43601:3;43593:12;;43586:56;43672:34;43666:3;43658:12;;43651:56;43737:34;43731:3;43723:12;;43716:56;43802:34;43796:3;43788:12;;43781:56;43867:34;43861:3;43853:12;;43846:56;43932:34;43926:3;43918:12;;43911:56;43997:34;43991:3;43983:12;;43976:56;44062:34;44056:3;44048:12;;44041:56;44127:34;44121:3;44113:12;;44106:56;44192:34;44186:3;44178:12;;44171:56;44257:34;44251:3;44243:12;;44236:56;44322:34;44316:3;44308:12;;44301:56;44387:34;44381:3;44373:12;;44366:56;44452:34;44446:3;44438:12;;44431:56;44518:34;44511:4;44503:13;;44496:57;44584:34;44577:4;44569:13;;44562:57;44650:34;44643:4;44635:13;;44628:57;44716:34;44709:4;44701:13;;44694:57;44782:34;44775:4;44767:13;;44760:57;44848:34;44841:4;44833:13;;44826:57;44914:34;44907:4;44899:13;;44892:57;44980:34;44973:4;44965:13;;44958:57;45046:34;45039:4;45031:13;;45024:57;45112:34;45105:4;45097:13;;45090:57;45178:34;45171:4;45163:13;;45156:57;45244:34;45237:4;45229:13;;45222:57;45310:34;45303:4;45295:13;;45288:57;45376:34;45369:4;45361:13;;45354:57;45442:34;45435:4;45427:13;;45420:57;45508:34;45501:4;45493:13;;45486:57;45574:34;45567:4;45559:13;;45552:57;45640:34;45633:4;45625:13;;45618:57;45706:34;45699:4;45691:13;;45684:57;45772:34;45765:4;45757:13;;45750:57;45838:34;45831:4;45823:13;;45816:57;45904:34;45897:4;45889:13;;45882:57;45970:34;45963:4;45955:13;;45948:57;-1:-1:-1;;;46029:4:1;46021:13;;46014:55;46085:341;46115:310;46145:279;46171:252;46201:221;46231:190;46256:164;46286:133;46316:102;46342:75;46372:44;46410:4;46402:13;;21154:66;21142:79;;21251:34;21246:2;21237:12;;21230:56;21316:34;21311:2;21302:12;;21295:56;21381:34;21376:2;21367:12;;21360:56;21447:34;21441:3;21432:13;;21425:57;21513:34;21507:3;21498:13;;21491:57;21579:34;21573:3;21564:13;;21557:57;21645:34;21639:3;21630:13;;21623:57;21711:34;21705:3;21696:13;;21689:57;21777:34;21771:3;21762:13;;21755:57;21843:34;21837:3;21828:13;;21821:57;21909:34;21903:3;21894:13;;21887:57;21975:34;21969:3;21960:13;;21953:57;22041:34;22035:3;22026:13;;22019:57;22107:34;22101:3;22092:13;;22085:57;22173:34;22167:3;22158:13;;22151:57;22239:34;22233:3;22224:13;;22217:57;22305:34;22299:3;22290:13;;22283:57;22371:34;22365:3;22356:13;;22349:57;22437:34;22431:3;22422:13;;22415:57;22503:34;22497:3;22488:13;;22481:57;22569:34;22563:3;22554:13;;22547:57;22635:34;22629:3;22620:13;;22613:57;22701:34;22695:3;22686:13;;22679:57;22767:34;22761:3;22752:13;;22745:57;22833:34;22827:3;22818:13;;22811:57;22899:34;22893:3;22884:13;;22877:57;22965:34;22959:3;22950:13;;22943:57;23031:34;23025:3;23016:13;;23009:57;23097:34;23091:3;23082:13;;23075:57;23163:34;23157:3;23148:13;;23141:57;23229:66;23223:3;23214:13;;23207:89;23328:66;23321:4;23312:14;;23305:90;23427:34;23420:4;23411:14;;23404:58;23494:34;23487:4;23478:14;;23471:58;-1:-1:-1;;;23554:4:1;23545:14;;23538:70;23633:4;23624:14;;21077:2567;46372:44;-1:-1:-1;;;20987:51:1;;21063:2;21054:12;;20922:150;46342:75;46334:6;46316:102;:::i;:::-;23726:66;23714:79;;23823:34;23818:2;23809:12;;23802:56;23888:34;23883:2;23874:12;;23867:56;23953:34;23948:2;23939:12;;23932:56;24019:34;24013:3;24004:13;;23997:57;24085:34;24079:3;24070:13;;24063:57;24151:34;24145:3;24136:13;;24129:57;24217:34;24211:3;24202:13;;24195:57;24283:34;24277:3;24268:13;;24261:57;24349:34;24343:3;24334:13;;24327:57;24415:34;24409:3;24400:13;;24393:57;24481:34;24475:3;24466:13;;24459:57;24547:34;24541:3;24532:13;;24525:57;24613:34;24607:3;24598:13;;24591:57;24679:34;24673:3;24664:13;;24657:57;24745:34;24739:3;24730:13;;24723:57;24811:34;24805:3;24796:13;;24789:57;24877:34;24871:3;24862:13;;24855:57;24943:34;24937:3;24928:13;;24921:57;25009:34;25003:3;24994:13;;24987:57;25075:34;25069:3;25060:13;;25053:57;25141:34;25135:3;25126:13;;25119:57;25207:66;25201:3;25192:13;;25185:89;25305:66;25299:3;25290:13;;25283:89;25403:34;25397:3;25388:13;;25381:57;25469:34;25463:3;25454:13;;25447:57;25535:34;25529:3;25520:13;;25513:57;25601:34;25595:3;25586:13;;25579:57;25667:34;25661:3;25652:13;;25645:57;25733:34;25727:3;25718:13;;25711:57;25799:34;25793:3;25784:13;;25777:57;25865:34;25859:3;25850:13;;25843:57;25932:34;25925:4;25916:14;;25909:58;25999:34;25992:4;25983:14;;25976:58;26066:34;26059:4;26050:14;;26043:58;26133:34;26126:4;26117:14;;26110:58;26200:34;26193:4;26184:14;;26177:58;26267:34;26260:4;26251:14;;26244:58;26334:34;26327:4;26318:14;;26311:58;26401:34;26394:4;26385:14;;26378:58;26468:34;26461:4;26452:14;;26445:58;26535:34;26528:4;26519:14;;26512:58;26602:34;26595:4;26586:14;;26579:58;26669:34;26662:4;26653:14;;26646:58;26736:66;26729:4;26720:14;;26713:90;-1:-1:-1;;;26828:4:1;26819:14;;26812:31;26868:4;26859:14;;23649:3230;46286:133;-1:-1:-1;;;26949:61:1;;27035:2;27026:12;;26884:160;46256:164;27121:66;27109:79;;27218:34;27213:2;27204:12;;27197:56;27283:34;27278:2;27269:12;;27262:56;27348:34;27343:2;27334:12;;27327:56;27414:34;27408:3;27399:13;;27392:57;27480:34;27474:3;27465:13;;27458:57;27546:34;27540:3;27531:13;;27524:57;27612:34;27606:3;27597:13;;27590:57;27678:34;27672:3;27663:13;;27656:57;27744:34;27738:3;27729:13;;27722:57;27810:34;27804:3;27795:13;;27788:57;27876:34;27870:3;27861:13;;27854:57;27942:34;27936:3;27927:13;;27920:57;28008:34;28002:3;27993:13;;27986:57;28074:34;28068:3;28059:13;;28052:57;28140:34;28134:3;28125:13;;28118:57;28206:34;28200:3;28191:13;;28184:57;28272:34;28266:3;28257:13;;28250:57;28338:34;28332:3;28323:13;;28316:57;28404:34;28398:3;28389:13;;28382:57;28470:34;28464:3;28455:13;;28448:57;28536:34;28530:3;28521:13;;28514:57;28602:34;28596:3;28587:13;;28580:57;28668:34;28662:3;28653:13;;28646:57;28734:34;28728:3;28719:13;;28712:57;28800:34;28794:3;28785:13;;28778:57;28866:34;28860:3;28851:13;;28844:57;28932:34;28926:3;28917:13;;28910:57;28998:34;28992:3;28983:13;;28976:57;29064:34;29058:3;29049:13;;29042:57;29130:34;29124:3;29115:13;;29108:57;29196:34;29190:3;29181:13;;29174:57;29263:34;29256:4;29247:14;;29240:58;29330:34;29323:4;29314:14;;29307:58;29397:34;29390:4;29381:14;;29374:58;29464:34;29457:4;29448:14;;29441:58;29531:34;29524:4;29515:14;;29508:58;29598:34;29591:4;29582:14;;29575:58;29665:34;29658:4;29649:14;;29642:58;29732:34;29725:4;29716:14;;29709:58;29799:34;29792:4;29783:14;;29776:58;29866:34;29859:4;29850:14;;29843:58;29933:34;29926:4;29917:14;;29910:58;30000:34;29993:4;29984:14;;29977:58;30067:34;30060:4;30051:14;;30044:58;30134:34;30127:4;30118:14;;30111:58;30201:34;30194:4;30185:14;;30178:58;30268:34;30261:4;30252:14;;30245:58;30335:34;30328:4;30319:14;;30312:58;30402:34;30395:4;30386:14;;30379:58;30469:34;30462:4;30453:14;;30446:58;30536:34;30529:4;30520:14;;30513:58;30603:34;30596:4;30587:14;;30580:58;30670:34;30663:4;30654:14;;30647:58;30737:34;30730:4;30721:14;;30714:58;30804:34;30797:4;30788:14;;30781:58;30871:34;30864:4;30855:14;;30848:58;30938:34;30931:4;30922:14;;30915:58;31005:34;30998:4;30989:14;;30982:58;31072:34;31065:4;31056:14;;31049:58;31139:34;31132:4;31123:14;;31116:58;31206:34;31199:4;31190:14;;31183:58;31273:34;31266:4;31257:14;;31250:58;31340:34;31333:4;31324:14;;31317:58;31407:34;31400:4;31391:14;;31384:58;31474:34;31467:4;31458:14;;31451:58;31541:34;31534:4;31525:14;;31518:58;31608:34;31601:4;31592:14;;31585:58;31675:34;31668:4;31659:14;;31652:58;31742:34;31735:4;31726:14;;31719:58;31809:34;31802:4;31793:14;;31786:58;31876:34;31869:4;31860:14;;31853:58;31943:34;31936:4;31927:14;;31920:58;32010:34;32003:4;31994:14;;31987:58;32077:34;32070:4;32061:14;;32054:58;32144:34;32137:4;32128:14;;32121:58;32211:34;32204:4;32195:14;;32188:58;32278:34;32271:4;32262:14;;32255:58;32345:34;32338:4;32329:14;;32322:58;32412:34;32405:4;32396:14;;32389:58;32479:34;32472:4;32463:14;;32456:58;32546:34;32539:4;32530:14;;32523:58;32613:34;32606:4;32597:14;;32590:58;32680:34;32673:4;32664:14;;32657:58;32747:34;32740:4;32731:14;;32724:58;32814:34;32807:4;32798:14;;32791:58;32881:34;32874:4;32865:14;;32858:58;32948:34;32941:4;32932:14;;32925:58;33015:34;33008:4;32999:14;;32992:58;33082:34;33075:4;33066:14;;33059:58;-1:-1:-1;;;33142:4:1;33133:14;;33126:54;33205:4;33196:14;;27049:6167;46231:190;33298:66;33286:79;;33395:34;33390:2;33381:12;;33374:56;33460:34;33455:2;33446:12;;33439:56;33525:34;33520:2;33511:12;;33504:56;33591:34;33585:3;33576:13;;33569:57;33657:34;33651:3;33642:13;;33635:57;33723:34;33717:3;33708:13;;33701:57;33789:34;33783:3;33774:13;;33767:57;33855:34;33849:3;33840:13;;33833:57;33921:34;33915:3;33906:13;;33899:57;33987:34;33981:3;33972:13;;33965:57;34053:34;34047:3;34038:13;;34031:57;34119:34;34113:3;34104:13;;34097:57;34185:34;34179:3;34170:13;;34163:57;34251:34;34245:3;34236:13;;34229:57;34317:34;34311:3;34302:13;;34295:57;34383:34;34377:3;34368:13;;34361:57;34449:34;34443:3;34434:13;;34427:57;34515:34;34509:3;34500:13;;34493:57;34581:34;34575:3;34566:13;;34559:57;34647:34;34641:3;34632:13;;34625:57;34713:34;34707:3;34698:13;;34691:57;34779:34;34773:3;34764:13;;34757:57;34845:66;34839:3;34830:13;;34823:89;34943:34;34937:3;34928:13;;34921:57;35009:34;35003:3;34994:13;;34987:57;35075:34;35069:3;35060:13;;35053:57;35141:34;35135:3;35126:13;;35119:57;35207:34;35201:3;35192:13;;35185:57;35273:34;35267:3;35258:13;;35251:57;35339:34;35333:3;35324:13;;35317:57;35405:34;35399:3;35390:13;;35383:57;35472:34;35465:4;35456:14;;35449:58;35539:34;35532:4;35523:14;;35516:58;35606:66;35599:4;35590:14;;35583:90;35705:34;35698:4;35689:14;;35682:58;35772:34;35765:4;35756:14;;35749:58;35839:34;35832:4;35823:14;;35816:58;35906:34;35899:4;35890:14;;35883:58;35973:34;35966:4;35957:14;;35950:58;36040:34;36033:4;36024:14;;36017:58;36107:34;36100:4;36091:14;;36084:58;36174:34;36167:4;36158:14;;36151:58;36241:34;36234:4;36225:14;;36218:58;36308:34;36301:4;36292:14;;36285:58;36375:34;36368:4;36359:14;;36352:58;36442:34;36435:4;36426:14;;36419:58;36509:34;36502:4;36493:14;;36486:58;36576:34;36569:4;36560:14;;36553:58;36643:34;36636:4;36627:14;;36620:58;36710:34;36703:4;36694:14;;36687:58;36777:34;36770:4;36761:14;;36754:58;36844:34;36837:4;36828:14;;36821:58;36911:34;36904:4;36895:14;;36888:58;36978:34;36971:4;36962:14;;36955:58;37045:66;37038:4;37029:14;;37022:90;37144:34;37137:4;37128:14;;37121:58;37211:34;37204:4;37195:14;;37188:58;37278:34;37271:4;37262:14;;37255:58;37345:34;37338:4;37329:14;;37322:58;37412:34;37405:4;37396:14;;37389:58;37479:34;37472:4;37463:14;;37456:58;37546:34;37539:4;37530:14;;37523:58;37613:34;37606:4;37597:14;;37590:58;37680:34;37673:4;37664:14;;37657:58;37747:34;37740:4;37731:14;;37724:58;37814:66;37807:4;37798:14;;37791:90;37906:4;37897:14;;33221:4696;46201:221;-1:-1:-1;;;37987:59:1;;38071:2;38062:12;;37922:158;46171:252;46163:6;46145:279;:::i;:::-;38162:66;38150:79;;38259:34;38254:2;38245:12;;38238:56;38324:34;38319:2;38310:12;;38303:56;38389:34;38384:2;38375:12;;38368:56;38455:34;38449:3;38440:13;;38433:57;38521:34;38515:3;38506:13;;38499:57;38587:34;38581:3;38572:13;;38565:57;38653:34;38647:3;38638:13;;38631:57;38719:34;38713:3;38704:13;;38697:57;38785:34;38779:3;38770:13;;38763:57;38851:34;38845:3;38836:13;;38829:57;38917:34;38911:3;38902:13;;38895:57;38983:34;38977:3;38968:13;;38961:57;39049:34;39043:3;39034:13;;39027:57;39115:34;39109:3;39100:13;;39093:57;39181:34;39175:3;39166:13;;39159:57;39247:34;39241:3;39232:13;;39225:57;39313:34;39307:3;39298:13;;39291:57;39379:66;39373:3;39364:13;;39357:89;39477:66;39471:3;39462:13;;39455:89;39575:34;39569:3;39560:13;;39553:57;39641:34;39635:3;39626:13;;39619:57;39707:34;39701:3;39692:13;;39685:57;39773:34;39767:3;39758:13;;39751:57;39839:34;39833:3;39824:13;;39817:57;39905:34;39899:3;39890:13;;39883:57;39971:34;39965:3;39956:13;;39949:57;40037:34;40031:3;40022:13;;40015:57;40103:34;40097:3;40088:13;;40081:57;40169:34;40163:3;40154:13;;40147:57;40235:34;40229:3;40220:13;;40213:57;-1:-1:-1;;;40295:3:1;40286:13;;40279:74;40378:4;40369:14;;38085:2304;46115:310;-1:-1:-1;;;40459:21:1;;40505:1;40496:11;;40394:119;46437:120;46477:1;46503;46493:35;;46508:18;;:::i;:::-;-1:-1:-1;46542:9:1;;46437:120::o;46562:127::-;46623:10;46618:3;46614:20;46611:1;46604:31;46654:4;46651:1;46644:15;46678:4;46675:1;46668:15

Swarm Source

ipfs://2267571787e8c73abcebf8cd34c3bb5dc1ea1d78d50f90a33e6425cd959a0e5f
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.