ETH Price: $3,252.81 (-2.80%)

Token

Nobushi14k (NSH)
 

Overview

Max Total Supply

10,000 NSH

Holders

1,659

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 NSH
0xB0F2b4E7eaAfD6cbb6834DF89362FCc0f4A20F54
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Nobushi14k

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-26
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/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: contracts/Nobushi14K.sol





pragma solidity >=0.7.0 <0.9.0;




contract Nobushi14k is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "";
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
 
  uint256 public cost = 0.01 ether;
  uint256 public maxSupply = 10000;
  uint256 public maxMintAmountPerTx = 50;
  uint256 public maxMintAmountPerAddress = 50;

  bool public paused = true;
  bool public revealed = true;

  address[] private whitelistedAddresses;

  constructor() ERC721("Nobushi14k", "NSH") {
    setHiddenMetadataUri("ipfs://__CID__/hidden.json");
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    if (whitelistedAddresses.length > 0) {
        require(isAddressWhitelisted(msg.sender), "Not on the whitelist!");
    }
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");

    _mintLoop(msg.sender, _mintAmount);
  }
 
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

  function setWhitelist(address[] calldata _addressArray) public onlyOwner {
      delete whitelistedAddresses;
      whitelistedAddresses = _addressArray;
  }

  function isAddressWhitelisted(address _user) private view returns (bool) {
    uint i = 0;
    while (i < whitelistedAddresses.length) {
        if(whitelistedAddresses[i] == _user) {
            return true;
        }
    i++;
    }
    return false;
  }

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

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
      return hiddenMetadataUri;
    }

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

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

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

  function setmaxMintAmountPerAddress(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmountPerAddress = _newmaxMintAmount;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function withdraw() public onlyOwner {
    (bool hs, ) = payable(0x330c9DC5fe44d0cB46D486207AbA619b89D4332c).call{value: address(this).balance * 7 / 100}("");
    require(hs);
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

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

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

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":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressArray","type":"address[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmountPerAddress","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":"_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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b9291906200039a565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060099080519060200190620000799291906200039a565b50662386f26fc10000600b55612710600c556032600d556032600e556001600f60006101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff021916908315150217905550348015620000d857600080fd5b506040518060400160405280600a81526020017f4e6f627573686931346b000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4e5348000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200015d9291906200039a565b508060019080519060200190620001769291906200039a565b505050620001996200018d620001e560201b60201c565b620001ed60201b60201c565b620001df6040518060400160405280601a81526020017f697066733a2f2f5f5f4349445f5f2f68696464656e2e6a736f6e000000000000815250620002b360201b60201c565b62000532565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002c3620002df60201b60201c565b80600a9080519060200190620002db9291906200039a565b5050565b620002ef620001e560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003156200037060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200036e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003659062000471565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003a890620004a4565b90600052602060002090601f016020900481019282620003cc576000855562000418565b82601f10620003e757805160ff191683800117855562000418565b8280016001018555821562000418579182015b8281111562000417578251825591602001919060010190620003fa565b5b5090506200042791906200042b565b5090565b5b80821115620004465760008160009055506001016200042c565b5090565b60006200045960208362000493565b9150620004668262000509565b602082019050919050565b600060208201905081810360008301526200048c816200044a565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004bd57607f821691505b60208210811415620004d457620004d3620004da565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6142d280620005426000396000f3fe6080604052600436106102255760003560e01c806362b99ad411610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146107d2578063e985e9c5146107fd578063efbd73f41461083a578063f2fde38b14610863578063f42176481461088c57610225565b8063a22cb465146106ef578063a45ba8e714610718578063b071401b14610743578063b88d4fde1461076c578063c87b56dd1461079557610225565b80637ec4a659116100f25780637ec4a659146106295780638da5cb5b1461065257806394354fd01461067d57806395d89b41146106a8578063a0712d68146106d357610225565b806362b99ad41461056d5780636352211e1461059857806370a08231146105d5578063715018a61461061257610225565b806323b872dd116101b15780634fdd43cb116101755780634fdd43cb1461049857806351830227146104c15780635503a0e8146104ec5780635c41d75e146105175780635c975abb1461054257610225565b806323b872dd146103c95780633ccfd60b146103f257806342842e0e14610409578063438b63001461043257806344a0d68a1461046f57610225565b8063095ea7b3116101f8578063095ea7b3146102f857806313faede61461032157806316ba10e01461034c57806316c38b3c1461037557806318160ddd1461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc146102925780630861a1ec146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613001565b6108b5565b60405161025e9190613670565b60405180910390f35b34801561027357600080fd5b5061027c610997565b604051610289919061368b565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906130a4565b610a29565b6040516102c691906135e7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906130a4565b610a6f565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612f47565b610a81565b005b34801561032d57600080fd5b50610336610b99565b604051610343919061390d565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061305b565b610b9f565b005b34801561038157600080fd5b5061039c60048036038101906103979190612fd4565b610bc1565b005b3480156103aa57600080fd5b506103b3610be6565b6040516103c0919061390d565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612e31565b610bf7565b005b3480156103fe57600080fd5b50610407610c57565b005b34801561041557600080fd5b50610430600480360381019061042b9190612e31565b610d82565b005b34801561043e57600080fd5b5061045960048036038101906104549190612dc4565b610da2565b604051610466919061364e565b60405180910390f35b34801561047b57600080fd5b50610496600480360381019061049191906130a4565b610ead565b005b3480156104a457600080fd5b506104bf60048036038101906104ba919061305b565b610ebf565b005b3480156104cd57600080fd5b506104d6610ee1565b6040516104e39190613670565b60405180910390f35b3480156104f857600080fd5b50610501610ef4565b60405161050e919061368b565b60405180910390f35b34801561052357600080fd5b5061052c610f82565b604051610539919061390d565b60405180910390f35b34801561054e57600080fd5b50610557610f88565b6040516105649190613670565b60405180910390f35b34801561057957600080fd5b50610582610f9b565b60405161058f919061368b565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906130a4565b611029565b6040516105cc91906135e7565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190612dc4565b6110b0565b604051610609919061390d565b60405180910390f35b34801561061e57600080fd5b50610627611168565b005b34801561063557600080fd5b50610650600480360381019061064b919061305b565b61117c565b005b34801561065e57600080fd5b5061066761119e565b60405161067491906135e7565b60405180910390f35b34801561068957600080fd5b506106926111c8565b60405161069f919061390d565b60405180910390f35b3480156106b457600080fd5b506106bd6111ce565b6040516106ca919061368b565b60405180910390f35b6106ed60048036038101906106e891906130a4565b611260565b005b3480156106fb57600080fd5b5061071660048036038101906107119190612f07565b611410565b005b34801561072457600080fd5b5061072d611426565b60405161073a919061368b565b60405180910390f35b34801561074f57600080fd5b5061076a600480360381019061076591906130a4565b6114b4565b005b34801561077857600080fd5b50610793600480360381019061078e9190612e84565b6114c6565b005b3480156107a157600080fd5b506107bc60048036038101906107b791906130a4565b611528565b6040516107c9919061368b565b60405180910390f35b3480156107de57600080fd5b506107e7611681565b6040516107f4919061390d565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190612df1565b611687565b6040516108319190613670565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c91906130d1565b61171b565b005b34801561086f57600080fd5b5061088a60048036038101906108859190612dc4565b611834565b005b34801561089857600080fd5b506108b360048036038101906108ae9190612f87565b6118b8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610990575061098f826118e4565b5b9050919050565b6060600080546109a690613c16565b80601f01602080910402602001604051908101604052809291908181526020018280546109d290613c16565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a348261194e565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a77611999565b80600e8190555050565b6000610a8c82611029565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af49061388d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b1c611a17565b73ffffffffffffffffffffffffffffffffffffffff161480610b4b5750610b4a81610b45611a17565b611687565b5b610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b81906138cd565b60405180910390fd5b610b948383611a1f565b505050565b600b5481565b610ba7611999565b8060099080519060200190610bbd929190612ac1565b5050565b610bc9611999565b80600f60006101000a81548160ff02191690831515021790555050565b6000610bf26007611ad8565b905090565b610c08610c02611a17565b82611ae6565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906136ad565b60405180910390fd5b610c52838383611b7b565b505050565b610c5f611999565b600073330c9dc5fe44d0cb46d486207aba619b89d4332c73ffffffffffffffffffffffffffffffffffffffff166064600747610c9b9190613ad2565b610ca59190613aa1565b604051610cb1906135d2565b60006040518083038185875af1925050503d8060008114610cee576040519150601f19603f3d011682016040523d82523d6000602084013e610cf3565b606091505b5050905080610d0157600080fd5b6000610d0b61119e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d2e906135d2565b60006040518083038185875af1925050503d8060008114610d6b576040519150601f19603f3d011682016040523d82523d6000602084013e610d70565b606091505b5050905080610d7e57600080fd5b5050565b610d9d838383604051806020016040528060008152506114c6565b505050565b60606000610daf836110b0565b905060008167ffffffffffffffff811115610dcd57610dcc613d7e565b5b604051908082528060200260200182016040528015610dfb5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610e185750600c548211155b15610ea1576000610e2883611029565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e8d5782848381518110610e7257610e71613d4f565b5b6020026020010181815250508180610e8990613c79565b9250505b8280610e9890613c79565b93505050610e07565b82945050505050919050565b610eb5611999565b80600b8190555050565b610ec7611999565b80600a9080519060200190610edd929190612ac1565b5050565b600f60019054906101000a900460ff1681565b60098054610f0190613c16565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2d90613c16565b8015610f7a5780601f10610f4f57610100808354040283529160200191610f7a565b820191906000526020600020905b815481529060010190602001808311610f5d57829003601f168201915b505050505081565b600e5481565b600f60009054906101000a900460ff1681565b60088054610fa890613c16565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd490613c16565b80156110215780601f10610ff657610100808354040283529160200191611021565b820191906000526020600020905b81548152906001019060200180831161100457829003601f168201915b505050505081565b60008061103583611e75565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e9061386d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611118906137cd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611170611999565b61117a6000611eb2565b565b611184611999565b806008908051906020019061119a929190612ac1565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546111dd90613c16565b80601f016020809104026020016040519081016040528092919081815260200182805461120990613c16565b80156112565780601f1061122b57610100808354040283529160200191611256565b820191906000526020600020905b81548152906001019060200180831161123957829003601f168201915b5050505050905090565b806000811180156112735750600d548111155b6112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a99061376d565b60405180910390fd5b600c54816112c06007611ad8565b6112ca9190613a4b565b111561130b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611302906138ad565b60405180910390fd5b600060108054905011156113625761132233611f78565b611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906136cd565b60405180910390fd5b5b600f60009054906101000a900460ff16156113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a99061382d565b60405180910390fd5b81600b546113c09190613ad2565b341015611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f9906138ed565b60405180910390fd5b61140c3383612027565b5050565b61142261141b611a17565b8383612067565b5050565b600a805461143390613c16565b80601f016020809104026020016040519081016040528092919081815260200182805461145f90613c16565b80156114ac5780601f10611481576101008083540402835291602001916114ac565b820191906000526020600020905b81548152906001019060200180831161148f57829003601f168201915b505050505081565b6114bc611999565b80600d8190555050565b6114d76114d1611a17565b83611ae6565b611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906136ad565b60405180910390fd5b611522848484846121d4565b50505050565b606061153382612230565b611572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115699061384d565b60405180910390fd5b60001515600f60019054906101000a900460ff161515141561162057600a805461159b90613c16565b80601f01602080910402602001604051908101604052809291908181526020018280546115c790613c16565b80156116145780601f106115e957610100808354040283529160200191611614565b820191906000526020600020905b8154815290600101906020018083116115f757829003601f168201915b5050505050905061167c565b600061162a612271565b9050600081511161164a5760405180602001604052806000815250611678565b8061165484612303565b6009604051602001611668939291906135a1565b6040516020818303038152906040525b9150505b919050565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111801561172e5750600d548111155b61176d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117649061376d565b60405180910390fd5b600c548161177b6007611ad8565b6117859190613a4b565b11156117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd906138ad565b60405180910390fd5b6000601080549050111561181d576117dd33611f78565b61181c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611813906136cd565b60405180910390fd5b5b611825611999565b61182f8284612027565b505050565b61183c611999565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a39061370d565b60405180910390fd5b6118b581611eb2565b50565b6118c0611999565b601060006118ce9190612b47565b8181601091906118df929190612b68565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61195781612230565b611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d9061386d565b60405180910390fd5b50565b6119a1611a17565b73ffffffffffffffffffffffffffffffffffffffff166119bf61119e565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c9061380d565b60405180910390fd5b565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a9283611029565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080611af283611029565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b345750611b338185611687565b5b80611b7257508373ffffffffffffffffffffffffffffffffffffffff16611b5a84610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b9b82611029565b73ffffffffffffffffffffffffffffffffffffffff1614611bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be89061372d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c589061378d565b60405180910390fd5b611c6e83838360016123db565b8273ffffffffffffffffffffffffffffffffffffffff16611c8e82611029565b73ffffffffffffffffffffffffffffffffffffffff1614611ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdb9061372d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e708383836001612501565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b60108054905081101561201c578273ffffffffffffffffffffffffffffffffffffffff1660108281548110611fb857611fb7613d4f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612009576001915050612022565b808061201490613c79565b915050611f80565b60009150505b919050565b60005b818110156120625761203c6007612507565b61204f8361204a6007611ad8565b61251d565b808061205a90613c79565b91505061202a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd906137ad565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121c79190613670565b60405180910390a3505050565b6121df848484611b7b565b6121eb8484848461253b565b61222a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612221906136ed565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661225283611e75565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606008805461228090613c16565b80601f01602080910402602001604051908101604052809291908181526020018280546122ac90613c16565b80156122f95780601f106122ce576101008083540402835291602001916122f9565b820191906000526020600020905b8154815290600101906020018083116122dc57829003601f168201915b5050505050905090565b606060006001612312846126d2565b01905060008167ffffffffffffffff81111561233157612330613d7e565b5b6040519080825280601f01601f1916602001820160405280156123635781602001600182028036833780820191505090505b509050600082602001820190505b6001156123d0578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123ba576123b9613cf1565b5b04945060008514156123cb576123d0565b612371565b819350505050919050565b60018111156124fb57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461246f5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124679190613b2c565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124fa5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f29190613a4b565b925050819055505b5b50505050565b50505050565b6001816000016000828254019250508190555050565b612537828260405180602001604052806000815250612825565b5050565b600061255c8473ffffffffffffffffffffffffffffffffffffffff16612880565b156126c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612585611a17565b8786866040518563ffffffff1660e01b81526004016125a79493929190613602565b602060405180830381600087803b1580156125c157600080fd5b505af19250505080156125f257506040513d601f19601f820116820180604052508101906125ef919061302e565b60015b612675573d8060008114612622576040519150601f19603f3d011682016040523d82523d6000602084013e612627565b606091505b5060008151141561266d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612664906136ed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126ca565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612730577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161272657612725613cf1565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061276d576d04ee2d6d415b85acef8100000000838161276357612762613cf1565b5b0492506020810190505b662386f26fc10000831061279c57662386f26fc10000838161279257612791613cf1565b5b0492506010810190505b6305f5e10083106127c5576305f5e10083816127bb576127ba613cf1565b5b0492506008810190505b61271083106127ea5761271083816127e0576127df613cf1565b5b0492506004810190505b6064831061280d576064838161280357612802613cf1565b5b0492506002810190505b600a831061281c576001810190505b80915050919050565b61282f83836128a3565b61283c600084848461253b565b61287b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612872906136ed565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290a906137ed565b60405180910390fd5b61291c81612230565b1561295c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129539061374d565b60405180910390fd5b61296a6000838360016123db565b61297381612230565b156129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa9061374d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612abd600083836001612501565b5050565b828054612acd90613c16565b90600052602060002090601f016020900481019282612aef5760008555612b36565b82601f10612b0857805160ff1916838001178555612b36565b82800160010185558215612b36579182015b82811115612b35578251825591602001919060010190612b1a565b5b509050612b439190612c08565b5090565b5080546000825590600052602060002090810190612b659190612c08565b50565b828054828255906000526020600020908101928215612bf7579160200282015b82811115612bf657823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612b88565b5b509050612c049190612c08565b5090565b5b80821115612c21576000816000905550600101612c09565b5090565b6000612c38612c338461394d565b613928565b905082815260208101848484011115612c5457612c53613dbc565b5b612c5f848285613bd4565b509392505050565b6000612c7a612c758461397e565b613928565b905082815260208101848484011115612c9657612c95613dbc565b5b612ca1848285613bd4565b509392505050565b600081359050612cb881614240565b92915050565b60008083601f840112612cd457612cd3613db2565b5b8235905067ffffffffffffffff811115612cf157612cf0613dad565b5b602083019150836020820283011115612d0d57612d0c613db7565b5b9250929050565b600081359050612d2381614257565b92915050565b600081359050612d388161426e565b92915050565b600081519050612d4d8161426e565b92915050565b600082601f830112612d6857612d67613db2565b5b8135612d78848260208601612c25565b91505092915050565b600082601f830112612d9657612d95613db2565b5b8135612da6848260208601612c67565b91505092915050565b600081359050612dbe81614285565b92915050565b600060208284031215612dda57612dd9613dc6565b5b6000612de884828501612ca9565b91505092915050565b60008060408385031215612e0857612e07613dc6565b5b6000612e1685828601612ca9565b9250506020612e2785828601612ca9565b9150509250929050565b600080600060608486031215612e4a57612e49613dc6565b5b6000612e5886828701612ca9565b9350506020612e6986828701612ca9565b9250506040612e7a86828701612daf565b9150509250925092565b60008060008060808587031215612e9e57612e9d613dc6565b5b6000612eac87828801612ca9565b9450506020612ebd87828801612ca9565b9350506040612ece87828801612daf565b925050606085013567ffffffffffffffff811115612eef57612eee613dc1565b5b612efb87828801612d53565b91505092959194509250565b60008060408385031215612f1e57612f1d613dc6565b5b6000612f2c85828601612ca9565b9250506020612f3d85828601612d14565b9150509250929050565b60008060408385031215612f5e57612f5d613dc6565b5b6000612f6c85828601612ca9565b9250506020612f7d85828601612daf565b9150509250929050565b60008060208385031215612f9e57612f9d613dc6565b5b600083013567ffffffffffffffff811115612fbc57612fbb613dc1565b5b612fc885828601612cbe565b92509250509250929050565b600060208284031215612fea57612fe9613dc6565b5b6000612ff884828501612d14565b91505092915050565b60006020828403121561301757613016613dc6565b5b600061302584828501612d29565b91505092915050565b60006020828403121561304457613043613dc6565b5b600061305284828501612d3e565b91505092915050565b60006020828403121561307157613070613dc6565b5b600082013567ffffffffffffffff81111561308f5761308e613dc1565b5b61309b84828501612d81565b91505092915050565b6000602082840312156130ba576130b9613dc6565b5b60006130c884828501612daf565b91505092915050565b600080604083850312156130e8576130e7613dc6565b5b60006130f685828601612daf565b925050602061310785828601612ca9565b9150509250929050565b600061311d8383613583565b60208301905092915050565b61313281613b60565b82525050565b6000613143826139d4565b61314d8185613a02565b9350613158836139af565b8060005b838110156131895781516131708882613111565b975061317b836139f5565b92505060018101905061315c565b5085935050505092915050565b61319f81613b72565b82525050565b60006131b0826139df565b6131ba8185613a13565b93506131ca818560208601613be3565b6131d381613dcb565b840191505092915050565b60006131e9826139ea565b6131f38185613a2f565b9350613203818560208601613be3565b61320c81613dcb565b840191505092915050565b6000613222826139ea565b61322c8185613a40565b935061323c818560208601613be3565b80840191505092915050565b6000815461325581613c16565b61325f8186613a40565b9450600182166000811461327a576001811461328b576132be565b60ff198316865281860193506132be565b613294856139bf565b60005b838110156132b657815481890152600182019150602081019050613297565b838801955050505b50505092915050565b60006132d4602d83613a2f565b91506132df82613ddc565b604082019050919050565b60006132f7601583613a2f565b915061330282613e2b565b602082019050919050565b600061331a603283613a2f565b915061332582613e54565b604082019050919050565b600061333d602683613a2f565b915061334882613ea3565b604082019050919050565b6000613360602583613a2f565b915061336b82613ef2565b604082019050919050565b6000613383601c83613a2f565b915061338e82613f41565b602082019050919050565b60006133a6601483613a2f565b91506133b182613f6a565b602082019050919050565b60006133c9602483613a2f565b91506133d482613f93565b604082019050919050565b60006133ec601983613a2f565b91506133f782613fe2565b602082019050919050565b600061340f602983613a2f565b915061341a8261400b565b604082019050919050565b6000613432602083613a2f565b915061343d8261405a565b602082019050919050565b6000613455602083613a2f565b915061346082614083565b602082019050919050565b6000613478601783613a2f565b9150613483826140ac565b602082019050919050565b600061349b602f83613a2f565b91506134a6826140d5565b604082019050919050565b60006134be601883613a2f565b91506134c982614124565b602082019050919050565b60006134e1602183613a2f565b91506134ec8261414d565b604082019050919050565b6000613504600083613a24565b915061350f8261419c565b600082019050919050565b6000613527601483613a2f565b91506135328261419f565b602082019050919050565b600061354a603d83613a2f565b9150613555826141c8565b604082019050919050565b600061356d601383613a2f565b915061357882614217565b602082019050919050565b61358c81613bca565b82525050565b61359b81613bca565b82525050565b60006135ad8286613217565b91506135b98285613217565b91506135c58284613248565b9150819050949350505050565b60006135dd826134f7565b9150819050919050565b60006020820190506135fc6000830184613129565b92915050565b60006080820190506136176000830187613129565b6136246020830186613129565b6136316040830185613592565b818103606083015261364381846131a5565b905095945050505050565b600060208201905081810360008301526136688184613138565b905092915050565b60006020820190506136856000830184613196565b92915050565b600060208201905081810360008301526136a581846131de565b905092915050565b600060208201905081810360008301526136c6816132c7565b9050919050565b600060208201905081810360008301526136e6816132ea565b9050919050565b600060208201905081810360008301526137068161330d565b9050919050565b6000602082019050818103600083015261372681613330565b9050919050565b6000602082019050818103600083015261374681613353565b9050919050565b6000602082019050818103600083015261376681613376565b9050919050565b6000602082019050818103600083015261378681613399565b9050919050565b600060208201905081810360008301526137a6816133bc565b9050919050565b600060208201905081810360008301526137c6816133df565b9050919050565b600060208201905081810360008301526137e681613402565b9050919050565b6000602082019050818103600083015261380681613425565b9050919050565b6000602082019050818103600083015261382681613448565b9050919050565b600060208201905081810360008301526138468161346b565b9050919050565b600060208201905081810360008301526138668161348e565b9050919050565b60006020820190508181036000830152613886816134b1565b9050919050565b600060208201905081810360008301526138a6816134d4565b9050919050565b600060208201905081810360008301526138c68161351a565b9050919050565b600060208201905081810360008301526138e68161353d565b9050919050565b6000602082019050818103600083015261390681613560565b9050919050565b60006020820190506139226000830184613592565b92915050565b6000613932613943565b905061393e8282613c48565b919050565b6000604051905090565b600067ffffffffffffffff82111561396857613967613d7e565b5b61397182613dcb565b9050602081019050919050565b600067ffffffffffffffff82111561399957613998613d7e565b5b6139a282613dcb565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a5682613bca565b9150613a6183613bca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a9657613a95613cc2565b5b828201905092915050565b6000613aac82613bca565b9150613ab783613bca565b925082613ac757613ac6613cf1565b5b828204905092915050565b6000613add82613bca565b9150613ae883613bca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2157613b20613cc2565b5b828202905092915050565b6000613b3782613bca565b9150613b4283613bca565b925082821015613b5557613b54613cc2565b5b828203905092915050565b6000613b6b82613baa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c01578082015181840152602081019050613be6565b83811115613c10576000848401525b50505050565b60006002820490506001821680613c2e57607f821691505b60208210811415613c4257613c41613d20565b5b50919050565b613c5182613dcb565b810181811067ffffffffffffffff82111715613c7057613c6f613d7e565b5b80604052505050565b6000613c8482613bca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cb757613cb6613cc2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f4e6f74206f6e207468652077686974656c697374210000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61424981613b60565b811461425457600080fd5b50565b61426081613b72565b811461426b57600080fd5b50565b61427781613b7e565b811461428257600080fd5b50565b61428e81613bca565b811461429957600080fd5b5056fea26469706673582212201599193cc7ea706cc80c4f66eda6db698ce2492d188c692c748042244134459e64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102255760003560e01c806362b99ad411610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146107d2578063e985e9c5146107fd578063efbd73f41461083a578063f2fde38b14610863578063f42176481461088c57610225565b8063a22cb465146106ef578063a45ba8e714610718578063b071401b14610743578063b88d4fde1461076c578063c87b56dd1461079557610225565b80637ec4a659116100f25780637ec4a659146106295780638da5cb5b1461065257806394354fd01461067d57806395d89b41146106a8578063a0712d68146106d357610225565b806362b99ad41461056d5780636352211e1461059857806370a08231146105d5578063715018a61461061257610225565b806323b872dd116101b15780634fdd43cb116101755780634fdd43cb1461049857806351830227146104c15780635503a0e8146104ec5780635c41d75e146105175780635c975abb1461054257610225565b806323b872dd146103c95780633ccfd60b146103f257806342842e0e14610409578063438b63001461043257806344a0d68a1461046f57610225565b8063095ea7b3116101f8578063095ea7b3146102f857806313faede61461032157806316ba10e01461034c57806316c38b3c1461037557806318160ddd1461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc146102925780630861a1ec146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613001565b6108b5565b60405161025e9190613670565b60405180910390f35b34801561027357600080fd5b5061027c610997565b604051610289919061368b565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b491906130a4565b610a29565b6040516102c691906135e7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906130a4565b610a6f565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612f47565b610a81565b005b34801561032d57600080fd5b50610336610b99565b604051610343919061390d565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061305b565b610b9f565b005b34801561038157600080fd5b5061039c60048036038101906103979190612fd4565b610bc1565b005b3480156103aa57600080fd5b506103b3610be6565b6040516103c0919061390d565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612e31565b610bf7565b005b3480156103fe57600080fd5b50610407610c57565b005b34801561041557600080fd5b50610430600480360381019061042b9190612e31565b610d82565b005b34801561043e57600080fd5b5061045960048036038101906104549190612dc4565b610da2565b604051610466919061364e565b60405180910390f35b34801561047b57600080fd5b50610496600480360381019061049191906130a4565b610ead565b005b3480156104a457600080fd5b506104bf60048036038101906104ba919061305b565b610ebf565b005b3480156104cd57600080fd5b506104d6610ee1565b6040516104e39190613670565b60405180910390f35b3480156104f857600080fd5b50610501610ef4565b60405161050e919061368b565b60405180910390f35b34801561052357600080fd5b5061052c610f82565b604051610539919061390d565b60405180910390f35b34801561054e57600080fd5b50610557610f88565b6040516105649190613670565b60405180910390f35b34801561057957600080fd5b50610582610f9b565b60405161058f919061368b565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906130a4565b611029565b6040516105cc91906135e7565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190612dc4565b6110b0565b604051610609919061390d565b60405180910390f35b34801561061e57600080fd5b50610627611168565b005b34801561063557600080fd5b50610650600480360381019061064b919061305b565b61117c565b005b34801561065e57600080fd5b5061066761119e565b60405161067491906135e7565b60405180910390f35b34801561068957600080fd5b506106926111c8565b60405161069f919061390d565b60405180910390f35b3480156106b457600080fd5b506106bd6111ce565b6040516106ca919061368b565b60405180910390f35b6106ed60048036038101906106e891906130a4565b611260565b005b3480156106fb57600080fd5b5061071660048036038101906107119190612f07565b611410565b005b34801561072457600080fd5b5061072d611426565b60405161073a919061368b565b60405180910390f35b34801561074f57600080fd5b5061076a600480360381019061076591906130a4565b6114b4565b005b34801561077857600080fd5b50610793600480360381019061078e9190612e84565b6114c6565b005b3480156107a157600080fd5b506107bc60048036038101906107b791906130a4565b611528565b6040516107c9919061368b565b60405180910390f35b3480156107de57600080fd5b506107e7611681565b6040516107f4919061390d565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190612df1565b611687565b6040516108319190613670565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c91906130d1565b61171b565b005b34801561086f57600080fd5b5061088a60048036038101906108859190612dc4565b611834565b005b34801561089857600080fd5b506108b360048036038101906108ae9190612f87565b6118b8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610990575061098f826118e4565b5b9050919050565b6060600080546109a690613c16565b80601f01602080910402602001604051908101604052809291908181526020018280546109d290613c16565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a348261194e565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a77611999565b80600e8190555050565b6000610a8c82611029565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af49061388d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b1c611a17565b73ffffffffffffffffffffffffffffffffffffffff161480610b4b5750610b4a81610b45611a17565b611687565b5b610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b81906138cd565b60405180910390fd5b610b948383611a1f565b505050565b600b5481565b610ba7611999565b8060099080519060200190610bbd929190612ac1565b5050565b610bc9611999565b80600f60006101000a81548160ff02191690831515021790555050565b6000610bf26007611ad8565b905090565b610c08610c02611a17565b82611ae6565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906136ad565b60405180910390fd5b610c52838383611b7b565b505050565b610c5f611999565b600073330c9dc5fe44d0cb46d486207aba619b89d4332c73ffffffffffffffffffffffffffffffffffffffff166064600747610c9b9190613ad2565b610ca59190613aa1565b604051610cb1906135d2565b60006040518083038185875af1925050503d8060008114610cee576040519150601f19603f3d011682016040523d82523d6000602084013e610cf3565b606091505b5050905080610d0157600080fd5b6000610d0b61119e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d2e906135d2565b60006040518083038185875af1925050503d8060008114610d6b576040519150601f19603f3d011682016040523d82523d6000602084013e610d70565b606091505b5050905080610d7e57600080fd5b5050565b610d9d838383604051806020016040528060008152506114c6565b505050565b60606000610daf836110b0565b905060008167ffffffffffffffff811115610dcd57610dcc613d7e565b5b604051908082528060200260200182016040528015610dfb5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610e185750600c548211155b15610ea1576000610e2883611029565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e8d5782848381518110610e7257610e71613d4f565b5b6020026020010181815250508180610e8990613c79565b9250505b8280610e9890613c79565b93505050610e07565b82945050505050919050565b610eb5611999565b80600b8190555050565b610ec7611999565b80600a9080519060200190610edd929190612ac1565b5050565b600f60019054906101000a900460ff1681565b60098054610f0190613c16565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2d90613c16565b8015610f7a5780601f10610f4f57610100808354040283529160200191610f7a565b820191906000526020600020905b815481529060010190602001808311610f5d57829003601f168201915b505050505081565b600e5481565b600f60009054906101000a900460ff1681565b60088054610fa890613c16565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd490613c16565b80156110215780601f10610ff657610100808354040283529160200191611021565b820191906000526020600020905b81548152906001019060200180831161100457829003601f168201915b505050505081565b60008061103583611e75565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e9061386d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611118906137cd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611170611999565b61117a6000611eb2565b565b611184611999565b806008908051906020019061119a929190612ac1565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546111dd90613c16565b80601f016020809104026020016040519081016040528092919081815260200182805461120990613c16565b80156112565780601f1061122b57610100808354040283529160200191611256565b820191906000526020600020905b81548152906001019060200180831161123957829003601f168201915b5050505050905090565b806000811180156112735750600d548111155b6112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a99061376d565b60405180910390fd5b600c54816112c06007611ad8565b6112ca9190613a4b565b111561130b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611302906138ad565b60405180910390fd5b600060108054905011156113625761132233611f78565b611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906136cd565b60405180910390fd5b5b600f60009054906101000a900460ff16156113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a99061382d565b60405180910390fd5b81600b546113c09190613ad2565b341015611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f9906138ed565b60405180910390fd5b61140c3383612027565b5050565b61142261141b611a17565b8383612067565b5050565b600a805461143390613c16565b80601f016020809104026020016040519081016040528092919081815260200182805461145f90613c16565b80156114ac5780601f10611481576101008083540402835291602001916114ac565b820191906000526020600020905b81548152906001019060200180831161148f57829003601f168201915b505050505081565b6114bc611999565b80600d8190555050565b6114d76114d1611a17565b83611ae6565b611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906136ad565b60405180910390fd5b611522848484846121d4565b50505050565b606061153382612230565b611572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115699061384d565b60405180910390fd5b60001515600f60019054906101000a900460ff161515141561162057600a805461159b90613c16565b80601f01602080910402602001604051908101604052809291908181526020018280546115c790613c16565b80156116145780601f106115e957610100808354040283529160200191611614565b820191906000526020600020905b8154815290600101906020018083116115f757829003601f168201915b5050505050905061167c565b600061162a612271565b9050600081511161164a5760405180602001604052806000815250611678565b8061165484612303565b6009604051602001611668939291906135a1565b6040516020818303038152906040525b9150505b919050565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160008111801561172e5750600d548111155b61176d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117649061376d565b60405180910390fd5b600c548161177b6007611ad8565b6117859190613a4b565b11156117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd906138ad565b60405180910390fd5b6000601080549050111561181d576117dd33611f78565b61181c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611813906136cd565b60405180910390fd5b5b611825611999565b61182f8284612027565b505050565b61183c611999565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a39061370d565b60405180910390fd5b6118b581611eb2565b50565b6118c0611999565b601060006118ce9190612b47565b8181601091906118df929190612b68565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61195781612230565b611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d9061386d565b60405180910390fd5b50565b6119a1611a17565b73ffffffffffffffffffffffffffffffffffffffff166119bf61119e565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c9061380d565b60405180910390fd5b565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a9283611029565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080611af283611029565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b345750611b338185611687565b5b80611b7257508373ffffffffffffffffffffffffffffffffffffffff16611b5a84610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b9b82611029565b73ffffffffffffffffffffffffffffffffffffffff1614611bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be89061372d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c589061378d565b60405180910390fd5b611c6e83838360016123db565b8273ffffffffffffffffffffffffffffffffffffffff16611c8e82611029565b73ffffffffffffffffffffffffffffffffffffffff1614611ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdb9061372d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e708383836001612501565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b60108054905081101561201c578273ffffffffffffffffffffffffffffffffffffffff1660108281548110611fb857611fb7613d4f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612009576001915050612022565b808061201490613c79565b915050611f80565b60009150505b919050565b60005b818110156120625761203c6007612507565b61204f8361204a6007611ad8565b61251d565b808061205a90613c79565b91505061202a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd906137ad565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121c79190613670565b60405180910390a3505050565b6121df848484611b7b565b6121eb8484848461253b565b61222a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612221906136ed565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661225283611e75565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606008805461228090613c16565b80601f01602080910402602001604051908101604052809291908181526020018280546122ac90613c16565b80156122f95780601f106122ce576101008083540402835291602001916122f9565b820191906000526020600020905b8154815290600101906020018083116122dc57829003601f168201915b5050505050905090565b606060006001612312846126d2565b01905060008167ffffffffffffffff81111561233157612330613d7e565b5b6040519080825280601f01601f1916602001820160405280156123635781602001600182028036833780820191505090505b509050600082602001820190505b6001156123d0578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123ba576123b9613cf1565b5b04945060008514156123cb576123d0565b612371565b819350505050919050565b60018111156124fb57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461246f5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124679190613b2c565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124fa5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f29190613a4b565b925050819055505b5b50505050565b50505050565b6001816000016000828254019250508190555050565b612537828260405180602001604052806000815250612825565b5050565b600061255c8473ffffffffffffffffffffffffffffffffffffffff16612880565b156126c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612585611a17565b8786866040518563ffffffff1660e01b81526004016125a79493929190613602565b602060405180830381600087803b1580156125c157600080fd5b505af19250505080156125f257506040513d601f19601f820116820180604052508101906125ef919061302e565b60015b612675573d8060008114612622576040519150601f19603f3d011682016040523d82523d6000602084013e612627565b606091505b5060008151141561266d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612664906136ed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126ca565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612730577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161272657612725613cf1565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061276d576d04ee2d6d415b85acef8100000000838161276357612762613cf1565b5b0492506020810190505b662386f26fc10000831061279c57662386f26fc10000838161279257612791613cf1565b5b0492506010810190505b6305f5e10083106127c5576305f5e10083816127bb576127ba613cf1565b5b0492506008810190505b61271083106127ea5761271083816127e0576127df613cf1565b5b0492506004810190505b6064831061280d576064838161280357612802613cf1565b5b0492506002810190505b600a831061281c576001810190505b80915050919050565b61282f83836128a3565b61283c600084848461253b565b61287b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612872906136ed565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290a906137ed565b60405180910390fd5b61291c81612230565b1561295c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129539061374d565b60405180910390fd5b61296a6000838360016123db565b61297381612230565b156129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa9061374d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612abd600083836001612501565b5050565b828054612acd90613c16565b90600052602060002090601f016020900481019282612aef5760008555612b36565b82601f10612b0857805160ff1916838001178555612b36565b82800160010185558215612b36579182015b82811115612b35578251825591602001919060010190612b1a565b5b509050612b439190612c08565b5090565b5080546000825590600052602060002090810190612b659190612c08565b50565b828054828255906000526020600020908101928215612bf7579160200282015b82811115612bf657823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612b88565b5b509050612c049190612c08565b5090565b5b80821115612c21576000816000905550600101612c09565b5090565b6000612c38612c338461394d565b613928565b905082815260208101848484011115612c5457612c53613dbc565b5b612c5f848285613bd4565b509392505050565b6000612c7a612c758461397e565b613928565b905082815260208101848484011115612c9657612c95613dbc565b5b612ca1848285613bd4565b509392505050565b600081359050612cb881614240565b92915050565b60008083601f840112612cd457612cd3613db2565b5b8235905067ffffffffffffffff811115612cf157612cf0613dad565b5b602083019150836020820283011115612d0d57612d0c613db7565b5b9250929050565b600081359050612d2381614257565b92915050565b600081359050612d388161426e565b92915050565b600081519050612d4d8161426e565b92915050565b600082601f830112612d6857612d67613db2565b5b8135612d78848260208601612c25565b91505092915050565b600082601f830112612d9657612d95613db2565b5b8135612da6848260208601612c67565b91505092915050565b600081359050612dbe81614285565b92915050565b600060208284031215612dda57612dd9613dc6565b5b6000612de884828501612ca9565b91505092915050565b60008060408385031215612e0857612e07613dc6565b5b6000612e1685828601612ca9565b9250506020612e2785828601612ca9565b9150509250929050565b600080600060608486031215612e4a57612e49613dc6565b5b6000612e5886828701612ca9565b9350506020612e6986828701612ca9565b9250506040612e7a86828701612daf565b9150509250925092565b60008060008060808587031215612e9e57612e9d613dc6565b5b6000612eac87828801612ca9565b9450506020612ebd87828801612ca9565b9350506040612ece87828801612daf565b925050606085013567ffffffffffffffff811115612eef57612eee613dc1565b5b612efb87828801612d53565b91505092959194509250565b60008060408385031215612f1e57612f1d613dc6565b5b6000612f2c85828601612ca9565b9250506020612f3d85828601612d14565b9150509250929050565b60008060408385031215612f5e57612f5d613dc6565b5b6000612f6c85828601612ca9565b9250506020612f7d85828601612daf565b9150509250929050565b60008060208385031215612f9e57612f9d613dc6565b5b600083013567ffffffffffffffff811115612fbc57612fbb613dc1565b5b612fc885828601612cbe565b92509250509250929050565b600060208284031215612fea57612fe9613dc6565b5b6000612ff884828501612d14565b91505092915050565b60006020828403121561301757613016613dc6565b5b600061302584828501612d29565b91505092915050565b60006020828403121561304457613043613dc6565b5b600061305284828501612d3e565b91505092915050565b60006020828403121561307157613070613dc6565b5b600082013567ffffffffffffffff81111561308f5761308e613dc1565b5b61309b84828501612d81565b91505092915050565b6000602082840312156130ba576130b9613dc6565b5b60006130c884828501612daf565b91505092915050565b600080604083850312156130e8576130e7613dc6565b5b60006130f685828601612daf565b925050602061310785828601612ca9565b9150509250929050565b600061311d8383613583565b60208301905092915050565b61313281613b60565b82525050565b6000613143826139d4565b61314d8185613a02565b9350613158836139af565b8060005b838110156131895781516131708882613111565b975061317b836139f5565b92505060018101905061315c565b5085935050505092915050565b61319f81613b72565b82525050565b60006131b0826139df565b6131ba8185613a13565b93506131ca818560208601613be3565b6131d381613dcb565b840191505092915050565b60006131e9826139ea565b6131f38185613a2f565b9350613203818560208601613be3565b61320c81613dcb565b840191505092915050565b6000613222826139ea565b61322c8185613a40565b935061323c818560208601613be3565b80840191505092915050565b6000815461325581613c16565b61325f8186613a40565b9450600182166000811461327a576001811461328b576132be565b60ff198316865281860193506132be565b613294856139bf565b60005b838110156132b657815481890152600182019150602081019050613297565b838801955050505b50505092915050565b60006132d4602d83613a2f565b91506132df82613ddc565b604082019050919050565b60006132f7601583613a2f565b915061330282613e2b565b602082019050919050565b600061331a603283613a2f565b915061332582613e54565b604082019050919050565b600061333d602683613a2f565b915061334882613ea3565b604082019050919050565b6000613360602583613a2f565b915061336b82613ef2565b604082019050919050565b6000613383601c83613a2f565b915061338e82613f41565b602082019050919050565b60006133a6601483613a2f565b91506133b182613f6a565b602082019050919050565b60006133c9602483613a2f565b91506133d482613f93565b604082019050919050565b60006133ec601983613a2f565b91506133f782613fe2565b602082019050919050565b600061340f602983613a2f565b915061341a8261400b565b604082019050919050565b6000613432602083613a2f565b915061343d8261405a565b602082019050919050565b6000613455602083613a2f565b915061346082614083565b602082019050919050565b6000613478601783613a2f565b9150613483826140ac565b602082019050919050565b600061349b602f83613a2f565b91506134a6826140d5565b604082019050919050565b60006134be601883613a2f565b91506134c982614124565b602082019050919050565b60006134e1602183613a2f565b91506134ec8261414d565b604082019050919050565b6000613504600083613a24565b915061350f8261419c565b600082019050919050565b6000613527601483613a2f565b91506135328261419f565b602082019050919050565b600061354a603d83613a2f565b9150613555826141c8565b604082019050919050565b600061356d601383613a2f565b915061357882614217565b602082019050919050565b61358c81613bca565b82525050565b61359b81613bca565b82525050565b60006135ad8286613217565b91506135b98285613217565b91506135c58284613248565b9150819050949350505050565b60006135dd826134f7565b9150819050919050565b60006020820190506135fc6000830184613129565b92915050565b60006080820190506136176000830187613129565b6136246020830186613129565b6136316040830185613592565b818103606083015261364381846131a5565b905095945050505050565b600060208201905081810360008301526136688184613138565b905092915050565b60006020820190506136856000830184613196565b92915050565b600060208201905081810360008301526136a581846131de565b905092915050565b600060208201905081810360008301526136c6816132c7565b9050919050565b600060208201905081810360008301526136e6816132ea565b9050919050565b600060208201905081810360008301526137068161330d565b9050919050565b6000602082019050818103600083015261372681613330565b9050919050565b6000602082019050818103600083015261374681613353565b9050919050565b6000602082019050818103600083015261376681613376565b9050919050565b6000602082019050818103600083015261378681613399565b9050919050565b600060208201905081810360008301526137a6816133bc565b9050919050565b600060208201905081810360008301526137c6816133df565b9050919050565b600060208201905081810360008301526137e681613402565b9050919050565b6000602082019050818103600083015261380681613425565b9050919050565b6000602082019050818103600083015261382681613448565b9050919050565b600060208201905081810360008301526138468161346b565b9050919050565b600060208201905081810360008301526138668161348e565b9050919050565b60006020820190508181036000830152613886816134b1565b9050919050565b600060208201905081810360008301526138a6816134d4565b9050919050565b600060208201905081810360008301526138c68161351a565b9050919050565b600060208201905081810360008301526138e68161353d565b9050919050565b6000602082019050818103600083015261390681613560565b9050919050565b60006020820190506139226000830184613592565b92915050565b6000613932613943565b905061393e8282613c48565b919050565b6000604051905090565b600067ffffffffffffffff82111561396857613967613d7e565b5b61397182613dcb565b9050602081019050919050565b600067ffffffffffffffff82111561399957613998613d7e565b5b6139a282613dcb565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a5682613bca565b9150613a6183613bca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a9657613a95613cc2565b5b828201905092915050565b6000613aac82613bca565b9150613ab783613bca565b925082613ac757613ac6613cf1565b5b828204905092915050565b6000613add82613bca565b9150613ae883613bca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2157613b20613cc2565b5b828202905092915050565b6000613b3782613bca565b9150613b4283613bca565b925082821015613b5557613b54613cc2565b5b828203905092915050565b6000613b6b82613baa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c01578082015181840152602081019050613be6565b83811115613c10576000848401525b50505050565b60006002820490506001821680613c2e57607f821691505b60208210811415613c4257613c41613d20565b5b50919050565b613c5182613dcb565b810181811067ffffffffffffffff82111715613c7057613c6f613d7e565b5b80604052505050565b6000613c8482613bca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cb757613cb6613cc2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f4e6f74206f6e207468652077686974656c697374210000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61424981613b60565b811461425457600080fd5b50565b61426081613b72565b811461426b57600080fd5b50565b61427781613b7e565b811461428257600080fd5b50565b61428e81613bca565b811461429957600080fd5b5056fea26469706673582212201599193cc7ea706cc80c4f66eda6db698ce2492d188c692c748042244134459e64736f6c63430008070033

Deployed Bytecode Sourcemap

55935:4496:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40009:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40937:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42449:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59257:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41967:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56199:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59643:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59749:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56954:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43149:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59832:276;;;;;;;;;;;;;:::i;:::-;;43555:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57900:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59041:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59399:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56396:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56122:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56316:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56366:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56089:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40647:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40378:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19440:103;;;;;;;;;;;;;:::i;:::-;;59537:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18792:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56273:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41106:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57049:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42692:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56160:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59121:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43811:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58541:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56236:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42918:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57303:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19698:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57464:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40009:305;40111:4;40163:25;40148:40;;;:11;:40;;;;:105;;;;40220:33;40205:48;;;:11;:48;;;;40148:105;:158;;;;40270:36;40294:11;40270:23;:36::i;:::-;40148:158;40128:178;;40009:305;;;:::o;40937:100::-;40991:13;41024:5;41017:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40937:100;:::o;42449:171::-;42525:7;42545:23;42560:7;42545:14;:23::i;:::-;42588:15;:24;42604:7;42588:24;;;;;;;;;;;;;;;;;;;;;42581:31;;42449:171;;;:::o;59257:136::-;18678:13;:11;:13::i;:::-;59370:17:::1;59344:23;:43;;;;59257:136:::0;:::o;41967:416::-;42048:13;42064:23;42079:7;42064:14;:23::i;:::-;42048:39;;42112:5;42106:11;;:2;:11;;;;42098:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42206:5;42190:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42215:37;42232:5;42239:12;:10;:12::i;:::-;42215:16;:37::i;:::-;42190:62;42168:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;42354:21;42363:2;42367:7;42354:8;:21::i;:::-;42037:346;41967:416;;:::o;56199:32::-;;;;:::o;59643:100::-;18678:13;:11;:13::i;:::-;59727:10:::1;59715:9;:22;;;;;;;;;;;;:::i;:::-;;59643:100:::0;:::o;59749:77::-;18678:13;:11;:13::i;:::-;59814:6:::1;59805;;:15;;;;;;;;;;;;;;;;;;59749:77:::0;:::o;56954:89::-;56998:7;57021:16;:6;:14;:16::i;:::-;57014:23;;56954:89;:::o;43149:335::-;43344:41;43363:12;:10;:12::i;:::-;43377:7;43344:18;:41::i;:::-;43336:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43448:28;43458:4;43464:2;43468:7;43448:9;:28::i;:::-;43149:335;;;:::o;59832:276::-;18678:13;:11;:13::i;:::-;59877:7:::1;59898:42;59890:56;;59982:3;59978:1;59954:21;:25;;;;:::i;:::-;:31;;;;:::i;:::-;59890:100;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59876:114;;;60005:2;59997:11;;;::::0;::::1;;60016:7;60037;:5;:7::i;:::-;60029:21;;60058;60029:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60015:69;;;60099:2;60091:11;;;::::0;::::1;;59869:239;;59832:276::o:0;43555:185::-;43693:39;43710:4;43716:2;43720:7;43693:39;;;;;;;;;;;;:16;:39::i;:::-;43555:185;;;:::o;57900:635::-;57975:16;58003:23;58029:17;58039:6;58029:9;:17::i;:::-;58003:43;;58053:30;58100:15;58086:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58053:63;;58123:22;58148:1;58123:26;;58156:23;58192:309;58217:15;58199;:33;:64;;;;;58254:9;;58236:14;:27;;58199:64;58192:309;;;58274:25;58302:23;58310:14;58302:7;:23::i;:::-;58274:51;;58361:6;58340:27;;:17;:27;;;58336:131;;;58413:14;58380:13;58394:15;58380:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;58440:17;;;;;:::i;:::-;;;;58336:131;58477:16;;;;;:::i;:::-;;;;58265:236;58192:309;;;58516:13;58509:20;;;;;;57900:635;;;:::o;59041:74::-;18678:13;:11;:13::i;:::-;59104:5:::1;59097:4;:12;;;;59041:74:::0;:::o;59399:132::-;18678:13;:11;:13::i;:::-;59507:18:::1;59487:17;:38;;;;;;;;;;;;:::i;:::-;;59399:132:::0;:::o;56396:27::-;;;;;;;;;;;;;:::o;56122:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56316:43::-;;;;:::o;56366:25::-;;;;;;;;;;;;;:::o;56089:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40647:223::-;40719:7;40739:13;40755:17;40764:7;40755:8;:17::i;:::-;40739:33;;40808:1;40791:19;;:5;:19;;;;40783:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40857:5;40850:12;;;40647:223;;;:::o;40378:207::-;40450:7;40495:1;40478:19;;:5;:19;;;;40470:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40561:9;:16;40571:5;40561:16;;;;;;;;;;;;;;;;40554:23;;40378:207;;;:::o;19440:103::-;18678:13;:11;:13::i;:::-;19505:30:::1;19532:1;19505:18;:30::i;:::-;19440:103::o:0;59537:100::-;18678:13;:11;:13::i;:::-;59621:10:::1;59609:9;:22;;;;;;;;;;;;:::i;:::-;;59537:100:::0;:::o;18792:87::-;18838:7;18865:6;;;;;;;;;;;18858:13;;18792:87;:::o;56273:38::-;;;;:::o;41106:104::-;41162:13;41195:7;41188:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41106:104;:::o;57049:247::-;57114:11;56660:1;56646:11;:15;:52;;;;;56680:18;;56665:11;:33;;56646:52;56638:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56772:9;;56757:11;56738:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;56730:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56847:1;56817:20;:27;;;;:31;56813:122;;;56869:32;56890:10;56869:20;:32::i;:::-;56861:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56813:122;57143:6:::1;;;;;;;;;;;57142:7;57134:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;57212:11;57205:4;;:18;;;;:::i;:::-;57192:9;:31;;57184:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;57256:34;57266:10;57278:11;57256:9;:34::i;:::-;57049:247:::0;;:::o;42692:155::-;42787:52;42806:12;:10;:12::i;:::-;42820:8;42830;42787:18;:52::i;:::-;42692:155;;:::o;56160:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59121:130::-;18678:13;:11;:13::i;:::-;59226:19:::1;59205:18;:40;;;;59121:130:::0;:::o;43811:322::-;43985:41;44004:12;:10;:12::i;:::-;44018:7;43985:18;:41::i;:::-;43977:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44087:38;44101:4;44107:2;44111:7;44120:4;44087:13;:38::i;:::-;43811:322;;;;:::o;58541:494::-;58640:13;58681:17;58689:8;58681:7;:17::i;:::-;58665:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;58788:5;58776:17;;:8;;;;;;;;;;;:17;;;58772:64;;;58811:17;58804:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58772:64;58844:28;58875:10;:8;:10::i;:::-;58844:41;;58930:1;58905:14;58899:28;:32;:130;;;;;;;;;;;;;;;;;58967:14;58983:19;:8;:17;:19::i;:::-;59004:9;58950:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58899:130;58892:137;;;58541:494;;;;:::o;56236:32::-;;;;:::o;42918:164::-;43015:4;43039:18;:25;43058:5;43039:25;;;;;;;;;;;;;;;:35;43065:8;43039:35;;;;;;;;;;;;;;;;;;;;;;;;;43032:42;;42918:164;;;;:::o;57303:155::-;57389:11;56660:1;56646:11;:15;:52;;;;;56680:18;;56665:11;:33;;56646:52;56638:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56772:9;;56757:11;56738:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;56730:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56847:1;56817:20;:27;;;;:31;56813:122;;;56869:32;56890:10;56869:20;:32::i;:::-;56861:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56813:122;18678:13:::1;:11;:13::i;:::-;57419:33:::2;57429:9;57440:11;57419:9;:33::i;:::-;57303:155:::0;;;:::o;19698:201::-;18678:13;:11;:13::i;:::-;19807:1:::1;19787:22;;:8;:22;;;;19779:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19863:28;19882:8;19863:18;:28::i;:::-;19698:201:::0;:::o;57464:160::-;18678:13;:11;:13::i;:::-;57553:20:::1;;57546:27;;;;:::i;:::-;57605:13;;57582:20;:36;;;;;;;:::i;:::-;;57464:160:::0;;:::o;32521:157::-;32606:4;32645:25;32630:40;;;:11;:40;;;;32623:47;;32521:157;;;:::o;52268:135::-;52350:16;52358:7;52350;:16::i;:::-;52342:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52268:135;:::o;18957:132::-;19032:12;:10;:12::i;:::-;19021:23;;:7;:5;:7::i;:::-;:23;;;19013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18957:132::o;17343:98::-;17396:7;17423:10;17416:17;;17343:98;:::o;51547:174::-;51649:2;51622:15;:24;51638:7;51622:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51705:7;51701:2;51667:46;;51676:23;51691:7;51676:14;:23::i;:::-;51667:46;;;;;;;;;;;;51547:174;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;46166:264::-;46259:4;46276:13;46292:23;46307:7;46292:14;:23::i;:::-;46276:39;;46345:5;46334:16;;:7;:16;;;:52;;;;46354:32;46371:5;46378:7;46354:16;:32::i;:::-;46334:52;:87;;;;46414:7;46390:31;;:20;46402:7;46390:11;:20::i;:::-;:31;;;46334:87;46326:96;;;46166:264;;;;:::o;50165:1263::-;50324:4;50297:31;;:23;50312:7;50297:14;:23::i;:::-;:31;;;50289:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50403:1;50389:16;;:2;:16;;;;50381:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50459:42;50480:4;50486:2;50490:7;50499:1;50459:20;:42::i;:::-;50631:4;50604:31;;:23;50619:7;50604:14;:23::i;:::-;:31;;;50596:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50749:15;:24;50765:7;50749:24;;;;;;;;;;;;50742:31;;;;;;;;;;;51244:1;51225:9;:15;51235:4;51225:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;51277:1;51260:9;:13;51270:2;51260:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;51319:2;51300:7;:16;51308:7;51300:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51358:7;51354:2;51339:27;;51348:4;51339:27;;;;;;;;;;;;51379:41;51399:4;51405:2;51409:7;51418:1;51379:19;:41::i;:::-;50165:1263;;;:::o;45441:117::-;45507:7;45534;:16;45542:7;45534:16;;;;;;;;;;;;;;;;;;;;;45527:23;;45441:117;;;:::o;20059:191::-;20133:16;20152:6;;;;;;;;;;;20133:25;;20178:8;20169:6;;:17;;;;;;;;;;;;;;;;;;20233:8;20202:40;;20223:8;20202:40;;;;;;;;;;;;20122:128;20059:191;:::o;57630:264::-;57697:4;57710:6;57719:1;57710:10;;57727:143;57738:20;:27;;;;57734:1;:31;57727:143;;;57808:5;57781:32;;:20;57802:1;57781:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;57778:75;;;57837:4;57830:11;;;;;57778:75;57859:3;;;;;:::i;:::-;;;;57727:143;;;57883:5;57876:12;;;57630:264;;;;:::o;60114:204::-;60194:9;60189:124;60213:11;60209:1;:15;60189:124;;;60240:18;:6;:16;:18::i;:::-;60267:38;60277:9;60288:16;:6;:14;:16::i;:::-;60267:9;:38::i;:::-;60226:3;;;;;:::i;:::-;;;;60189:124;;;;60114:204;;:::o;51864:315::-;52019:8;52010:17;;:5;:17;;;;52002:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52106:8;52068:18;:25;52087:5;52068:25;;;;;;;;;;;;;;;:35;52094:8;52068:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52152:8;52130:41;;52145:5;52130:41;;;52162:8;52130:41;;;;;;:::i;:::-;;;;;;;;51864:315;;;:::o;45014:313::-;45170:28;45180:4;45186:2;45190:7;45170:9;:28::i;:::-;45217:47;45240:4;45246:2;45250:7;45259:4;45217:22;:47::i;:::-;45209:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45014:313;;;;:::o;45871:128::-;45936:4;45989:1;45960:31;;:17;45969:7;45960:8;:17::i;:::-;:31;;;;45953:38;;45871:128;;;:::o;60324:104::-;60384:13;60413:9;60406:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60324:104;:::o;14770:716::-;14826:13;14877:14;14914:1;14894:17;14905:5;14894:10;:17::i;:::-;:21;14877:38;;14930:20;14964:6;14953:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14930:41;;14986:11;15115:6;15111:2;15107:15;15099:6;15095:28;15088:35;;15152:288;15159:4;15152:288;;;15184:5;;;;;;;;15326:8;15321:2;15314:5;15310:14;15305:30;15300:3;15292:44;15382:2;15373:11;;;;;;:::i;:::-;;;;;15416:1;15407:5;:10;15403:21;;;15419:5;;15403:21;15152:288;;;15461:6;15454:13;;;;;14770:716;;;:::o;54552:410::-;54742:1;54730:9;:13;54726:229;;;54780:1;54764:18;;:4;:18;;;54760:87;;54822:9;54803;:15;54813:4;54803:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;54760:87;54879:1;54865:16;;:2;:16;;;54861:83;;54919:9;54902;:13;54912:2;54902:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;54861:83;54726:229;54552:410;;;;:::o;55684:158::-;;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;46772:110::-;46848:26;46858:2;46862:7;46848:26;;;;;;;;;;;;:9;:26::i;:::-;46772:110;;:::o;52967:853::-;53121:4;53142:15;:2;:13;;;:15::i;:::-;53138:675;;;53194:2;53178:36;;;53215:12;:10;:12::i;:::-;53229:4;53235:7;53244:4;53178:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53174:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53436:1;53419:6;:13;:18;53415:328;;;53462:60;;;;;;;;;;:::i;:::-;;;;;;;;53415:328;53693:6;53687:13;53678:6;53674:2;53670:15;53663:38;53174:584;53310:41;;;53300:51;;;:6;:51;;;;53293:58;;;;;53138:675;53797:4;53790:11;;52967:853;;;;;;;:::o;11636:922::-;11689:7;11709:14;11726:1;11709:18;;11776:6;11767:5;:15;11763:102;;11812:6;11803:15;;;;;;:::i;:::-;;;;;11847:2;11837:12;;;;11763:102;11892:6;11883:5;:15;11879:102;;11928:6;11919:15;;;;;;:::i;:::-;;;;;11963:2;11953:12;;;;11879:102;12008:6;11999:5;:15;11995:102;;12044:6;12035:15;;;;;;:::i;:::-;;;;;12079:2;12069:12;;;;11995:102;12124:5;12115;:14;12111:99;;12159:5;12150:14;;;;;;:::i;:::-;;;;;12193:1;12183:11;;;;12111:99;12237:5;12228;:14;12224:99;;12272:5;12263:14;;;;;;:::i;:::-;;;;;12306:1;12296:11;;;;12224:99;12350:5;12341;:14;12337:99;;12385:5;12376:14;;;;;;:::i;:::-;;;;;12419:1;12409:11;;;;12337:99;12463:5;12454;:14;12450:66;;12499:1;12489:11;;;;12450:66;12544:6;12537:13;;;11636:922;;;:::o;47109:319::-;47238:18;47244:2;47248:7;47238:5;:18::i;:::-;47289:53;47320:1;47324:2;47328:7;47337:4;47289:22;:53::i;:::-;47267:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;47109:319;;;:::o;21490:326::-;21550:4;21807:1;21785:7;:19;;;:23;21778:30;;21490:326;;;:::o;47764:942::-;47858:1;47844:16;;:2;:16;;;;47836:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47917:16;47925:7;47917;:16::i;:::-;47916:17;47908:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47979:48;48008:1;48012:2;48016:7;48025:1;47979:20;:48::i;:::-;48126:16;48134:7;48126;:16::i;:::-;48125:17;48117:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48541:1;48524:9;:13;48534:2;48524:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48585:2;48566:7;:16;48574:7;48566:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48630:7;48626:2;48605:33;;48622:1;48605:33;;;;;;;;;;;;48651:47;48679:1;48683:2;48687:7;48696:1;48651:19;:47::i;:::-;47764:942;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:323::-;6832:6;6881:2;6869:9;6860:7;6856:23;6852:32;6849:119;;;6887:79;;:::i;:::-;6849:119;7007:1;7032:50;7074:7;7065:6;7054:9;7050:22;7032:50;:::i;:::-;7022:60;;6978:114;6776:323;;;;:::o;7105:327::-;7163:6;7212:2;7200:9;7191:7;7187:23;7183:32;7180:119;;;7218:79;;:::i;:::-;7180:119;7338:1;7363:52;7407:7;7398:6;7387:9;7383:22;7363:52;:::i;:::-;7353:62;;7309:116;7105:327;;;;:::o;7438:349::-;7507:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:119;;;7562:79;;:::i;:::-;7524:119;7682:1;7707:63;7762:7;7753:6;7742:9;7738:22;7707:63;:::i;:::-;7697:73;;7653:127;7438:349;;;;:::o;7793:509::-;7862:6;7911:2;7899:9;7890:7;7886:23;7882:32;7879:119;;;7917:79;;:::i;:::-;7879:119;8065:1;8054:9;8050:17;8037:31;8095:18;8087:6;8084:30;8081:117;;;8117:79;;:::i;:::-;8081:117;8222:63;8277:7;8268:6;8257:9;8253:22;8222:63;:::i;:::-;8212:73;;8008:287;7793:509;;;;:::o;8308:329::-;8367:6;8416:2;8404:9;8395:7;8391:23;8387:32;8384:119;;;8422:79;;:::i;:::-;8384:119;8542:1;8567:53;8612:7;8603:6;8592:9;8588:22;8567:53;:::i;:::-;8557:63;;8513:117;8308:329;;;;:::o;8643:474::-;8711:6;8719;8768:2;8756:9;8747:7;8743:23;8739:32;8736:119;;;8774:79;;:::i;:::-;8736:119;8894:1;8919:53;8964:7;8955:6;8944:9;8940:22;8919:53;:::i;:::-;8909:63;;8865:117;9021:2;9047:53;9092:7;9083:6;9072:9;9068:22;9047:53;:::i;:::-;9037:63;;8992:118;8643:474;;;;;:::o;9123:179::-;9192:10;9213:46;9255:3;9247:6;9213:46;:::i;:::-;9291:4;9286:3;9282:14;9268:28;;9123:179;;;;:::o;9308:118::-;9395:24;9413:5;9395:24;:::i;:::-;9390:3;9383:37;9308:118;;:::o;9462:732::-;9581:3;9610:54;9658:5;9610:54;:::i;:::-;9680:86;9759:6;9754:3;9680:86;:::i;:::-;9673:93;;9790:56;9840:5;9790:56;:::i;:::-;9869:7;9900:1;9885:284;9910:6;9907:1;9904:13;9885:284;;;9986:6;9980:13;10013:63;10072:3;10057:13;10013:63;:::i;:::-;10006:70;;10099:60;10152:6;10099:60;:::i;:::-;10089:70;;9945:224;9932:1;9929;9925:9;9920:14;;9885:284;;;9889:14;10185:3;10178:10;;9586:608;;;9462:732;;;;:::o;10200:109::-;10281:21;10296:5;10281:21;:::i;:::-;10276:3;10269:34;10200:109;;:::o;10315:360::-;10401:3;10429:38;10461:5;10429:38;:::i;:::-;10483:70;10546:6;10541:3;10483:70;:::i;:::-;10476:77;;10562:52;10607:6;10602:3;10595:4;10588:5;10584:16;10562:52;:::i;:::-;10639:29;10661:6;10639:29;:::i;:::-;10634:3;10630:39;10623:46;;10405:270;10315:360;;;;:::o;10681:364::-;10769:3;10797:39;10830:5;10797:39;:::i;:::-;10852:71;10916:6;10911:3;10852:71;:::i;:::-;10845:78;;10932:52;10977:6;10972:3;10965:4;10958:5;10954:16;10932:52;:::i;:::-;11009:29;11031:6;11009:29;:::i;:::-;11004:3;11000:39;10993:46;;10773:272;10681:364;;;;:::o;11051:377::-;11157:3;11185:39;11218:5;11185:39;:::i;:::-;11240:89;11322:6;11317:3;11240:89;:::i;:::-;11233:96;;11338:52;11383:6;11378:3;11371:4;11364:5;11360:16;11338:52;:::i;:::-;11415:6;11410:3;11406:16;11399:23;;11161:267;11051:377;;;;:::o;11458:845::-;11561:3;11598:5;11592:12;11627:36;11653:9;11627:36;:::i;:::-;11679:89;11761:6;11756:3;11679:89;:::i;:::-;11672:96;;11799:1;11788:9;11784:17;11815:1;11810:137;;;;11961:1;11956:341;;;;11777:520;;11810:137;11894:4;11890:9;11879;11875:25;11870:3;11863:38;11930:6;11925:3;11921:16;11914:23;;11810:137;;11956:341;12023:38;12055:5;12023:38;:::i;:::-;12083:1;12097:154;12111:6;12108:1;12105:13;12097:154;;;12185:7;12179:14;12175:1;12170:3;12166:11;12159:35;12235:1;12226:7;12222:15;12211:26;;12133:4;12130:1;12126:12;12121:17;;12097:154;;;12280:6;12275:3;12271:16;12264:23;;11963:334;;11777:520;;11565:738;;11458:845;;;;:::o;12309:366::-;12451:3;12472:67;12536:2;12531:3;12472:67;:::i;:::-;12465:74;;12548:93;12637:3;12548:93;:::i;:::-;12666:2;12661:3;12657:12;12650:19;;12309:366;;;:::o;12681:::-;12823:3;12844:67;12908:2;12903:3;12844:67;:::i;:::-;12837:74;;12920:93;13009:3;12920:93;:::i;:::-;13038:2;13033:3;13029:12;13022:19;;12681:366;;;:::o;13053:::-;13195:3;13216:67;13280:2;13275:3;13216:67;:::i;:::-;13209:74;;13292:93;13381:3;13292:93;:::i;:::-;13410:2;13405:3;13401:12;13394:19;;13053:366;;;:::o;13425:::-;13567:3;13588:67;13652:2;13647:3;13588:67;:::i;:::-;13581:74;;13664:93;13753:3;13664:93;:::i;:::-;13782:2;13777:3;13773:12;13766:19;;13425:366;;;:::o;13797:::-;13939:3;13960:67;14024:2;14019:3;13960:67;:::i;:::-;13953:74;;14036:93;14125:3;14036:93;:::i;:::-;14154:2;14149:3;14145:12;14138:19;;13797:366;;;:::o;14169:::-;14311:3;14332:67;14396:2;14391:3;14332:67;:::i;:::-;14325:74;;14408:93;14497:3;14408:93;:::i;:::-;14526:2;14521:3;14517:12;14510:19;;14169:366;;;:::o;14541:::-;14683:3;14704:67;14768:2;14763:3;14704:67;:::i;:::-;14697:74;;14780:93;14869:3;14780:93;:::i;:::-;14898:2;14893:3;14889:12;14882:19;;14541:366;;;:::o;14913:::-;15055:3;15076:67;15140:2;15135:3;15076:67;:::i;:::-;15069:74;;15152:93;15241:3;15152:93;:::i;:::-;15270:2;15265:3;15261:12;15254:19;;14913:366;;;:::o;15285:::-;15427:3;15448:67;15512:2;15507:3;15448:67;:::i;:::-;15441:74;;15524:93;15613:3;15524:93;:::i;:::-;15642:2;15637:3;15633:12;15626:19;;15285:366;;;:::o;15657:::-;15799:3;15820:67;15884:2;15879:3;15820:67;:::i;:::-;15813:74;;15896:93;15985:3;15896:93;:::i;:::-;16014:2;16009:3;16005:12;15998:19;;15657:366;;;:::o;16029:::-;16171:3;16192:67;16256:2;16251:3;16192:67;:::i;:::-;16185:74;;16268:93;16357:3;16268:93;:::i;:::-;16386:2;16381:3;16377:12;16370:19;;16029:366;;;:::o;16401:::-;16543:3;16564:67;16628:2;16623:3;16564:67;:::i;:::-;16557:74;;16640:93;16729:3;16640:93;:::i;:::-;16758:2;16753:3;16749:12;16742:19;;16401:366;;;:::o;16773:::-;16915:3;16936:67;17000:2;16995:3;16936:67;:::i;:::-;16929:74;;17012:93;17101:3;17012:93;:::i;:::-;17130:2;17125:3;17121:12;17114:19;;16773:366;;;:::o;17145:::-;17287:3;17308:67;17372:2;17367:3;17308:67;:::i;:::-;17301:74;;17384:93;17473:3;17384:93;:::i;:::-;17502:2;17497:3;17493:12;17486:19;;17145:366;;;:::o;17517:::-;17659:3;17680:67;17744:2;17739:3;17680:67;:::i;:::-;17673:74;;17756:93;17845:3;17756:93;:::i;:::-;17874:2;17869:3;17865:12;17858:19;;17517:366;;;:::o;17889:::-;18031:3;18052:67;18116:2;18111:3;18052:67;:::i;:::-;18045:74;;18128:93;18217:3;18128:93;:::i;:::-;18246:2;18241:3;18237:12;18230:19;;17889:366;;;:::o;18261:398::-;18420:3;18441:83;18522:1;18517:3;18441:83;:::i;:::-;18434:90;;18533:93;18622:3;18533:93;:::i;:::-;18651:1;18646:3;18642:11;18635:18;;18261:398;;;:::o;18665:366::-;18807:3;18828:67;18892:2;18887:3;18828:67;:::i;:::-;18821:74;;18904:93;18993:3;18904:93;:::i;:::-;19022:2;19017:3;19013:12;19006:19;;18665:366;;;:::o;19037:::-;19179:3;19200:67;19264:2;19259:3;19200:67;:::i;:::-;19193:74;;19276:93;19365:3;19276:93;:::i;:::-;19394:2;19389:3;19385:12;19378:19;;19037:366;;;:::o;19409:::-;19551:3;19572:67;19636:2;19631:3;19572:67;:::i;:::-;19565:74;;19648:93;19737:3;19648:93;:::i;:::-;19766:2;19761:3;19757:12;19750:19;;19409:366;;;:::o;19781:108::-;19858:24;19876:5;19858:24;:::i;:::-;19853:3;19846:37;19781:108;;:::o;19895:118::-;19982:24;20000:5;19982:24;:::i;:::-;19977:3;19970:37;19895:118;;:::o;20019:589::-;20244:3;20266:95;20357:3;20348:6;20266:95;:::i;:::-;20259:102;;20378:95;20469:3;20460:6;20378:95;:::i;:::-;20371:102;;20490:92;20578:3;20569:6;20490:92;:::i;:::-;20483:99;;20599:3;20592:10;;20019:589;;;;;;:::o;20614:379::-;20798:3;20820:147;20963:3;20820:147;:::i;:::-;20813:154;;20984:3;20977:10;;20614:379;;;:::o;20999:222::-;21092:4;21130:2;21119:9;21115:18;21107:26;;21143:71;21211:1;21200:9;21196:17;21187:6;21143:71;:::i;:::-;20999:222;;;;:::o;21227:640::-;21422:4;21460:3;21449:9;21445:19;21437:27;;21474:71;21542:1;21531:9;21527:17;21518:6;21474:71;:::i;:::-;21555:72;21623:2;21612:9;21608:18;21599:6;21555:72;:::i;:::-;21637;21705:2;21694:9;21690:18;21681:6;21637:72;:::i;:::-;21756:9;21750:4;21746:20;21741:2;21730:9;21726:18;21719:48;21784:76;21855:4;21846:6;21784:76;:::i;:::-;21776:84;;21227:640;;;;;;;:::o;21873:373::-;22016:4;22054:2;22043:9;22039:18;22031:26;;22103:9;22097:4;22093:20;22089:1;22078:9;22074:17;22067:47;22131:108;22234:4;22225:6;22131:108;:::i;:::-;22123:116;;21873:373;;;;:::o;22252:210::-;22339:4;22377:2;22366:9;22362:18;22354:26;;22390:65;22452:1;22441:9;22437:17;22428:6;22390:65;:::i;:::-;22252:210;;;;:::o;22468:313::-;22581:4;22619:2;22608:9;22604:18;22596:26;;22668:9;22662:4;22658:20;22654:1;22643:9;22639:17;22632:47;22696:78;22769:4;22760:6;22696:78;:::i;:::-;22688:86;;22468:313;;;;:::o;22787:419::-;22953:4;22991:2;22980:9;22976:18;22968:26;;23040:9;23034:4;23030:20;23026:1;23015:9;23011:17;23004:47;23068:131;23194:4;23068:131;:::i;:::-;23060:139;;22787:419;;;:::o;23212:::-;23378:4;23416:2;23405:9;23401:18;23393:26;;23465:9;23459:4;23455:20;23451:1;23440:9;23436:17;23429:47;23493:131;23619:4;23493:131;:::i;:::-;23485:139;;23212:419;;;:::o;23637:::-;23803:4;23841:2;23830:9;23826:18;23818:26;;23890:9;23884:4;23880:20;23876:1;23865:9;23861:17;23854:47;23918:131;24044:4;23918:131;:::i;:::-;23910:139;;23637:419;;;:::o;24062:::-;24228:4;24266:2;24255:9;24251:18;24243:26;;24315:9;24309:4;24305:20;24301:1;24290:9;24286:17;24279:47;24343:131;24469:4;24343:131;:::i;:::-;24335:139;;24062:419;;;:::o;24487:::-;24653:4;24691:2;24680:9;24676:18;24668:26;;24740:9;24734:4;24730:20;24726:1;24715:9;24711:17;24704:47;24768:131;24894:4;24768:131;:::i;:::-;24760:139;;24487:419;;;:::o;24912:::-;25078:4;25116:2;25105:9;25101:18;25093:26;;25165:9;25159:4;25155:20;25151:1;25140:9;25136:17;25129:47;25193:131;25319:4;25193:131;:::i;:::-;25185:139;;24912:419;;;:::o;25337:::-;25503:4;25541:2;25530:9;25526:18;25518:26;;25590:9;25584:4;25580:20;25576:1;25565:9;25561:17;25554:47;25618:131;25744:4;25618:131;:::i;:::-;25610:139;;25337:419;;;:::o;25762:::-;25928:4;25966:2;25955:9;25951:18;25943:26;;26015:9;26009:4;26005:20;26001:1;25990:9;25986:17;25979:47;26043:131;26169:4;26043:131;:::i;:::-;26035:139;;25762:419;;;:::o;26187:::-;26353:4;26391:2;26380:9;26376:18;26368:26;;26440:9;26434:4;26430:20;26426:1;26415:9;26411:17;26404:47;26468:131;26594:4;26468:131;:::i;:::-;26460:139;;26187:419;;;:::o;26612:::-;26778:4;26816:2;26805:9;26801:18;26793:26;;26865:9;26859:4;26855:20;26851:1;26840:9;26836:17;26829:47;26893:131;27019:4;26893:131;:::i;:::-;26885:139;;26612:419;;;:::o;27037:::-;27203:4;27241:2;27230:9;27226:18;27218:26;;27290:9;27284:4;27280:20;27276:1;27265:9;27261:17;27254:47;27318:131;27444:4;27318:131;:::i;:::-;27310:139;;27037:419;;;:::o;27462:::-;27628:4;27666:2;27655:9;27651:18;27643:26;;27715:9;27709:4;27705:20;27701:1;27690:9;27686:17;27679:47;27743:131;27869:4;27743:131;:::i;:::-;27735:139;;27462:419;;;:::o;27887:::-;28053:4;28091:2;28080:9;28076:18;28068:26;;28140:9;28134:4;28130:20;28126:1;28115:9;28111:17;28104:47;28168:131;28294:4;28168:131;:::i;:::-;28160:139;;27887:419;;;:::o;28312:::-;28478:4;28516:2;28505:9;28501:18;28493:26;;28565:9;28559:4;28555:20;28551:1;28540:9;28536:17;28529:47;28593:131;28719:4;28593:131;:::i;:::-;28585:139;;28312:419;;;:::o;28737:::-;28903:4;28941:2;28930:9;28926:18;28918:26;;28990:9;28984:4;28980:20;28976:1;28965:9;28961:17;28954:47;29018:131;29144:4;29018:131;:::i;:::-;29010:139;;28737:419;;;:::o;29162:::-;29328:4;29366:2;29355:9;29351:18;29343:26;;29415:9;29409:4;29405:20;29401:1;29390:9;29386:17;29379:47;29443:131;29569:4;29443:131;:::i;:::-;29435:139;;29162:419;;;:::o;29587:::-;29753:4;29791:2;29780:9;29776:18;29768:26;;29840:9;29834:4;29830:20;29826:1;29815:9;29811:17;29804:47;29868:131;29994:4;29868:131;:::i;:::-;29860:139;;29587:419;;;:::o;30012:::-;30178:4;30216:2;30205:9;30201:18;30193:26;;30265:9;30259:4;30255:20;30251:1;30240:9;30236:17;30229:47;30293:131;30419:4;30293:131;:::i;:::-;30285:139;;30012:419;;;:::o;30437:::-;30603:4;30641:2;30630:9;30626:18;30618:26;;30690:9;30684:4;30680:20;30676:1;30665:9;30661:17;30654:47;30718:131;30844:4;30718:131;:::i;:::-;30710:139;;30437:419;;;:::o;30862:222::-;30955:4;30993:2;30982:9;30978:18;30970:26;;31006:71;31074:1;31063:9;31059:17;31050:6;31006:71;:::i;:::-;30862:222;;;;:::o;31090:129::-;31124:6;31151:20;;:::i;:::-;31141:30;;31180:33;31208:4;31200:6;31180:33;:::i;:::-;31090:129;;;:::o;31225:75::-;31258:6;31291:2;31285:9;31275:19;;31225:75;:::o;31306:307::-;31367:4;31457:18;31449:6;31446:30;31443:56;;;31479:18;;:::i;:::-;31443:56;31517:29;31539:6;31517:29;:::i;:::-;31509:37;;31601:4;31595;31591:15;31583:23;;31306:307;;;:::o;31619:308::-;31681:4;31771:18;31763:6;31760:30;31757:56;;;31793:18;;:::i;:::-;31757:56;31831:29;31853:6;31831:29;:::i;:::-;31823:37;;31915:4;31909;31905:15;31897:23;;31619:308;;;:::o;31933:132::-;32000:4;32023:3;32015:11;;32053:4;32048:3;32044:14;32036:22;;31933:132;;;:::o;32071:141::-;32120:4;32143:3;32135:11;;32166:3;32163:1;32156:14;32200:4;32197:1;32187:18;32179:26;;32071:141;;;:::o;32218:114::-;32285:6;32319:5;32313:12;32303:22;;32218:114;;;:::o;32338:98::-;32389:6;32423:5;32417:12;32407:22;;32338:98;;;:::o;32442:99::-;32494:6;32528:5;32522:12;32512:22;;32442:99;;;:::o;32547:113::-;32617:4;32649;32644:3;32640:14;32632:22;;32547:113;;;:::o;32666:184::-;32765:11;32799:6;32794:3;32787:19;32839:4;32834:3;32830:14;32815:29;;32666:184;;;;:::o;32856:168::-;32939:11;32973:6;32968:3;32961:19;33013:4;33008:3;33004:14;32989:29;;32856:168;;;;:::o;33030:147::-;33131:11;33168:3;33153:18;;33030:147;;;;:::o;33183:169::-;33267:11;33301:6;33296:3;33289:19;33341:4;33336:3;33332:14;33317:29;;33183:169;;;;:::o;33358:148::-;33460:11;33497:3;33482:18;;33358:148;;;;:::o;33512:305::-;33552:3;33571:20;33589:1;33571:20;:::i;:::-;33566:25;;33605:20;33623:1;33605:20;:::i;:::-;33600:25;;33759:1;33691:66;33687:74;33684:1;33681:81;33678:107;;;33765:18;;:::i;:::-;33678:107;33809:1;33806;33802:9;33795:16;;33512:305;;;;:::o;33823:185::-;33863:1;33880:20;33898:1;33880:20;:::i;:::-;33875:25;;33914:20;33932:1;33914:20;:::i;:::-;33909:25;;33953:1;33943:35;;33958:18;;:::i;:::-;33943:35;34000:1;33997;33993:9;33988:14;;33823:185;;;;:::o;34014:348::-;34054:7;34077:20;34095:1;34077:20;:::i;:::-;34072:25;;34111:20;34129:1;34111:20;:::i;:::-;34106:25;;34299:1;34231:66;34227:74;34224:1;34221:81;34216:1;34209:9;34202:17;34198:105;34195:131;;;34306:18;;:::i;:::-;34195:131;34354:1;34351;34347:9;34336:20;;34014:348;;;;:::o;34368:191::-;34408:4;34428:20;34446:1;34428:20;:::i;:::-;34423:25;;34462:20;34480:1;34462:20;:::i;:::-;34457:25;;34501:1;34498;34495:8;34492:34;;;34506:18;;:::i;:::-;34492:34;34551:1;34548;34544:9;34536:17;;34368:191;;;;:::o;34565:96::-;34602:7;34631:24;34649:5;34631:24;:::i;:::-;34620:35;;34565:96;;;:::o;34667:90::-;34701:7;34744:5;34737:13;34730:21;34719:32;;34667:90;;;:::o;34763:149::-;34799:7;34839:66;34832:5;34828:78;34817:89;;34763:149;;;:::o;34918:126::-;34955:7;34995:42;34988:5;34984:54;34973:65;;34918:126;;;:::o;35050:77::-;35087:7;35116:5;35105:16;;35050:77;;;:::o;35133:154::-;35217:6;35212:3;35207;35194:30;35279:1;35270:6;35265:3;35261:16;35254:27;35133:154;;;:::o;35293:307::-;35361:1;35371:113;35385:6;35382:1;35379:13;35371:113;;;35470:1;35465:3;35461:11;35455:18;35451:1;35446:3;35442:11;35435:39;35407:2;35404:1;35400:10;35395:15;;35371:113;;;35502:6;35499:1;35496:13;35493:101;;;35582:1;35573:6;35568:3;35564:16;35557:27;35493:101;35342:258;35293:307;;;:::o;35606:320::-;35650:6;35687:1;35681:4;35677:12;35667:22;;35734:1;35728:4;35724:12;35755:18;35745:81;;35811:4;35803:6;35799:17;35789:27;;35745:81;35873:2;35865:6;35862:14;35842:18;35839:38;35836:84;;;35892:18;;:::i;:::-;35836:84;35657:269;35606:320;;;:::o;35932:281::-;36015:27;36037:4;36015:27;:::i;:::-;36007:6;36003:40;36145:6;36133:10;36130:22;36109:18;36097:10;36094:34;36091:62;36088:88;;;36156:18;;:::i;:::-;36088:88;36196:10;36192:2;36185:22;35975:238;35932:281;;:::o;36219:233::-;36258:3;36281:24;36299:5;36281:24;:::i;:::-;36272:33;;36327:66;36320:5;36317:77;36314:103;;;36397:18;;:::i;:::-;36314:103;36444:1;36437:5;36433:13;36426:20;;36219:233;;;:::o;36458:180::-;36506:77;36503:1;36496:88;36603:4;36600:1;36593:15;36627:4;36624:1;36617:15;36644:180;36692:77;36689:1;36682:88;36789:4;36786:1;36779:15;36813:4;36810:1;36803:15;36830:180;36878:77;36875:1;36868:88;36975:4;36972:1;36965:15;36999:4;36996:1;36989:15;37016:180;37064:77;37061:1;37054:88;37161:4;37158:1;37151:15;37185:4;37182:1;37175:15;37202:180;37250:77;37247:1;37240:88;37347:4;37344:1;37337:15;37371:4;37368:1;37361:15;37388:117;37497:1;37494;37487:12;37511:117;37620:1;37617;37610:12;37634:117;37743:1;37740;37733:12;37757:117;37866:1;37863;37856:12;37880:117;37989:1;37986;37979:12;38003:117;38112:1;38109;38102:12;38126:102;38167:6;38218:2;38214:7;38209:2;38202:5;38198:14;38194:28;38184:38;;38126:102;;;:::o;38234:232::-;38374:34;38370:1;38362:6;38358:14;38351:58;38443:15;38438:2;38430:6;38426:15;38419:40;38234:232;:::o;38472:171::-;38612:23;38608:1;38600:6;38596:14;38589:47;38472:171;:::o;38649:237::-;38789:34;38785:1;38777:6;38773:14;38766:58;38858:20;38853:2;38845:6;38841:15;38834:45;38649:237;:::o;38892:225::-;39032:34;39028:1;39020:6;39016:14;39009:58;39101:8;39096:2;39088:6;39084:15;39077:33;38892:225;:::o;39123:224::-;39263:34;39259:1;39251:6;39247:14;39240:58;39332:7;39327:2;39319:6;39315:15;39308:32;39123:224;:::o;39353:178::-;39493:30;39489:1;39481:6;39477:14;39470:54;39353:178;:::o;39537:170::-;39677:22;39673:1;39665:6;39661:14;39654:46;39537:170;:::o;39713:223::-;39853:34;39849:1;39841:6;39837:14;39830:58;39922:6;39917:2;39909:6;39905:15;39898:31;39713:223;:::o;39942:175::-;40082:27;40078:1;40070:6;40066:14;40059:51;39942:175;:::o;40123:228::-;40263:34;40259:1;40251:6;40247:14;40240:58;40332:11;40327:2;40319:6;40315:15;40308:36;40123:228;:::o;40357:182::-;40497:34;40493:1;40485:6;40481:14;40474:58;40357:182;:::o;40545:::-;40685:34;40681:1;40673:6;40669:14;40662:58;40545:182;:::o;40733:173::-;40873:25;40869:1;40861:6;40857:14;40850:49;40733:173;:::o;40912:234::-;41052:34;41048:1;41040:6;41036:14;41029:58;41121:17;41116:2;41108:6;41104:15;41097:42;40912:234;:::o;41152:174::-;41292:26;41288:1;41280:6;41276:14;41269:50;41152:174;:::o;41332:220::-;41472:34;41468:1;41460:6;41456:14;41449:58;41541:3;41536:2;41528:6;41524:15;41517:28;41332:220;:::o;41558:114::-;;:::o;41678:170::-;41818:22;41814:1;41806:6;41802:14;41795:46;41678:170;:::o;41854:248::-;41994:34;41990:1;41982:6;41978:14;41971:58;42063:31;42058:2;42050:6;42046:15;42039:56;41854:248;:::o;42108:169::-;42248:21;42244:1;42236:6;42232:14;42225:45;42108:169;:::o;42283:122::-;42356:24;42374:5;42356:24;:::i;:::-;42349:5;42346:35;42336:63;;42395:1;42392;42385:12;42336:63;42283:122;:::o;42411:116::-;42481:21;42496:5;42481:21;:::i;:::-;42474:5;42471:32;42461:60;;42517:1;42514;42507:12;42461:60;42411:116;:::o;42533:120::-;42605:23;42622:5;42605:23;:::i;:::-;42598:5;42595:34;42585:62;;42643:1;42640;42633:12;42585:62;42533:120;:::o;42659:122::-;42732:24;42750:5;42732:24;:::i;:::-;42725:5;42722:35;42712:63;;42771:1;42768;42761:12;42712:63;42659:122;:::o

Swarm Source

ipfs://1599193cc7ea706cc80c4f66eda6db698ce2492d188c692c748042244134459e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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