ETH Price: $3,236.99 (-1.15%)
Gas: 4 Gwei

Token

TheIncursionNFT (INC)
 

Overview

Max Total Supply

3,333 INC

Holders

10

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 INC
0x4c70c0ce91602db64ab86d522439a68e1a981b23
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:
IncursionNFT

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-09
*/

// File: contracts/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: contracts/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

// File: contracts/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// 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: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: contracts/IncursionNFT.sol


pragma solidity ^0.8.9;






contract IncursionNFT is ERC721, ERC721URIStorage, Ownable, DefaultOperatorFilterer {
    using Counters for Counters.Counter;
    Counters.Counter private NFTtokenId;

    //list of events setup
    event Freeze(address account, bool value);
            
    mapping(uint256 => mapping(address => uint256)) public balances;
    bool private _privateFreeze;
    bool private _publicFreeze;
    address public whitelistAdmin;
    uint256 public privateMintTokenLimit;
    uint256 public publicMintTokenLimit;
    uint256 public tokenPrivateSalePrice;
    uint256 public tokenPublicSalePrice;
    uint256 public decimal;
    

    constructor(string memory _name, string memory _symbol, uint256 _privateMintTokenLimit, 
    uint256 _publicMintTokenLimit, uint256 _tokenPrivateSalePrice, uint256 _tokenPublicSalePrice) 
    ERC721(_name, _symbol) {
        decimal = 18;
        _privateFreeze = false;
        _publicFreeze = false;
        whitelistAdmin = msg.sender;
        privateMintTokenLimit = _privateMintTokenLimit;
        publicMintTokenLimit = _publicMintTokenLimit;
        tokenPrivateSalePrice = _tokenPrivateSalePrice;
        tokenPublicSalePrice = _tokenPublicSalePrice;
    }

    // to see who is the admin of the whiteListed activity
    function getWhiteListAdmin() public view returns(address)  {
        return whitelistAdmin;
    }
    function setWhiteListAdmin(address userAddress) public onlyOwner {
        whitelistAdmin = userAddress;
    }

    //ability for owner to freeze/pause the contract function
    function isPrivateFreezed() public view returns(bool) {
         return _privateFreeze;
    } 

       //ability for owner to freeze/pause the contract function
    function isPublicFreezed() public view returns(bool) {
         return _publicFreeze;
    } 

    //set the pause/start status for the contract function and only Owner can make it
    function setPrivateFreeze(bool _freeze) external returns(bool) {
        require(msg.sender == whitelistAdmin, "Caller is not authorized");
        _privateFreeze = _freeze;
        emit Freeze(msg.sender, _privateFreeze);
        return true;
    }

    //set the pause/start status for the contract function and only Owner can make it
    function setPublicFreeze(bool _freeze) external returns(bool) {
        require(msg.sender == whitelistAdmin, "Caller is not authorized");
        _publicFreeze = _freeze;
        emit Freeze(msg.sender, _publicFreeze);
        return true;
    }
   

    function setPrivateTokenLimit(uint256 _tokenLimit) public returns(bool) {
        require(msg.sender == whitelistAdmin, "Caller is not authorized");
        privateMintTokenLimit = _tokenLimit;
        return true;
    }

    function setPublicTokenLimit(uint256 _tokenLimit) public returns(bool) {
        require(msg.sender == whitelistAdmin, "Caller is not authorized");
        publicMintTokenLimit = _tokenLimit;
        return true;
    }

    function setPrivateSaleTokenPrice(uint256 _tokenPrice) public returns(bool) {
        require(msg.sender == whitelistAdmin, "Caller is not authorized");
        tokenPrivateSalePrice = _tokenPrice;
        return true;
    }

    function setPublicSaleTokenPrice(uint256 _tokenPrice) public returns(bool) {
        require(msg.sender == whitelistAdmin, "Caller is not authorized");
        tokenPublicSalePrice = _tokenPrice;
        return true;
    }

    function totalSupply() public view returns(uint256 total) {
        unchecked {
            return privateMintTokenLimit + publicMintTokenLimit;
        }
    }

    //get current tokenId or minted token count
    function getTokenCount() public view returns(uint) {
        require(msg.sender == whitelistAdmin, "Caller is not authorized");
        return NFTtokenId.current();
    }

    function safePrivateMint(string memory metadataUrl) payable public {
       require(NFTtokenId.current() < privateMintTokenLimit, "Token reaches the initial limit");
       require(_privateFreeze == false, "Private miniting is not allowed"); 
       require(msg.value > 0 && msg.value >= tokenPrivateSalePrice, "Insufficient Balance");
        NFTtokenId.increment();
        uint256 tokenId = NFTtokenId.current();
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, metadataUrl);
        balances[tokenId][msg.sender] = 1;
        //transfer the service amount to the owner
        address payable admin = payable(owner());
        admin.transfer(msg.value);
    }

    function safePublicMint(string memory metadataUrl) payable public {
        require(NFTtokenId.current() < (privateMintTokenLimit + publicMintTokenLimit), "Token reaches the total cap limit");
        require(_publicFreeze == false, "Public miniting is not allowed"); 
        require(msg.value > 0 && msg.value >= tokenPublicSalePrice, "Insufficient Balance");
        NFTtokenId.increment();
        uint256 tokenId = NFTtokenId.current();
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, metadataUrl);
        balances[tokenId][msg.sender] = 1;
        //transfer the service amount to the admin
        address payable admin = payable(owner());
        admin.transfer(msg.value);
      
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    //function to setMetaDataUrl for the pre minted token
    function unrevealedNFTBox(uint _tokenId, string memory _metaDataUrl) public {
        require(_exists(_tokenId),"TokenId is not exist");
        require(ERC721.ownerOf(_tokenId) == msg.sender, "Caller is not token owner");
        require(balances[_tokenId][msg.sender] >= 1, "insufficient Token Balance");
        _setTokenURI(_tokenId, _metaDataUrl);
    }

    //burn token
    function burnToken(uint256 _tokenId) public {
      require(whitelistAdmin == msg.sender, "Caller is not authorized"); //token should exist with its balance for that address
      require(_exists(_tokenId),"TokenId is not exist");
      address tokenOwner = ERC721.ownerOf(_tokenId);
      uint256 tokenBalance = balances[_tokenId][tokenOwner];
      require(tokenBalance >= 1, "insufficient Token Balance");
      _burn(_tokenId);
      //after burned remove the balance of the token from the token owner;
      unchecked {
        balances[_tokenId][tokenOwner] -= 1;
      }
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }
    
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_privateMintTokenLimit","type":"uint256"},{"internalType":"uint256","name":"_publicMintTokenLimit","type":"uint256"},{"internalType":"uint256","name":"_tokenPrivateSalePrice","type":"uint256"},{"internalType":"uint256","name":"_tokenPublicSalePrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"Freeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimal","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":"getTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhiteListAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPrivateFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateMintTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadataUrl","type":"string"}],"name":"safePrivateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"metadataUrl","type":"string"}],"name":"safePublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_freeze","type":"bool"}],"name":"setPrivateFreeze","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"setPrivateSaleTokenPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenLimit","type":"uint256"}],"name":"setPrivateTokenLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_freeze","type":"bool"}],"name":"setPublicFreeze","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"setPublicSaleTokenPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenLimit","type":"uint256"}],"name":"setPublicTokenLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"setWhiteListAdmin","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":[],"name":"tokenPrivateSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPublicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_metaDataUrl","type":"string"}],"name":"unrevealedNFTBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162005b5d38038062005b5d8339818101604052810190620000379190620005d0565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600187878160009081620000619190620008eb565b508060019081620000739190620008eb565b505050620000966200008a6200033460201b60201c565b6200033c60201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200028b57801562000151576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200011792919062000a17565b600060405180830381600087803b1580156200013257600080fd5b505af115801562000147573d6000803e3d6000fd5b505050506200028a565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200020b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620001d192919062000a17565b600060405180830381600087803b158015620001ec57600080fd5b505af115801562000201573d6000803e3d6000fd5b5050505062000289565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000254919062000a44565b600060405180830381600087803b1580156200026f57600080fd5b505af115801562000284573d6000803e3d6000fd5b505050505b5b5b50506012600f819055506000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff02191690831515021790555033600a60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600b8190555082600c8190555081600d8190555080600e8190555050505050505062000a61565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200046b8262000420565b810181811067ffffffffffffffff821117156200048d576200048c62000431565b5b80604052505050565b6000620004a262000402565b9050620004b0828262000460565b919050565b600067ffffffffffffffff821115620004d357620004d262000431565b5b620004de8262000420565b9050602081019050919050565b60005b838110156200050b578082015181840152602081019050620004ee565b60008484015250505050565b60006200052e6200052884620004b5565b62000496565b9050828152602081018484840111156200054d576200054c6200041b565b5b6200055a848285620004eb565b509392505050565b600082601f8301126200057a576200057962000416565b5b81516200058c84826020860162000517565b91505092915050565b6000819050919050565b620005aa8162000595565b8114620005b657600080fd5b50565b600081519050620005ca816200059f565b92915050565b60008060008060008060c08789031215620005f057620005ef6200040c565b5b600087015167ffffffffffffffff81111562000611576200061062000411565b5b6200061f89828a0162000562565b965050602087015167ffffffffffffffff81111562000643576200064262000411565b5b6200065189828a0162000562565b95505060406200066489828a01620005b9565b94505060606200067789828a01620005b9565b93505060806200068a89828a01620005b9565b92505060a06200069d89828a01620005b9565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006fd57607f821691505b602082108103620007135762000712620006b5565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200077d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200073e565b6200078986836200073e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620007cc620007c6620007c08462000595565b620007a1565b62000595565b9050919050565b6000819050919050565b620007e883620007ab565b62000800620007f782620007d3565b8484546200074b565b825550505050565b600090565b6200081762000808565b62000824818484620007dd565b505050565b5b818110156200084c57620008406000826200080d565b6001810190506200082a565b5050565b601f8211156200089b57620008658162000719565b62000870846200072e565b8101602085101562000880578190505b620008986200088f856200072e565b83018262000829565b50505b505050565b600082821c905092915050565b6000620008c060001984600802620008a0565b1980831691505092915050565b6000620008db8383620008ad565b9150826002028217905092915050565b620008f682620006aa565b67ffffffffffffffff81111562000912576200091162000431565b5b6200091e8254620006e4565b6200092b82828562000850565b600060209050601f8311600181146200096357600084156200094e578287015190505b6200095a8582620008cd565b865550620009ca565b601f198416620009738662000719565b60005b828110156200099d5784890151825560018201915060208501945060208101905062000976565b86831015620009bd5784890151620009b9601f891682620008ad565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009ff82620009d2565b9050919050565b62000a1181620009f2565b82525050565b600060408201905062000a2e600083018562000a06565b62000a3d602083018462000a06565b9392505050565b600060208201905062000a5b600083018462000a06565b92915050565b6150ec8062000a716000396000f3fe60806040526004361061023a5760003560e01c806375d03f461161012e57806395d89b41116100ab578063e1fd6a3f1161006f578063e1fd6a3f146108a4578063e5034458146108cf578063e9317a51146108fa578063e985e9c514610937578063f2fde38b146109745761023a565b806395d89b41146107ad578063a22cb465146107d8578063b08f0b8514610801578063b88d4fde1461083e578063c87b56dd146108675761023a565b806386e631e9116100f257806386e631e9146106b25780638b3d95a7146106dd5780638d15cdbf1461071a5780638da5cb5b14610757578063927c88ae146107825761023a565b806375d03f46146105dd57806376809ce31461060857806378a89567146106335780637b47ec1a1461065e578063865c09ae146106875761023a565b806331d5944c116101bc5780634adbe551116101805780634adbe551146104e45780635a64e8c01461050f5780636352211e1461054c57806370a0823114610589578063715018a6146105c65761023a565b806331d5944c1461042057806331dd6a6c1461043c57806336e96d481461046557806341f434341461049057806342842e0e146104bb5761023a565b806318160ddd1161020357806318160ddd1461034a5780631f3203311461037557806321fbc2aa146103b2578063237e5fa8146103ce57806323b872dd146103f75761023a565b80620e05491461023f57806301ffc9a71461027c57806306fdde03146102b9578063081812fc146102e4578063095ea7b314610321575b600080fd5b34801561024b57600080fd5b5061026660048036038101906102619190613878565b61099d565b60405161027391906138c0565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613933565b610a3f565b6040516102b091906138c0565b60405180910390f35b3480156102c557600080fd5b506102ce610b21565b6040516102db91906139f0565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613878565b610bb3565b6040516103189190613a53565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190613a9a565b610bf9565b005b34801561035657600080fd5b5061035f610d03565b60405161036c9190613ae9565b60405180910390f35b34801561038157600080fd5b5061039c60048036038101906103979190613b04565b610d11565b6040516103a99190613ae9565b60405180910390f35b6103cc60048036038101906103c79190613c79565b610d36565b005b3480156103da57600080fd5b506103f560048036038101906103f09190613cc2565b610f11565b005b34801561040357600080fd5b5061041e60048036038101906104199190613d1e565b611071565b005b61043a60048036038101906104359190613c79565b6111c1565b005b34801561044857600080fd5b50610463600480360381019061045e9190613d71565b61138f565b005b34801561047157600080fd5b5061047a6113db565b6040516104879190613ae9565b60405180910390f35b34801561049c57600080fd5b506104a56113e1565b6040516104b29190613dfd565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd9190613d1e565b6113f3565b005b3480156104f057600080fd5b506104f9611543565b6040516105069190613a53565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613878565b611569565b60405161054391906138c0565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613878565b61160b565b6040516105809190613a53565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab9190613d71565b611691565b6040516105bd9190613ae9565b60405180910390f35b3480156105d257600080fd5b506105db611748565b005b3480156105e957600080fd5b506105f261175c565b6040516105ff9190613ae9565b60405180910390f35b34801561061457600080fd5b5061061d611762565b60405161062a9190613ae9565b60405180910390f35b34801561063f57600080fd5b50610648611768565b6040516106559190613ae9565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613878565b611809565b005b34801561069357600080fd5b5061069c6119f4565b6040516106a99190613a53565b60405180910390f35b3480156106be57600080fd5b506106c7611a1e565b6040516106d49190613ae9565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613878565b611a24565b60405161071191906138c0565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c9190613e44565b611ac6565b60405161074e91906138c0565b60405180910390f35b34801561076357600080fd5b5061076c611bc3565b6040516107799190613a53565b60405180910390f35b34801561078e57600080fd5b50610797611bed565b6040516107a49190613ae9565b60405180910390f35b3480156107b957600080fd5b506107c2611bf3565b6040516107cf91906139f0565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190613e71565b611c85565b005b34801561080d57600080fd5b5061082860048036038101906108239190613e44565b611d8f565b60405161083591906138c0565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190613f52565b611e8c565b005b34801561087357600080fd5b5061088e60048036038101906108899190613878565b611fdf565b60405161089b91906139f0565b60405180910390f35b3480156108b057600080fd5b506108b9611ff1565b6040516108c691906138c0565b60405180910390f35b3480156108db57600080fd5b506108e4612008565b6040516108f191906138c0565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c9190613878565b61201f565b60405161092e91906138c0565b60405180910390f35b34801561094357600080fd5b5061095e60048036038101906109599190613fd5565b6120c1565b60405161096b91906138c0565b60405180910390f35b34801561098057600080fd5b5061099b60048036038101906109969190613d71565b612155565b005b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690614061565b60405180910390fd5b81600c8190555060019050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1a5750610b19826121d8565b5b9050919050565b606060008054610b30906140b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c906140b0565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b5050505050905090565b6000610bbe82612242565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cf4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c719291906140e1565b602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb2919061411f565b610cf357806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cea9190613a53565b60405180910390fd5b5b610cfe838361228d565b505050565b6000600c54600b5401905090565b6009602052816000526040600020602052806000526040600020600091509150505481565b600c54600b54610d46919061417b565b610d5060086123a4565b10610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790614221565b60405180910390fd5b60001515600a60019054906101000a900460ff16151514610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd9061428d565b60405180910390fd5b600034118015610df85750600e543410155b610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e906142f9565b60405180910390fd5b610e4160086123b2565b6000610e4d60086123a4565b9050610e5933826123c8565b610e6381836123e6565b60016009600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000610ec3611bc3565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610f0b573d6000803e3d6000fd5b50505050565b610f1a82612453565b610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090614365565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610f798361160b565b73ffffffffffffffffffffffffffffffffffffffff1614610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc6906143d1565b60405180910390fd5b60016009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105a9061443d565b60405180910390fd5b61106d82826123e6565b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156111af573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110e3576110de848484612494565b6111bb565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161112c9291906140e1565b602060405180830381865afa158015611149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116d919061411f565b6111ae57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016111a59190613a53565b60405180910390fd5b5b6111ba848484612494565b5b50505050565b600b546111ce60086123a4565b1061120e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611205906144a9565b60405180910390fd5b60001515600a60009054906101000a900460ff16151514611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90614515565b60405180910390fd5b6000341180156112765750600d543410155b6112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906142f9565b60405180910390fd5b6112bf60086123b2565b60006112cb60086123a4565b90506112d733826123c8565b6112e181836123e6565b60016009600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000611341611bc3565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611389573d6000803e3d6000fd5b50505050565b6113976124f4565b80600a60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611531573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361146557611460848484612572565b61153d565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016114ae9291906140e1565b602060405180830381865afa1580156114cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ef919061411f565b61153057336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115279190613a53565b60405180910390fd5b5b61153c848484612572565b5b50505050565b600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290614061565b60405180910390fd5b81600b8190555060019050919050565b60008061161783612592565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614581565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890614613565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117506124f4565b61175a60006125cf565b565b600b5481565b600f5481565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614061565b60405180910390fd5b61180460086123a4565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189090614061565b60405180910390fd5b6118a281612453565b6118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d890614365565b60405180910390fd5b60006118ec8261160b565b905060006009600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001811015611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e9061443d565b60405180910390fd5b61199083612695565b60016009600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550505050565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614061565b60405180910390fd5b81600d8190555060019050919050565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614061565b60405180910390fd5b81600a60006101000a81548160ff0219169083151502179055507ff022c1fbc00daf4d2e6cdc62e0338b967bd3be38ccc3d7f8e0168bd668c7bcfe33600a60009054906101000a900460ff16604051611bb2929190614633565b60405180910390a160019050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b606060018054611c02906140b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2e906140b0565b8015611c7b5780601f10611c5057610100808354040283529160200191611c7b565b820191906000526020600020905b815481529060010190602001808311611c5e57829003601f168201915b5050505050905090565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d80576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cfd9291906140e1565b602060405180830381865afa158015611d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3e919061411f565b611d7f57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d769190613a53565b60405180910390fd5b5b611d8a83836126a1565b505050565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890614061565b60405180910390fd5b81600a60016101000a81548160ff0219169083151502179055507ff022c1fbc00daf4d2e6cdc62e0338b967bd3be38ccc3d7f8e0168bd668c7bcfe33600a60019054906101000a900460ff16604051611e7b929190614633565b60405180910390a160019050919050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611fcb573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eff57611efa858585856126b7565b611fd8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f489291906140e1565b602060405180830381865afa158015611f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f89919061411f565b611fca57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611fc19190613a53565b60405180910390fd5b5b611fd7858585856126b7565b5b5050505050565b6060611fea82612719565b9050919050565b6000600a60009054906101000a900460ff16905090565b6000600a60019054906101000a900460ff16905090565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a890614061565b60405180910390fd5b81600e8190555060019050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61215d6124f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906146ce565b60405180910390fd5b6121d5816125cf565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61224b81612453565b61228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228190614581565b60405180910390fd5b50565b60006122988261160b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff90614760565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661232761282b565b73ffffffffffffffffffffffffffffffffffffffff16148061235657506123558161235061282b565b6120c1565b5b612395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238c906147f2565b60405180910390fd5b61239f8383612833565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6123e28282604051806020016040528060008152506128ec565b5050565b6123ef82612453565b61242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242590614884565b60405180910390fd5b8060066000848152602001908152602001600020908161244e9190614a46565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661247583612592565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6124a561249f61282b565b82612947565b6124e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124db90614b8a565b60405180910390fd5b6124ef8383836129dc565b505050565b6124fc61282b565b73ffffffffffffffffffffffffffffffffffffffff1661251a611bc3565b73ffffffffffffffffffffffffffffffffffffffff1614612570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256790614bf6565b60405180910390fd5b565b61258d83838360405180602001604052806000815250611e8c565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61269e81612cd5565b50565b6126b36126ac61282b565b8383612d28565b5050565b6126c86126c261282b565b83612947565b612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90614b8a565b60405180910390fd5b61271384848484612e94565b50505050565b606061272482612242565b6000600660008481526020019081526020016000208054612744906140b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612770906140b0565b80156127bd5780601f10612792576101008083540402835291602001916127bd565b820191906000526020600020905b8154815290600101906020018083116127a057829003601f168201915b5050505050905060006127ce612ef0565b905060008151036127e3578192505050612826565b600082511115612818578082604051602001612800929190614c52565b60405160208183030381529060405292505050612826565b61282184612f07565b925050505b919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128a68361160b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6128f68383612f6f565b612903600084848461318c565b612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990614ce8565b60405180910390fd5b505050565b6000806129538361160b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612995575061299481856120c1565b5b806129d357508373ffffffffffffffffffffffffffffffffffffffff166129bb84610bb3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129fc8261160b565b73ffffffffffffffffffffffffffffffffffffffff1614612a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4990614d7a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab890614e0c565b60405180910390fd5b612ace8383836001613313565b8273ffffffffffffffffffffffffffffffffffffffff16612aee8261160b565b73ffffffffffffffffffffffffffffffffffffffff1614612b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3b90614d7a565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cd08383836001613439565b505050565b612cde8161343f565b6000600660008381526020019081526020016000208054612cfe906140b0565b905014612d2557600660008281526020019081526020016000206000612d2491906137d1565b5b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8d90614e78565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e8791906138c0565b60405180910390a3505050565b612e9f8484846129dc565b612eab8484848461318c565b612eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee190614ce8565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060612f1282612242565b6000612f1c612ef0565b90506000815111612f3c5760405180602001604052806000815250612f67565b80612f468461358d565b604051602001612f57929190614c52565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd590614ee4565b60405180910390fd5b612fe781612453565b15613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90614f50565b60405180910390fd5b613035600083836001613313565b61303e81612453565b1561307e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307590614f50565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613188600083836001613439565b5050565b60006131ad8473ffffffffffffffffffffffffffffffffffffffff1661365b565b15613306578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131d661282b565b8786866040518563ffffffff1660e01b81526004016131f89493929190614fc5565b6020604051808303816000875af192505050801561323457506040513d601f19601f820116820180604052508101906132319190615026565b60015b6132b6573d8060008114613264576040519150601f19603f3d011682016040523d82523d6000602084013e613269565b606091505b5060008151036132ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a590614ce8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061330b565b600190505b949350505050565b600181111561343357600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146133a75780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461339f9190615053565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134325780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461342a919061417b565b925050819055505b5b50505050565b50505050565b600061344a8261160b565b905061345a816000846001613313565b6134638261160b565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613589816000846001613439565b5050565b60606000600161359c8461367e565b01905060008167ffffffffffffffff8111156135bb576135ba613b4e565b5b6040519080825280601f01601f1916602001820160405280156135ed5781602001600182028036833780820191505090505b509050600082602001820190505b600115613650578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161364457613643615087565b5b049450600085036135fb575b819350505050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136dc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816136d2576136d1615087565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613719576d04ee2d6d415b85acef8100000000838161370f5761370e615087565b5b0492506020810190505b662386f26fc10000831061374857662386f26fc10000838161373e5761373d615087565b5b0492506010810190505b6305f5e1008310613771576305f5e100838161376757613766615087565b5b0492506008810190505b612710831061379657612710838161378c5761378b615087565b5b0492506004810190505b606483106137b957606483816137af576137ae615087565b5b0492506002810190505b600a83106137c8576001810190505b80915050919050565b5080546137dd906140b0565b6000825580601f106137ef575061380e565b601f01602090049060005260206000209081019061380d9190613811565b5b50565b5b8082111561382a576000816000905550600101613812565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61385581613842565b811461386057600080fd5b50565b6000813590506138728161384c565b92915050565b60006020828403121561388e5761388d613838565b5b600061389c84828501613863565b91505092915050565b60008115159050919050565b6138ba816138a5565b82525050565b60006020820190506138d560008301846138b1565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613910816138db565b811461391b57600080fd5b50565b60008135905061392d81613907565b92915050565b60006020828403121561394957613948613838565b5b60006139578482850161391e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561399a57808201518184015260208101905061397f565b60008484015250505050565b6000601f19601f8301169050919050565b60006139c282613960565b6139cc818561396b565b93506139dc81856020860161397c565b6139e5816139a6565b840191505092915050565b60006020820190508181036000830152613a0a81846139b7565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a3d82613a12565b9050919050565b613a4d81613a32565b82525050565b6000602082019050613a686000830184613a44565b92915050565b613a7781613a32565b8114613a8257600080fd5b50565b600081359050613a9481613a6e565b92915050565b60008060408385031215613ab157613ab0613838565b5b6000613abf85828601613a85565b9250506020613ad085828601613863565b9150509250929050565b613ae381613842565b82525050565b6000602082019050613afe6000830184613ada565b92915050565b60008060408385031215613b1b57613b1a613838565b5b6000613b2985828601613863565b9250506020613b3a85828601613a85565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b86826139a6565b810181811067ffffffffffffffff82111715613ba557613ba4613b4e565b5b80604052505050565b6000613bb861382e565b9050613bc48282613b7d565b919050565b600067ffffffffffffffff821115613be457613be3613b4e565b5b613bed826139a6565b9050602081019050919050565b82818337600083830152505050565b6000613c1c613c1784613bc9565b613bae565b905082815260208101848484011115613c3857613c37613b49565b5b613c43848285613bfa565b509392505050565b600082601f830112613c6057613c5f613b44565b5b8135613c70848260208601613c09565b91505092915050565b600060208284031215613c8f57613c8e613838565b5b600082013567ffffffffffffffff811115613cad57613cac61383d565b5b613cb984828501613c4b565b91505092915050565b60008060408385031215613cd957613cd8613838565b5b6000613ce785828601613863565b925050602083013567ffffffffffffffff811115613d0857613d0761383d565b5b613d1485828601613c4b565b9150509250929050565b600080600060608486031215613d3757613d36613838565b5b6000613d4586828701613a85565b9350506020613d5686828701613a85565b9250506040613d6786828701613863565b9150509250925092565b600060208284031215613d8757613d86613838565b5b6000613d9584828501613a85565b91505092915050565b6000819050919050565b6000613dc3613dbe613db984613a12565b613d9e565b613a12565b9050919050565b6000613dd582613da8565b9050919050565b6000613de782613dca565b9050919050565b613df781613ddc565b82525050565b6000602082019050613e126000830184613dee565b92915050565b613e21816138a5565b8114613e2c57600080fd5b50565b600081359050613e3e81613e18565b92915050565b600060208284031215613e5a57613e59613838565b5b6000613e6884828501613e2f565b91505092915050565b60008060408385031215613e8857613e87613838565b5b6000613e9685828601613a85565b9250506020613ea785828601613e2f565b9150509250929050565b600067ffffffffffffffff821115613ecc57613ecb613b4e565b5b613ed5826139a6565b9050602081019050919050565b6000613ef5613ef084613eb1565b613bae565b905082815260208101848484011115613f1157613f10613b49565b5b613f1c848285613bfa565b509392505050565b600082601f830112613f3957613f38613b44565b5b8135613f49848260208601613ee2565b91505092915050565b60008060008060808587031215613f6c57613f6b613838565b5b6000613f7a87828801613a85565b9450506020613f8b87828801613a85565b9350506040613f9c87828801613863565b925050606085013567ffffffffffffffff811115613fbd57613fbc61383d565b5b613fc987828801613f24565b91505092959194509250565b60008060408385031215613fec57613feb613838565b5b6000613ffa85828601613a85565b925050602061400b85828601613a85565b9150509250929050565b7f43616c6c6572206973206e6f7420617574686f72697a65640000000000000000600082015250565b600061404b60188361396b565b915061405682614015565b602082019050919050565b6000602082019050818103600083015261407a8161403e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140c857607f821691505b6020821081036140db576140da614081565b5b50919050565b60006040820190506140f66000830185613a44565b6141036020830184613a44565b9392505050565b60008151905061411981613e18565b92915050565b60006020828403121561413557614134613838565b5b60006141438482850161410a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061418682613842565b915061419183613842565b92508282019050808211156141a9576141a861414c565b5b92915050565b7f546f6b656e20726561636865732074686520746f74616c20636170206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061420b60218361396b565b9150614216826141af565b604082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b7f5075626c6963206d696e6974696e67206973206e6f7420616c6c6f7765640000600082015250565b6000614277601e8361396b565b915061428282614241565b602082019050919050565b600060208201905081810360008301526142a68161426a565b9050919050565b7f496e73756666696369656e742042616c616e6365000000000000000000000000600082015250565b60006142e360148361396b565b91506142ee826142ad565b602082019050919050565b60006020820190508181036000830152614312816142d6565b9050919050565b7f546f6b656e4964206973206e6f74206578697374000000000000000000000000600082015250565b600061434f60148361396b565b915061435a82614319565b602082019050919050565b6000602082019050818103600083015261437e81614342565b9050919050565b7f43616c6c6572206973206e6f7420746f6b656e206f776e657200000000000000600082015250565b60006143bb60198361396b565b91506143c682614385565b602082019050919050565b600060208201905081810360008301526143ea816143ae565b9050919050565b7f696e73756666696369656e7420546f6b656e2042616c616e6365000000000000600082015250565b6000614427601a8361396b565b9150614432826143f1565b602082019050919050565b600060208201905081810360008301526144568161441a565b9050919050565b7f546f6b656e20726561636865732074686520696e697469616c206c696d697400600082015250565b6000614493601f8361396b565b915061449e8261445d565b602082019050919050565b600060208201905081810360008301526144c281614486565b9050919050565b7f50726976617465206d696e6974696e67206973206e6f7420616c6c6f77656400600082015250565b60006144ff601f8361396b565b915061450a826144c9565b602082019050919050565b6000602082019050818103600083015261452e816144f2565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061456b60188361396b565b915061457682614535565b602082019050919050565b6000602082019050818103600083015261459a8161455e565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006145fd60298361396b565b9150614608826145a1565b604082019050919050565b6000602082019050818103600083015261462c816145f0565b9050919050565b60006040820190506146486000830185613a44565b61465560208301846138b1565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146b860268361396b565b91506146c38261465c565b604082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061474a60218361396b565b9150614755826146ee565b604082019050919050565b600060208201905081810360008301526147798161473d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006147dc603d8361396b565b91506147e782614780565b604082019050919050565b6000602082019050818103600083015261480b816147cf565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b600061486e602e8361396b565b915061487982614812565b604082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148c9565b61491086836148c9565b95508019841693508086168417925050509392505050565b600061494361493e61493984613842565b613d9e565b613842565b9050919050565b6000819050919050565b61495d83614928565b6149716149698261494a565b8484546148d6565b825550505050565b600090565b614986614979565b614991818484614954565b505050565b5b818110156149b5576149aa60008261497e565b600181019050614997565b5050565b601f8211156149fa576149cb816148a4565b6149d4846148b9565b810160208510156149e3578190505b6149f76149ef856148b9565b830182614996565b50505b505050565b600082821c905092915050565b6000614a1d600019846008026149ff565b1980831691505092915050565b6000614a368383614a0c565b9150826002028217905092915050565b614a4f82613960565b67ffffffffffffffff811115614a6857614a67613b4e565b5b614a7282546140b0565b614a7d8282856149b9565b600060209050601f831160018114614ab05760008415614a9e578287015190505b614aa88582614a2a565b865550614b10565b601f198416614abe866148a4565b60005b82811015614ae657848901518255600182019150602085019450602081019050614ac1565b86831015614b035784890151614aff601f891682614a0c565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614b74602d8361396b565b9150614b7f82614b18565b604082019050919050565b60006020820190508181036000830152614ba381614b67565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614be060208361396b565b9150614beb82614baa565b602082019050919050565b60006020820190508181036000830152614c0f81614bd3565b9050919050565b600081905092915050565b6000614c2c82613960565b614c368185614c16565b9350614c4681856020860161397c565b80840191505092915050565b6000614c5e8285614c21565b9150614c6a8284614c21565b91508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614cd260328361396b565b9150614cdd82614c76565b604082019050919050565b60006020820190508181036000830152614d0181614cc5565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614d6460258361396b565b9150614d6f82614d08565b604082019050919050565b60006020820190508181036000830152614d9381614d57565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614df660248361396b565b9150614e0182614d9a565b604082019050919050565b60006020820190508181036000830152614e2581614de9565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e6260198361396b565b9150614e6d82614e2c565b602082019050919050565b60006020820190508181036000830152614e9181614e55565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ece60208361396b565b9150614ed982614e98565b602082019050919050565b60006020820190508181036000830152614efd81614ec1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f3a601c8361396b565b9150614f4582614f04565b602082019050919050565b60006020820190508181036000830152614f6981614f2d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614f9782614f70565b614fa18185614f7b565b9350614fb181856020860161397c565b614fba816139a6565b840191505092915050565b6000608082019050614fda6000830187613a44565b614fe76020830186613a44565b614ff46040830185613ada565b81810360608301526150068184614f8c565b905095945050505050565b60008151905061502081613907565b92915050565b60006020828403121561503c5761503b613838565b5b600061504a84828501615011565b91505092915050565b600061505e82613842565b915061506983613842565b92508282039050818111156150815761508061414c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea2646970667358221220273a5fc498365ee70442de82384de44accd8868b808625c541ccb1a5bf8bbd5264736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008ae00000000000000000000000000000000000000000000000000000000000015b300000000000000000000000000000000000000000000000000f5232269808000000000000000000000000000000000000000000000000000013c310749028000000000000000000000000000000000000000000000000000000000000000000f546865496e63757273696f6e4e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003494e430000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023a5760003560e01c806375d03f461161012e57806395d89b41116100ab578063e1fd6a3f1161006f578063e1fd6a3f146108a4578063e5034458146108cf578063e9317a51146108fa578063e985e9c514610937578063f2fde38b146109745761023a565b806395d89b41146107ad578063a22cb465146107d8578063b08f0b8514610801578063b88d4fde1461083e578063c87b56dd146108675761023a565b806386e631e9116100f257806386e631e9146106b25780638b3d95a7146106dd5780638d15cdbf1461071a5780638da5cb5b14610757578063927c88ae146107825761023a565b806375d03f46146105dd57806376809ce31461060857806378a89567146106335780637b47ec1a1461065e578063865c09ae146106875761023a565b806331d5944c116101bc5780634adbe551116101805780634adbe551146104e45780635a64e8c01461050f5780636352211e1461054c57806370a0823114610589578063715018a6146105c65761023a565b806331d5944c1461042057806331dd6a6c1461043c57806336e96d481461046557806341f434341461049057806342842e0e146104bb5761023a565b806318160ddd1161020357806318160ddd1461034a5780631f3203311461037557806321fbc2aa146103b2578063237e5fa8146103ce57806323b872dd146103f75761023a565b80620e05491461023f57806301ffc9a71461027c57806306fdde03146102b9578063081812fc146102e4578063095ea7b314610321575b600080fd5b34801561024b57600080fd5b5061026660048036038101906102619190613878565b61099d565b60405161027391906138c0565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613933565b610a3f565b6040516102b091906138c0565b60405180910390f35b3480156102c557600080fd5b506102ce610b21565b6040516102db91906139f0565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613878565b610bb3565b6040516103189190613a53565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190613a9a565b610bf9565b005b34801561035657600080fd5b5061035f610d03565b60405161036c9190613ae9565b60405180910390f35b34801561038157600080fd5b5061039c60048036038101906103979190613b04565b610d11565b6040516103a99190613ae9565b60405180910390f35b6103cc60048036038101906103c79190613c79565b610d36565b005b3480156103da57600080fd5b506103f560048036038101906103f09190613cc2565b610f11565b005b34801561040357600080fd5b5061041e60048036038101906104199190613d1e565b611071565b005b61043a60048036038101906104359190613c79565b6111c1565b005b34801561044857600080fd5b50610463600480360381019061045e9190613d71565b61138f565b005b34801561047157600080fd5b5061047a6113db565b6040516104879190613ae9565b60405180910390f35b34801561049c57600080fd5b506104a56113e1565b6040516104b29190613dfd565b60405180910390f35b3480156104c757600080fd5b506104e260048036038101906104dd9190613d1e565b6113f3565b005b3480156104f057600080fd5b506104f9611543565b6040516105069190613a53565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613878565b611569565b60405161054391906138c0565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613878565b61160b565b6040516105809190613a53565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab9190613d71565b611691565b6040516105bd9190613ae9565b60405180910390f35b3480156105d257600080fd5b506105db611748565b005b3480156105e957600080fd5b506105f261175c565b6040516105ff9190613ae9565b60405180910390f35b34801561061457600080fd5b5061061d611762565b60405161062a9190613ae9565b60405180910390f35b34801561063f57600080fd5b50610648611768565b6040516106559190613ae9565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613878565b611809565b005b34801561069357600080fd5b5061069c6119f4565b6040516106a99190613a53565b60405180910390f35b3480156106be57600080fd5b506106c7611a1e565b6040516106d49190613ae9565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613878565b611a24565b60405161071191906138c0565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c9190613e44565b611ac6565b60405161074e91906138c0565b60405180910390f35b34801561076357600080fd5b5061076c611bc3565b6040516107799190613a53565b60405180910390f35b34801561078e57600080fd5b50610797611bed565b6040516107a49190613ae9565b60405180910390f35b3480156107b957600080fd5b506107c2611bf3565b6040516107cf91906139f0565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190613e71565b611c85565b005b34801561080d57600080fd5b5061082860048036038101906108239190613e44565b611d8f565b60405161083591906138c0565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190613f52565b611e8c565b005b34801561087357600080fd5b5061088e60048036038101906108899190613878565b611fdf565b60405161089b91906139f0565b60405180910390f35b3480156108b057600080fd5b506108b9611ff1565b6040516108c691906138c0565b60405180910390f35b3480156108db57600080fd5b506108e4612008565b6040516108f191906138c0565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c9190613878565b61201f565b60405161092e91906138c0565b60405180910390f35b34801561094357600080fd5b5061095e60048036038101906109599190613fd5565b6120c1565b60405161096b91906138c0565b60405180910390f35b34801561098057600080fd5b5061099b60048036038101906109969190613d71565b612155565b005b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690614061565b60405180910390fd5b81600c8190555060019050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1a5750610b19826121d8565b5b9050919050565b606060008054610b30906140b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c906140b0565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b5050505050905090565b6000610bbe82612242565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cf4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c719291906140e1565b602060405180830381865afa158015610c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb2919061411f565b610cf357806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cea9190613a53565b60405180910390fd5b5b610cfe838361228d565b505050565b6000600c54600b5401905090565b6009602052816000526040600020602052806000526040600020600091509150505481565b600c54600b54610d46919061417b565b610d5060086123a4565b10610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790614221565b60405180910390fd5b60001515600a60019054906101000a900460ff16151514610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd9061428d565b60405180910390fd5b600034118015610df85750600e543410155b610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e906142f9565b60405180910390fd5b610e4160086123b2565b6000610e4d60086123a4565b9050610e5933826123c8565b610e6381836123e6565b60016009600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000610ec3611bc3565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610f0b573d6000803e3d6000fd5b50505050565b610f1a82612453565b610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090614365565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610f798361160b565b73ffffffffffffffffffffffffffffffffffffffff1614610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc6906143d1565b60405180910390fd5b60016009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105a9061443d565b60405180910390fd5b61106d82826123e6565b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156111af573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110e3576110de848484612494565b6111bb565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161112c9291906140e1565b602060405180830381865afa158015611149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116d919061411f565b6111ae57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016111a59190613a53565b60405180910390fd5b5b6111ba848484612494565b5b50505050565b600b546111ce60086123a4565b1061120e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611205906144a9565b60405180910390fd5b60001515600a60009054906101000a900460ff16151514611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90614515565b60405180910390fd5b6000341180156112765750600d543410155b6112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906142f9565b60405180910390fd5b6112bf60086123b2565b60006112cb60086123a4565b90506112d733826123c8565b6112e181836123e6565b60016009600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000611341611bc3565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611389573d6000803e3d6000fd5b50505050565b6113976124f4565b80600a60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611531573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361146557611460848484612572565b61153d565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016114ae9291906140e1565b602060405180830381865afa1580156114cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ef919061411f565b61153057336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115279190613a53565b60405180910390fd5b5b61153c848484612572565b5b50505050565b600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290614061565b60405180910390fd5b81600b8190555060019050919050565b60008061161783612592565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614581565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890614613565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117506124f4565b61175a60006125cf565b565b600b5481565b600f5481565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614061565b60405180910390fd5b61180460086123a4565b905090565b3373ffffffffffffffffffffffffffffffffffffffff16600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189090614061565b60405180910390fd5b6118a281612453565b6118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d890614365565b60405180910390fd5b60006118ec8261160b565b905060006009600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001811015611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e9061443d565b60405180910390fd5b61199083612695565b60016009600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550505050565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614061565b60405180910390fd5b81600d8190555060019050919050565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614061565b60405180910390fd5b81600a60006101000a81548160ff0219169083151502179055507ff022c1fbc00daf4d2e6cdc62e0338b967bd3be38ccc3d7f8e0168bd668c7bcfe33600a60009054906101000a900460ff16604051611bb2929190614633565b60405180910390a160019050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b606060018054611c02906140b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2e906140b0565b8015611c7b5780601f10611c5057610100808354040283529160200191611c7b565b820191906000526020600020905b815481529060010190602001808311611c5e57829003601f168201915b5050505050905090565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d80576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611cfd9291906140e1565b602060405180830381865afa158015611d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3e919061411f565b611d7f57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d769190613a53565b60405180910390fd5b5b611d8a83836126a1565b505050565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890614061565b60405180910390fd5b81600a60016101000a81548160ff0219169083151502179055507ff022c1fbc00daf4d2e6cdc62e0338b967bd3be38ccc3d7f8e0168bd668c7bcfe33600a60019054906101000a900460ff16604051611e7b929190614633565b60405180910390a160019050919050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611fcb573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eff57611efa858585856126b7565b611fd8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f489291906140e1565b602060405180830381865afa158015611f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f89919061411f565b611fca57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611fc19190613a53565b60405180910390fd5b5b611fd7858585856126b7565b5b5050505050565b6060611fea82612719565b9050919050565b6000600a60009054906101000a900460ff16905090565b6000600a60019054906101000a900460ff16905090565b6000600a60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a890614061565b60405180910390fd5b81600e8190555060019050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61215d6124f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906146ce565b60405180910390fd5b6121d5816125cf565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61224b81612453565b61228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228190614581565b60405180910390fd5b50565b60006122988261160b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff90614760565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661232761282b565b73ffffffffffffffffffffffffffffffffffffffff16148061235657506123558161235061282b565b6120c1565b5b612395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238c906147f2565b60405180910390fd5b61239f8383612833565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6123e28282604051806020016040528060008152506128ec565b5050565b6123ef82612453565b61242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242590614884565b60405180910390fd5b8060066000848152602001908152602001600020908161244e9190614a46565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661247583612592565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6124a561249f61282b565b82612947565b6124e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124db90614b8a565b60405180910390fd5b6124ef8383836129dc565b505050565b6124fc61282b565b73ffffffffffffffffffffffffffffffffffffffff1661251a611bc3565b73ffffffffffffffffffffffffffffffffffffffff1614612570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256790614bf6565b60405180910390fd5b565b61258d83838360405180602001604052806000815250611e8c565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61269e81612cd5565b50565b6126b36126ac61282b565b8383612d28565b5050565b6126c86126c261282b565b83612947565b612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90614b8a565b60405180910390fd5b61271384848484612e94565b50505050565b606061272482612242565b6000600660008481526020019081526020016000208054612744906140b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612770906140b0565b80156127bd5780601f10612792576101008083540402835291602001916127bd565b820191906000526020600020905b8154815290600101906020018083116127a057829003601f168201915b5050505050905060006127ce612ef0565b905060008151036127e3578192505050612826565b600082511115612818578082604051602001612800929190614c52565b60405160208183030381529060405292505050612826565b61282184612f07565b925050505b919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128a68361160b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6128f68383612f6f565b612903600084848461318c565b612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990614ce8565b60405180910390fd5b505050565b6000806129538361160b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612995575061299481856120c1565b5b806129d357508373ffffffffffffffffffffffffffffffffffffffff166129bb84610bb3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129fc8261160b565b73ffffffffffffffffffffffffffffffffffffffff1614612a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4990614d7a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab890614e0c565b60405180910390fd5b612ace8383836001613313565b8273ffffffffffffffffffffffffffffffffffffffff16612aee8261160b565b73ffffffffffffffffffffffffffffffffffffffff1614612b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3b90614d7a565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cd08383836001613439565b505050565b612cde8161343f565b6000600660008381526020019081526020016000208054612cfe906140b0565b905014612d2557600660008281526020019081526020016000206000612d2491906137d1565b5b50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8d90614e78565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e8791906138c0565b60405180910390a3505050565b612e9f8484846129dc565b612eab8484848461318c565b612eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee190614ce8565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060612f1282612242565b6000612f1c612ef0565b90506000815111612f3c5760405180602001604052806000815250612f67565b80612f468461358d565b604051602001612f57929190614c52565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd590614ee4565b60405180910390fd5b612fe781612453565b15613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e90614f50565b60405180910390fd5b613035600083836001613313565b61303e81612453565b1561307e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307590614f50565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613188600083836001613439565b5050565b60006131ad8473ffffffffffffffffffffffffffffffffffffffff1661365b565b15613306578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131d661282b565b8786866040518563ffffffff1660e01b81526004016131f89493929190614fc5565b6020604051808303816000875af192505050801561323457506040513d601f19601f820116820180604052508101906132319190615026565b60015b6132b6573d8060008114613264576040519150601f19603f3d011682016040523d82523d6000602084013e613269565b606091505b5060008151036132ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a590614ce8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061330b565b600190505b949350505050565b600181111561343357600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146133a75780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461339f9190615053565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134325780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461342a919061417b565b925050819055505b5b50505050565b50505050565b600061344a8261160b565b905061345a816000846001613313565b6134638261160b565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613589816000846001613439565b5050565b60606000600161359c8461367e565b01905060008167ffffffffffffffff8111156135bb576135ba613b4e565b5b6040519080825280601f01601f1916602001820160405280156135ed5781602001600182028036833780820191505090505b509050600082602001820190505b600115613650578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161364457613643615087565b5b049450600085036135fb575b819350505050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136dc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816136d2576136d1615087565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613719576d04ee2d6d415b85acef8100000000838161370f5761370e615087565b5b0492506020810190505b662386f26fc10000831061374857662386f26fc10000838161373e5761373d615087565b5b0492506010810190505b6305f5e1008310613771576305f5e100838161376757613766615087565b5b0492506008810190505b612710831061379657612710838161378c5761378b615087565b5b0492506004810190505b606483106137b957606483816137af576137ae615087565b5b0492506002810190505b600a83106137c8576001810190505b80915050919050565b5080546137dd906140b0565b6000825580601f106137ef575061380e565b601f01602090049060005260206000209081019061380d9190613811565b5b50565b5b8082111561382a576000816000905550600101613812565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61385581613842565b811461386057600080fd5b50565b6000813590506138728161384c565b92915050565b60006020828403121561388e5761388d613838565b5b600061389c84828501613863565b91505092915050565b60008115159050919050565b6138ba816138a5565b82525050565b60006020820190506138d560008301846138b1565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613910816138db565b811461391b57600080fd5b50565b60008135905061392d81613907565b92915050565b60006020828403121561394957613948613838565b5b60006139578482850161391e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561399a57808201518184015260208101905061397f565b60008484015250505050565b6000601f19601f8301169050919050565b60006139c282613960565b6139cc818561396b565b93506139dc81856020860161397c565b6139e5816139a6565b840191505092915050565b60006020820190508181036000830152613a0a81846139b7565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a3d82613a12565b9050919050565b613a4d81613a32565b82525050565b6000602082019050613a686000830184613a44565b92915050565b613a7781613a32565b8114613a8257600080fd5b50565b600081359050613a9481613a6e565b92915050565b60008060408385031215613ab157613ab0613838565b5b6000613abf85828601613a85565b9250506020613ad085828601613863565b9150509250929050565b613ae381613842565b82525050565b6000602082019050613afe6000830184613ada565b92915050565b60008060408385031215613b1b57613b1a613838565b5b6000613b2985828601613863565b9250506020613b3a85828601613a85565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b86826139a6565b810181811067ffffffffffffffff82111715613ba557613ba4613b4e565b5b80604052505050565b6000613bb861382e565b9050613bc48282613b7d565b919050565b600067ffffffffffffffff821115613be457613be3613b4e565b5b613bed826139a6565b9050602081019050919050565b82818337600083830152505050565b6000613c1c613c1784613bc9565b613bae565b905082815260208101848484011115613c3857613c37613b49565b5b613c43848285613bfa565b509392505050565b600082601f830112613c6057613c5f613b44565b5b8135613c70848260208601613c09565b91505092915050565b600060208284031215613c8f57613c8e613838565b5b600082013567ffffffffffffffff811115613cad57613cac61383d565b5b613cb984828501613c4b565b91505092915050565b60008060408385031215613cd957613cd8613838565b5b6000613ce785828601613863565b925050602083013567ffffffffffffffff811115613d0857613d0761383d565b5b613d1485828601613c4b565b9150509250929050565b600080600060608486031215613d3757613d36613838565b5b6000613d4586828701613a85565b9350506020613d5686828701613a85565b9250506040613d6786828701613863565b9150509250925092565b600060208284031215613d8757613d86613838565b5b6000613d9584828501613a85565b91505092915050565b6000819050919050565b6000613dc3613dbe613db984613a12565b613d9e565b613a12565b9050919050565b6000613dd582613da8565b9050919050565b6000613de782613dca565b9050919050565b613df781613ddc565b82525050565b6000602082019050613e126000830184613dee565b92915050565b613e21816138a5565b8114613e2c57600080fd5b50565b600081359050613e3e81613e18565b92915050565b600060208284031215613e5a57613e59613838565b5b6000613e6884828501613e2f565b91505092915050565b60008060408385031215613e8857613e87613838565b5b6000613e9685828601613a85565b9250506020613ea785828601613e2f565b9150509250929050565b600067ffffffffffffffff821115613ecc57613ecb613b4e565b5b613ed5826139a6565b9050602081019050919050565b6000613ef5613ef084613eb1565b613bae565b905082815260208101848484011115613f1157613f10613b49565b5b613f1c848285613bfa565b509392505050565b600082601f830112613f3957613f38613b44565b5b8135613f49848260208601613ee2565b91505092915050565b60008060008060808587031215613f6c57613f6b613838565b5b6000613f7a87828801613a85565b9450506020613f8b87828801613a85565b9350506040613f9c87828801613863565b925050606085013567ffffffffffffffff811115613fbd57613fbc61383d565b5b613fc987828801613f24565b91505092959194509250565b60008060408385031215613fec57613feb613838565b5b6000613ffa85828601613a85565b925050602061400b85828601613a85565b9150509250929050565b7f43616c6c6572206973206e6f7420617574686f72697a65640000000000000000600082015250565b600061404b60188361396b565b915061405682614015565b602082019050919050565b6000602082019050818103600083015261407a8161403e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140c857607f821691505b6020821081036140db576140da614081565b5b50919050565b60006040820190506140f66000830185613a44565b6141036020830184613a44565b9392505050565b60008151905061411981613e18565b92915050565b60006020828403121561413557614134613838565b5b60006141438482850161410a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061418682613842565b915061419183613842565b92508282019050808211156141a9576141a861414c565b5b92915050565b7f546f6b656e20726561636865732074686520746f74616c20636170206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061420b60218361396b565b9150614216826141af565b604082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b7f5075626c6963206d696e6974696e67206973206e6f7420616c6c6f7765640000600082015250565b6000614277601e8361396b565b915061428282614241565b602082019050919050565b600060208201905081810360008301526142a68161426a565b9050919050565b7f496e73756666696369656e742042616c616e6365000000000000000000000000600082015250565b60006142e360148361396b565b91506142ee826142ad565b602082019050919050565b60006020820190508181036000830152614312816142d6565b9050919050565b7f546f6b656e4964206973206e6f74206578697374000000000000000000000000600082015250565b600061434f60148361396b565b915061435a82614319565b602082019050919050565b6000602082019050818103600083015261437e81614342565b9050919050565b7f43616c6c6572206973206e6f7420746f6b656e206f776e657200000000000000600082015250565b60006143bb60198361396b565b91506143c682614385565b602082019050919050565b600060208201905081810360008301526143ea816143ae565b9050919050565b7f696e73756666696369656e7420546f6b656e2042616c616e6365000000000000600082015250565b6000614427601a8361396b565b9150614432826143f1565b602082019050919050565b600060208201905081810360008301526144568161441a565b9050919050565b7f546f6b656e20726561636865732074686520696e697469616c206c696d697400600082015250565b6000614493601f8361396b565b915061449e8261445d565b602082019050919050565b600060208201905081810360008301526144c281614486565b9050919050565b7f50726976617465206d696e6974696e67206973206e6f7420616c6c6f77656400600082015250565b60006144ff601f8361396b565b915061450a826144c9565b602082019050919050565b6000602082019050818103600083015261452e816144f2565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061456b60188361396b565b915061457682614535565b602082019050919050565b6000602082019050818103600083015261459a8161455e565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006145fd60298361396b565b9150614608826145a1565b604082019050919050565b6000602082019050818103600083015261462c816145f0565b9050919050565b60006040820190506146486000830185613a44565b61465560208301846138b1565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146b860268361396b565b91506146c38261465c565b604082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061474a60218361396b565b9150614755826146ee565b604082019050919050565b600060208201905081810360008301526147798161473d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006147dc603d8361396b565b91506147e782614780565b604082019050919050565b6000602082019050818103600083015261480b816147cf565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b600061486e602e8361396b565b915061487982614812565b604082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148c9565b61491086836148c9565b95508019841693508086168417925050509392505050565b600061494361493e61493984613842565b613d9e565b613842565b9050919050565b6000819050919050565b61495d83614928565b6149716149698261494a565b8484546148d6565b825550505050565b600090565b614986614979565b614991818484614954565b505050565b5b818110156149b5576149aa60008261497e565b600181019050614997565b5050565b601f8211156149fa576149cb816148a4565b6149d4846148b9565b810160208510156149e3578190505b6149f76149ef856148b9565b830182614996565b50505b505050565b600082821c905092915050565b6000614a1d600019846008026149ff565b1980831691505092915050565b6000614a368383614a0c565b9150826002028217905092915050565b614a4f82613960565b67ffffffffffffffff811115614a6857614a67613b4e565b5b614a7282546140b0565b614a7d8282856149b9565b600060209050601f831160018114614ab05760008415614a9e578287015190505b614aa88582614a2a565b865550614b10565b601f198416614abe866148a4565b60005b82811015614ae657848901518255600182019150602085019450602081019050614ac1565b86831015614b035784890151614aff601f891682614a0c565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614b74602d8361396b565b9150614b7f82614b18565b604082019050919050565b60006020820190508181036000830152614ba381614b67565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614be060208361396b565b9150614beb82614baa565b602082019050919050565b60006020820190508181036000830152614c0f81614bd3565b9050919050565b600081905092915050565b6000614c2c82613960565b614c368185614c16565b9350614c4681856020860161397c565b80840191505092915050565b6000614c5e8285614c21565b9150614c6a8284614c21565b91508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614cd260328361396b565b9150614cdd82614c76565b604082019050919050565b60006020820190508181036000830152614d0181614cc5565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614d6460258361396b565b9150614d6f82614d08565b604082019050919050565b60006020820190508181036000830152614d9381614d57565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614df660248361396b565b9150614e0182614d9a565b604082019050919050565b60006020820190508181036000830152614e2581614de9565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e6260198361396b565b9150614e6d82614e2c565b602082019050919050565b60006020820190508181036000830152614e9181614e55565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ece60208361396b565b9150614ed982614e98565b602082019050919050565b60006020820190508181036000830152614efd81614ec1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f3a601c8361396b565b9150614f4582614f04565b602082019050919050565b60006020820190508181036000830152614f6981614f2d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614f9782614f70565b614fa18185614f7b565b9350614fb181856020860161397c565b614fba816139a6565b840191505092915050565b6000608082019050614fda6000830187613a44565b614fe76020830186613a44565b614ff46040830185613ada565b81810360608301526150068184614f8c565b905095945050505050565b60008151905061502081613907565b92915050565b60006020828403121561503c5761503b613838565b5b600061504a84828501615011565b91505092915050565b600061505e82613842565b915061506983613842565b92508282039050818111156150815761508061414c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea2646970667358221220273a5fc498365ee70442de82384de44accd8868b808625c541ccb1a5bf8bbd5264736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008ae00000000000000000000000000000000000000000000000000000000000015b300000000000000000000000000000000000000000000000000f5232269808000000000000000000000000000000000000000000000000000013c310749028000000000000000000000000000000000000000000000000000000000000000000f546865496e63757273696f6e4e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003494e430000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): TheIncursionNFT
Arg [1] : _symbol (string): INC
Arg [2] : _privateMintTokenLimit (uint256): 2222
Arg [3] : _publicMintTokenLimit (uint256): 5555
Arg [4] : _tokenPrivateSalePrice (uint256): 69000000000000000
Arg [5] : _tokenPublicSalePrice (uint256): 89000000000000000

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000000000000000000000000000000000000000008ae
Arg [3] : 00000000000000000000000000000000000000000000000000000000000015b3
Arg [4] : 00000000000000000000000000000000000000000000000000f5232269808000
Arg [5] : 000000000000000000000000000000000000000000000000013c310749028000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [7] : 546865496e63757273696f6e4e46540000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 494e430000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

63492:7637:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66274:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45613:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46541:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48053:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70383:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66974:164;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63759:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68080:730;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69081:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70548:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67376:696;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64887:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63975:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2889:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70719:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63896:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66042:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46251:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45982:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25044:103;;;;;;;;;;;;;:::i;:::-;;63932:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64102:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67195:173;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69470:594;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64782:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64060:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66504:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65429:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24396:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64017:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46710:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70199:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65778:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70898:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68818:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65070:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65240:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66740:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48522:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25302:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66274:222;66339:4;66378:14;;;;;;;;;;;66364:28;;:10;:28;;;66356:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66455:11;66432:20;:34;;;;66484:4;66477:11;;66274:222;;;:::o;45613:305::-;45715:4;45767:25;45752:40;;;:11;:40;;;;:105;;;;45824:33;45809:48;;;:11;:48;;;;45752:105;:158;;;;45874:36;45898:11;45874:23;:36::i;:::-;45752:158;45732:178;;45613:305;;;:::o;46541:100::-;46595:13;46628:5;46621:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46541:100;:::o;48053:171::-;48129:7;48149:23;48164:7;48149:14;:23::i;:::-;48192:15;:24;48208:7;48192:24;;;;;;;;;;;;;;;;;;;;;48185:31;;48053:171;;;:::o;70383:157::-;70479:8;4931:1;2989:42;4883:45;;;:49;4879:225;;;2989:42;4954;;;5005:4;5012:8;4954:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4949:144;;5068:8;5049:28;;;;;;;;;;;:::i;:::-;;;;;;;;4949:144;4879:225;70500:32:::1;70514:8;70524:7;70500:13;:32::i;:::-;70383:157:::0;;;:::o;66974:164::-;67017:13;67099:20;;67075:21;;:44;67068:51;;66974:164;:::o;63759:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68080:730::-;68213:20;;68189:21;;:44;;;;:::i;:::-;68165:20;:10;:18;:20::i;:::-;:69;68157:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;68308:5;68291:22;;:13;;;;;;;;;;;:22;;;68283:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;68380:1;68368:9;:13;:50;;;;;68398:20;;68385:9;:33;;68368:50;68360:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;68454:22;:10;:20;:22::i;:::-;68487:15;68505:20;:10;:18;:20::i;:::-;68487:38;;68536:30;68546:10;68558:7;68536:9;:30::i;:::-;68577:34;68590:7;68599:11;68577:12;:34::i;:::-;68654:1;68622:8;:17;68631:7;68622:17;;;;;;;;;;;:29;68640:10;68622:29;;;;;;;;;;;;;;;:33;;;;68718:21;68750:7;:5;:7::i;:::-;68718:40;;68769:5;:14;;:25;68784:9;68769:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68146:664;;68080:730;:::o;69081:363::-;69176:17;69184:8;69176:7;:17::i;:::-;69168:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;69264:10;69236:38;;:24;69251:8;69236:14;:24::i;:::-;:38;;;69228:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;69357:1;69323:8;:18;69332:8;69323:18;;;;;;;;;;;:30;69342:10;69323:30;;;;;;;;;;;;;;;;:35;;69315:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;69400:36;69413:8;69423:12;69400;:36::i;:::-;69081:363;;:::o;70548:163::-;70649:4;4185:1;2989:42;4137:45;;;:49;4133:539;;;4426:10;4418:18;;:4;:18;;;4414:85;;70666:37:::1;70685:4;70691:2;70695:7;70666:18;:37::i;:::-;4477:7:::0;;4414:85;2989:42;4518;;;4569:4;4576:10;4518:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4513:148;;4634:10;4615:30;;;;;;;;;;;:::i;:::-;;;;;;;;4513:148;4133:539;70666:37:::1;70685:4;70691:2;70695:7;70666:18;:37::i;:::-;70548:163:::0;;;;;:::o;67376:696::-;67484:21;;67461:20;:10;:18;:20::i;:::-;:44;67453:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;67577:5;67559:23;;:14;;;;;;;;;;;:23;;;67551:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;67649:1;67637:9;:13;:51;;;;;67667:21;;67654:9;:34;;67637:51;67629:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;67724:22;:10;:20;:22::i;:::-;67757:15;67775:20;:10;:18;:20::i;:::-;67757:38;;67806:30;67816:10;67828:7;67806:9;:30::i;:::-;67847:34;67860:7;67869:11;67847:12;:34::i;:::-;67924:1;67892:8;:17;67901:7;67892:17;;;;;;;;;;;:29;67910:10;67892:29;;;;;;;;;;;;;;;:33;;;;67988:21;68020:7;:5;:7::i;:::-;67988:40;;68039:5;:14;;:25;68054:9;68039:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67443:629;;67376:696;:::o;64887:112::-;24282:13;:11;:13::i;:::-;64980:11:::1;64963:14;;:28;;;;;;;;;;;;;;;;;;64887:112:::0;:::o;63975:35::-;;;;:::o;2889:143::-;2989:42;2889:143;:::o;70719:171::-;70824:4;4185:1;2989:42;4137:45;;;:49;4133:539;;;4426:10;4418:18;;:4;:18;;;4414:85;;70841:41:::1;70864:4;70870:2;70874:7;70841:22;:41::i;:::-;4477:7:::0;;4414:85;2989:42;4518;;;4569:4;4576:10;4518:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4513:148;;4634:10;4615:30;;;;;;;;;;;:::i;:::-;;;;;;;;4513:148;4133:539;70841:41:::1;70864:4;70870:2;70874:7;70841:22;:41::i;:::-;70719:171:::0;;;;;:::o;63896:29::-;;;;;;;;;;;;;:::o;66042:224::-;66108:4;66147:14;;;;;;;;;;;66133:28;;:10;:28;;;66125:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66225:11;66201:21;:35;;;;66254:4;66247:11;;66042:224;;;:::o;46251:223::-;46323:7;46343:13;46359:17;46368:7;46359:8;:17::i;:::-;46343:33;;46412:1;46395:19;;:5;:19;;;46387:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;46461:5;46454:12;;;46251:223;;;:::o;45982:207::-;46054:7;46099:1;46082:19;;:5;:19;;;46074:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46165:9;:16;46175:5;46165:16;;;;;;;;;;;;;;;;46158:23;;45982:207;;;:::o;25044:103::-;24282:13;:11;:13::i;:::-;25109:30:::1;25136:1;25109:18;:30::i;:::-;25044:103::o:0;63932:36::-;;;;:::o;64102:22::-;;;;:::o;67195:173::-;67240:4;67279:14;;;;;;;;;;;67265:28;;:10;:28;;;67257:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;67340:20;:10;:18;:20::i;:::-;67333:27;;67195:173;:::o;69470:594::-;69549:10;69531:28;;:14;;;;;;;;;;;:28;;;69523:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;69660:17;69668:8;69660:7;:17::i;:::-;69652:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;69710:18;69731:24;69746:8;69731:14;:24::i;:::-;69710:45;;69764:20;69787:8;:18;69796:8;69787:18;;;;;;;;;;;:30;69806:10;69787:30;;;;;;;;;;;;;;;;69764:53;;69850:1;69834:12;:17;;69826:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;69891:15;69897:8;69891:5;:15::i;:::-;70046:1;70012:8;:18;70021:8;70012:18;;;;;;;;;;;:30;70031:10;70012:30;;;;;;;;;;;;;;;;:35;;;;;;;;;;;69514:550;;69470:594;:::o;64782:99::-;64831:7;64859:14;;;;;;;;;;;64852:21;;64782:99;:::o;64060:35::-;;;;:::o;66504:228::-;66574:4;66613:14;;;;;;;;;;;66599:28;;:10;:28;;;66591:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66691:11;66667:21;:35;;;;66720:4;66713:11;;66504:228;;;:::o;65429:254::-;65486:4;65525:14;;;;;;;;;;;65511:28;;:10;:28;;;65503:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;65596:7;65579:14;;:24;;;;;;;;;;;;;;;;;;65619:34;65626:10;65638:14;;;;;;;;;;;65619:34;;;;;;;:::i;:::-;;;;;;;;65671:4;65664:11;;65429:254;;;:::o;24396:87::-;24442:7;24469:6;;;;;;;;;;;24462:13;;24396:87;:::o;64017:36::-;;;;:::o;46710:104::-;46766:13;46799:7;46792:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46710:104;:::o;70199:176::-;70303:8;4931:1;2989:42;4883:45;;;:49;4879:225;;;2989:42;4954;;;5005:4;5012:8;4954:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4949:144;;5068:8;5049:28;;;;;;;;;;;:::i;:::-;;;;;;;;4949:144;4879:225;70324:43:::1;70348:8;70358;70324:23;:43::i;:::-;70199:176:::0;;;:::o;65778:251::-;65834:4;65873:14;;;;;;;;;;;65859:28;;:10;:28;;;65851:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;65943:7;65927:13;;:23;;;;;;;;;;;;;;;;;;65966:33;65973:10;65985:13;;;;;;;;;;;65966:33;;;;;;;:::i;:::-;;;;;;;;66017:4;66010:11;;65778:251;;;:::o;70898:228::-;71049:4;4185:1;2989:42;4137:45;;;:49;4133:539;;;4426:10;4418:18;;:4;:18;;;4414:85;;71071:47:::1;71094:4;71100:2;71104:7;71113:4;71071:22;:47::i;:::-;4477:7:::0;;4414:85;2989:42;4518;;;4569:4;4576:10;4518:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4513:148;;4634:10;4615:30;;;;;;;;;;;:::i;:::-;;;;;;;;4513:148;4133:539;71071:47:::1;71094:4;71100:2;71104:7;71113:4;71071:22;:47::i;:::-;70898:228:::0;;;;;;:::o;68818:196::-;68945:13;68983:23;68998:7;68983:14;:23::i;:::-;68976:30;;68818:196;;;:::o;65070:95::-;65118:4;65143:14;;;;;;;;;;;65136:21;;65070:95;:::o;65240:93::-;65287:4;65312:13;;;;;;;;;;;65305:20;;65240:93;:::o;66740:226::-;66809:4;66848:14;;;;;;;;;;;66834:28;;:10;:28;;;66826:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66925:11;66902:20;:34;;;;66954:4;66947:11;;66740:226;;;:::o;48522:164::-;48619:4;48643:18;:25;48662:5;48643:25;;;;;;;;;;;;;;;:35;48669:8;48643:35;;;;;;;;;;;;;;;;;;;;;;;;;48636:42;;48522:164;;;;:::o;25302:201::-;24282:13;:11;:13::i;:::-;25411:1:::1;25391:22;;:8;:22;;::::0;25383:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;25467:28;25486:8;25467:18;:28::i;:::-;25302:201:::0;:::o;38125:157::-;38210:4;38249:25;38234:40;;;:11;:40;;;;38227:47;;38125:157;;;:::o;57872:135::-;57954:16;57962:7;57954;:16::i;:::-;57946:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57872:135;:::o;47571:416::-;47652:13;47668:23;47683:7;47668:14;:23::i;:::-;47652:39;;47716:5;47710:11;;:2;:11;;;47702:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47810:5;47794:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47819:37;47836:5;47843:12;:10;:12::i;:::-;47819:16;:37::i;:::-;47794:62;47772:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;47958:21;47967:2;47971:7;47958:8;:21::i;:::-;47641:346;47571:416;;:::o;6476:114::-;6541:7;6568;:14;;;6561:21;;6476:114;;;:::o;6598:127::-;6705:1;6687:7;:14;;;:19;;;;;;;;;;;6598:127;:::o;52376:110::-;52452:26;52462:2;52466:7;52452:26;;;;;;;;;;;;:9;:26::i;:::-;52376:110;;:::o;62759:217::-;62859:16;62867:7;62859;:16::i;:::-;62851:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;62959:9;62937:10;:19;62948:7;62937:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;62759:217;;:::o;51475:128::-;51540:4;51593:1;51564:31;;:17;51573:7;51564:8;:17::i;:::-;:31;;;;51557:38;;51475:128;;;:::o;48753:335::-;48948:41;48967:12;:10;:12::i;:::-;48981:7;48948:18;:41::i;:::-;48940:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;49052:28;49062:4;49068:2;49072:7;49052:9;:28::i;:::-;48753:335;;;:::o;24561:132::-;24636:12;:10;:12::i;:::-;24625:23;;:7;:5;:7::i;:::-;:23;;;24617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24561:132::o;49159:185::-;49297:39;49314:4;49320:2;49324:7;49297:39;;;;;;;;;;;;:16;:39::i;:::-;49159:185;;;:::o;51045:117::-;51111:7;51138;:16;51146:7;51138:16;;;;;;;;;;;;;;;;;;;;;51131:23;;51045:117;;;:::o;25663:191::-;25737:16;25756:6;;;;;;;;;;;25737:25;;25782:8;25773:6;;:17;;;;;;;;;;;;;;;;;;25837:8;25806:40;;25827:8;25806:40;;;;;;;;;;;;25726:128;25663:191;:::o;70072:115::-;70159:20;70171:7;70159:11;:20::i;:::-;70072:115;:::o;48296:155::-;48391:52;48410:12;:10;:12::i;:::-;48424:8;48434;48391:18;:52::i;:::-;48296:155;;:::o;49415:322::-;49589:41;49608:12;:10;:12::i;:::-;49622:7;49589:18;:41::i;:::-;49581:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;49691:38;49705:4;49711:2;49715:7;49724:4;49691:13;:38::i;:::-;49415:322;;;;:::o;61979:624::-;62052:13;62078:23;62093:7;62078:14;:23::i;:::-;62114;62140:10;:19;62151:7;62140:19;;;;;;;;;;;62114:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62170:18;62191:10;:8;:10::i;:::-;62170:31;;62299:1;62283:4;62277:18;:23;62273:72;;62324:9;62317:16;;;;;;62273:72;62475:1;62455:9;62449:23;:27;62445:108;;;62524:4;62530:9;62507:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62493:48;;;;;;62445:108;62572:23;62587:7;62572:14;:23::i;:::-;62565:30;;;;61979:624;;;;:::o;22947:98::-;23000:7;23027:10;23020:17;;22947:98;:::o;57151:174::-;57253:2;57226:15;:24;57242:7;57226:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57309:7;57305:2;57271:46;;57280:23;57295:7;57280:14;:23::i;:::-;57271:46;;;;;;;;;;;;57151:174;;:::o;52713:319::-;52842:18;52848:2;52852:7;52842:5;:18::i;:::-;52893:53;52924:1;52928:2;52932:7;52941:4;52893:22;:53::i;:::-;52871:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;52713:319;;;:::o;51770:264::-;51863:4;51880:13;51896:23;51911:7;51896:14;:23::i;:::-;51880:39;;51949:5;51938:16;;:7;:16;;;:52;;;;51958:32;51975:5;51982:7;51958:16;:32::i;:::-;51938:52;:87;;;;52018:7;51994:31;;:20;52006:7;51994:11;:20::i;:::-;:31;;;51938:87;51930:96;;;51770:264;;;;:::o;55769:1263::-;55928:4;55901:31;;:23;55916:7;55901:14;:23::i;:::-;:31;;;55893:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56007:1;55993:16;;:2;:16;;;55985:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56063:42;56084:4;56090:2;56094:7;56103:1;56063:20;:42::i;:::-;56235:4;56208:31;;:23;56223:7;56208:14;:23::i;:::-;:31;;;56200:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56353:15;:24;56369:7;56353:24;;;;;;;;;;;;56346:31;;;;;;;;;;;56848:1;56829:9;:15;56839:4;56829:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;56881:1;56864:9;:13;56874:2;56864:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56923:2;56904:7;:16;56912:7;56904:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56962:7;56958:2;56943:27;;56952:4;56943:27;;;;;;;;;;;;56983:41;57003:4;57009:2;57013:7;57022:1;56983:19;:41::i;:::-;55769:1263;;;:::o;63201:206::-;63270:20;63282:7;63270:11;:20::i;:::-;63344:1;63313:10;:19;63324:7;63313:19;;;;;;;;;;;63307:33;;;;;:::i;:::-;;;:38;63303:97;;63369:10;:19;63380:7;63369:19;;;;;;;;;;;;63362:26;;;;:::i;:::-;63303:97;63201:206;:::o;57468:315::-;57623:8;57614:17;;:5;:17;;;57606:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57710:8;57672:18;:25;57691:5;57672:25;;;;;;;;;;;;;;;:35;57698:8;57672:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;57756:8;57734:41;;57749:5;57734:41;;;57766:8;57734:41;;;;;;:::i;:::-;;;;;;;;57468:315;;;:::o;50618:313::-;50774:28;50784:4;50790:2;50794:7;50774:9;:28::i;:::-;50821:47;50844:4;50850:2;50854:7;50863:4;50821:22;:47::i;:::-;50813:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50618:313;;;;:::o;47415:94::-;47466:13;47492:9;;;;;;;;;;;;;;47415:94;:::o;46885:281::-;46958:13;46984:23;46999:7;46984:14;:23::i;:::-;47020:21;47044:10;:8;:10::i;:::-;47020:34;;47096:1;47078:7;47072:21;:25;:86;;;;;;;;;;;;;;;;;47124:7;47133:18;:7;:16;:18::i;:::-;47107:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47072:86;47065:93;;;46885:281;;;:::o;53368:942::-;53462:1;53448:16;;:2;:16;;;53440:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53521:16;53529:7;53521;:16::i;:::-;53520:17;53512:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53583:48;53612:1;53616:2;53620:7;53629:1;53583:20;:48::i;:::-;53730:16;53738:7;53730;:16::i;:::-;53729:17;53721:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54145:1;54128:9;:13;54138:2;54128:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;54189:2;54170:7;:16;54178:7;54170:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54234:7;54230:2;54209:33;;54226:1;54209:33;;;;;;;;;;;;54255:47;54283:1;54287:2;54291:7;54300:1;54255:19;:47::i;:::-;53368:942;;:::o;58571:853::-;58725:4;58746:15;:2;:13;;;:15::i;:::-;58742:675;;;58798:2;58782:36;;;58819:12;:10;:12::i;:::-;58833:4;58839:7;58848:4;58782:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58778:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59040:1;59023:6;:13;:18;59019:328;;59066:60;;;;;;;;;;:::i;:::-;;;;;;;;59019:328;59297:6;59291:13;59282:6;59278:2;59274:15;59267:38;58778:584;58914:41;;;58904:51;;;:6;:51;;;;58897:58;;;;;58742:675;59401:4;59394:11;;58571:853;;;;;;;:::o;60156:410::-;60346:1;60334:9;:13;60330:229;;;60384:1;60368:18;;:4;:18;;;60364:87;;60426:9;60407;:15;60417:4;60407:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;60364:87;60483:1;60469:16;;:2;:16;;;60465:83;;60523:9;60506;:13;60516:2;60506:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;60465:83;60330:229;60156:410;;;;:::o;61288:158::-;;;;;:::o;54649:783::-;54709:13;54725:23;54740:7;54725:14;:23::i;:::-;54709:39;;54761:51;54782:5;54797:1;54801:7;54810:1;54761:20;:51::i;:::-;54925:23;54940:7;54925:14;:23::i;:::-;54917:31;;54996:15;:24;55012:7;54996:24;;;;;;;;;;;;54989:31;;;;;;;;;;;55261:1;55241:9;:16;55251:5;55241:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;55291:7;:16;55299:7;55291:16;;;;;;;;;;;;55284:23;;;;;;;;;;;55353:7;55349:1;55325:36;;55334:5;55325:36;;;;;;;;;;;;55374:50;55394:5;55409:1;55413:7;55422:1;55374:19;:50::i;:::-;54698:734;54649:783;:::o;20374:716::-;20430:13;20481:14;20518:1;20498:17;20509:5;20498:10;:17::i;:::-;:21;20481:38;;20534:20;20568:6;20557:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20534:41;;20590:11;20719:6;20715:2;20711:15;20703:6;20699:28;20692:35;;20756:288;20763:4;20756:288;;;20788:5;;;;;;;;20930:8;20925:2;20918:5;20914:14;20909:30;20904:3;20896:44;20986:2;20977:11;;;;;;:::i;:::-;;;;;21020:1;21011:5;:10;20756:288;21007:21;20756:288;21065:6;21058:13;;;;;20374:716;;;:::o;27094:326::-;27154:4;27411:1;27389:7;:19;;;:23;27382:30;;27094:326;;;:::o;17240:922::-;17293:7;17313:14;17330:1;17313:18;;17380:6;17371:5;:15;17367:102;;17416:6;17407:15;;;;;;:::i;:::-;;;;;17451:2;17441:12;;;;17367:102;17496:6;17487:5;:15;17483:102;;17532:6;17523:15;;;;;;:::i;:::-;;;;;17567:2;17557:12;;;;17483:102;17612:6;17603:5;:15;17599:102;;17648:6;17639:15;;;;;;:::i;:::-;;;;;17683:2;17673:12;;;;17599:102;17728:5;17719;:14;17715:99;;17763:5;17754:14;;;;;;:::i;:::-;;;;;17797:1;17787:11;;;;17715:99;17841:5;17832;:14;17828:99;;17876:5;17867:14;;;;;;:::i;:::-;;;;;17910:1;17900:11;;;;17828:99;17954:5;17945;:14;17941:99;;17989:5;17980:14;;;;;;:::i;:::-;;;;;18023:1;18013:11;;;;17941:99;18067:5;18058;:14;18054:66;;18103:1;18093:11;;;;18054:66;18148:6;18141:13;;;17240:922;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:90::-;1059:7;1102:5;1095:13;1088:21;1077:32;;1025:90;;;:::o;1121:109::-;1202:21;1217:5;1202:21;:::i;:::-;1197:3;1190:34;1121:109;;:::o;1236:210::-;1323:4;1361:2;1350:9;1346:18;1338:26;;1374:65;1436:1;1425:9;1421:17;1412:6;1374:65;:::i;:::-;1236:210;;;;:::o;1452:149::-;1488:7;1528:66;1521:5;1517:78;1506:89;;1452:149;;;:::o;1607:120::-;1679:23;1696:5;1679:23;:::i;:::-;1672:5;1669:34;1659:62;;1717:1;1714;1707:12;1659:62;1607:120;:::o;1733:137::-;1778:5;1816:6;1803:20;1794:29;;1832:32;1858:5;1832:32;:::i;:::-;1733:137;;;;:::o;1876:327::-;1934:6;1983:2;1971:9;1962:7;1958:23;1954:32;1951:119;;;1989:79;;:::i;:::-;1951:119;2109:1;2134:52;2178:7;2169:6;2158:9;2154:22;2134:52;:::i;:::-;2124:62;;2080:116;1876:327;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:246::-;2570:1;2580:113;2594:6;2591:1;2588:13;2580:113;;;2679:1;2674:3;2670:11;2664:18;2660:1;2655:3;2651:11;2644:39;2616:2;2613:1;2609:10;2604:15;;2580:113;;;2727:1;2718:6;2713:3;2709:16;2702:27;2551:184;2489:246;;;:::o;2741:102::-;2782:6;2833:2;2829:7;2824:2;2817:5;2813:14;2809:28;2799:38;;2741:102;;;:::o;2849:377::-;2937:3;2965:39;2998:5;2965:39;:::i;:::-;3020:71;3084:6;3079:3;3020:71;:::i;:::-;3013:78;;3100:65;3158:6;3153:3;3146:4;3139:5;3135:16;3100:65;:::i;:::-;3190:29;3212:6;3190:29;:::i;:::-;3185:3;3181:39;3174:46;;2941:285;2849:377;;;;:::o;3232:313::-;3345:4;3383:2;3372:9;3368:18;3360:26;;3432:9;3426:4;3422:20;3418:1;3407:9;3403:17;3396:47;3460:78;3533:4;3524:6;3460:78;:::i;:::-;3452:86;;3232:313;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:474::-;5310:6;5318;5367:2;5355:9;5346:7;5342:23;5338:32;5335:119;;;5373:79;;:::i;:::-;5335:119;5493:1;5518:53;5563:7;5554:6;5543:9;5539:22;5518:53;:::i;:::-;5508:63;;5464:117;5620:2;5646:53;5691:7;5682:6;5671:9;5667:22;5646:53;:::i;:::-;5636:63;;5591:118;5242:474;;;;;:::o;5722:117::-;5831:1;5828;5821:12;5845:117;5954:1;5951;5944:12;5968:180;6016:77;6013:1;6006:88;6113:4;6110:1;6103:15;6137:4;6134:1;6127:15;6154:281;6237:27;6259:4;6237:27;:::i;:::-;6229:6;6225:40;6367:6;6355:10;6352:22;6331:18;6319:10;6316:34;6313:62;6310:88;;;6378:18;;:::i;:::-;6310:88;6418:10;6414:2;6407:22;6197:238;6154:281;;:::o;6441:129::-;6475:6;6502:20;;:::i;:::-;6492:30;;6531:33;6559:4;6551:6;6531:33;:::i;:::-;6441:129;;;:::o;6576:308::-;6638:4;6728:18;6720:6;6717:30;6714:56;;;6750:18;;:::i;:::-;6714:56;6788:29;6810:6;6788:29;:::i;:::-;6780:37;;6872:4;6866;6862:15;6854:23;;6576:308;;;:::o;6890:146::-;6987:6;6982:3;6977;6964:30;7028:1;7019:6;7014:3;7010:16;7003:27;6890:146;;;:::o;7042:425::-;7120:5;7145:66;7161:49;7203:6;7161:49;:::i;:::-;7145:66;:::i;:::-;7136:75;;7234:6;7227:5;7220:21;7272:4;7265:5;7261:16;7310:3;7301:6;7296:3;7292:16;7289:25;7286:112;;;7317:79;;:::i;:::-;7286:112;7407:54;7454:6;7449:3;7444;7407:54;:::i;:::-;7126:341;7042:425;;;;;:::o;7487:340::-;7543:5;7592:3;7585:4;7577:6;7573:17;7569:27;7559:122;;7600:79;;:::i;:::-;7559:122;7717:6;7704:20;7742:79;7817:3;7809:6;7802:4;7794:6;7790:17;7742:79;:::i;:::-;7733:88;;7549:278;7487:340;;;;:::o;7833:509::-;7902:6;7951:2;7939:9;7930:7;7926:23;7922:32;7919:119;;;7957:79;;:::i;:::-;7919:119;8105:1;8094:9;8090:17;8077:31;8135:18;8127:6;8124:30;8121:117;;;8157:79;;:::i;:::-;8121:117;8262:63;8317:7;8308:6;8297:9;8293:22;8262:63;:::i;:::-;8252:73;;8048:287;7833:509;;;;:::o;8348:654::-;8426:6;8434;8483:2;8471:9;8462:7;8458:23;8454:32;8451:119;;;8489:79;;:::i;:::-;8451:119;8609:1;8634:53;8679:7;8670:6;8659:9;8655:22;8634:53;:::i;:::-;8624:63;;8580:117;8764:2;8753:9;8749:18;8736:32;8795:18;8787:6;8784:30;8781:117;;;8817:79;;:::i;:::-;8781:117;8922:63;8977:7;8968:6;8957:9;8953:22;8922:63;:::i;:::-;8912:73;;8707:288;8348:654;;;;;:::o;9008:619::-;9085:6;9093;9101;9150:2;9138:9;9129:7;9125:23;9121:32;9118:119;;;9156:79;;:::i;:::-;9118:119;9276:1;9301:53;9346:7;9337:6;9326:9;9322:22;9301:53;:::i;:::-;9291:63;;9247:117;9403:2;9429:53;9474:7;9465:6;9454:9;9450:22;9429:53;:::i;:::-;9419:63;;9374:118;9531:2;9557:53;9602:7;9593:6;9582:9;9578:22;9557:53;:::i;:::-;9547:63;;9502:118;9008:619;;;;;:::o;9633:329::-;9692:6;9741:2;9729:9;9720:7;9716:23;9712:32;9709:119;;;9747:79;;:::i;:::-;9709:119;9867:1;9892:53;9937:7;9928:6;9917:9;9913:22;9892:53;:::i;:::-;9882:63;;9838:117;9633:329;;;;:::o;9968:60::-;9996:3;10017:5;10010:12;;9968:60;;;:::o;10034:142::-;10084:9;10117:53;10135:34;10144:24;10162:5;10144:24;:::i;:::-;10135:34;:::i;:::-;10117:53;:::i;:::-;10104:66;;10034:142;;;:::o;10182:126::-;10232:9;10265:37;10296:5;10265:37;:::i;:::-;10252:50;;10182:126;;;:::o;10314:157::-;10395:9;10428:37;10459:5;10428:37;:::i;:::-;10415:50;;10314:157;;;:::o;10477:193::-;10595:68;10657:5;10595:68;:::i;:::-;10590:3;10583:81;10477:193;;:::o;10676:284::-;10800:4;10838:2;10827:9;10823:18;10815:26;;10851:102;10950:1;10939:9;10935:17;10926:6;10851:102;:::i;:::-;10676:284;;;;:::o;10966:116::-;11036:21;11051:5;11036:21;:::i;:::-;11029:5;11026:32;11016:60;;11072:1;11069;11062:12;11016:60;10966:116;:::o;11088:133::-;11131:5;11169:6;11156:20;11147:29;;11185:30;11209:5;11185:30;:::i;:::-;11088:133;;;;:::o;11227:323::-;11283:6;11332:2;11320:9;11311:7;11307:23;11303:32;11300:119;;;11338:79;;:::i;:::-;11300:119;11458:1;11483:50;11525:7;11516:6;11505:9;11501:22;11483:50;:::i;:::-;11473:60;;11429:114;11227:323;;;;:::o;11556:468::-;11621:6;11629;11678:2;11666:9;11657:7;11653:23;11649:32;11646:119;;;11684:79;;:::i;:::-;11646:119;11804:1;11829:53;11874:7;11865:6;11854:9;11850:22;11829:53;:::i;:::-;11819:63;;11775:117;11931:2;11957:50;11999:7;11990:6;11979:9;11975:22;11957:50;:::i;:::-;11947:60;;11902:115;11556:468;;;;;:::o;12030:307::-;12091:4;12181:18;12173:6;12170:30;12167:56;;;12203:18;;:::i;:::-;12167:56;12241:29;12263:6;12241:29;:::i;:::-;12233:37;;12325:4;12319;12315:15;12307:23;;12030:307;;;:::o;12343:423::-;12420:5;12445:65;12461:48;12502:6;12461:48;:::i;:::-;12445:65;:::i;:::-;12436:74;;12533:6;12526:5;12519:21;12571:4;12564:5;12560:16;12609:3;12600:6;12595:3;12591:16;12588:25;12585:112;;;12616:79;;:::i;:::-;12585:112;12706:54;12753:6;12748:3;12743;12706:54;:::i;:::-;12426:340;12343:423;;;;;:::o;12785:338::-;12840:5;12889:3;12882:4;12874:6;12870:17;12866:27;12856:122;;12897:79;;:::i;:::-;12856:122;13014:6;13001:20;13039:78;13113:3;13105:6;13098:4;13090:6;13086:17;13039:78;:::i;:::-;13030:87;;12846:277;12785:338;;;;:::o;13129:943::-;13224:6;13232;13240;13248;13297:3;13285:9;13276:7;13272:23;13268:33;13265:120;;;13304:79;;:::i;:::-;13265:120;13424:1;13449:53;13494:7;13485:6;13474:9;13470:22;13449:53;:::i;:::-;13439:63;;13395:117;13551:2;13577:53;13622:7;13613:6;13602:9;13598:22;13577:53;:::i;:::-;13567:63;;13522:118;13679:2;13705:53;13750:7;13741:6;13730:9;13726:22;13705:53;:::i;:::-;13695:63;;13650:118;13835:2;13824:9;13820:18;13807:32;13866:18;13858:6;13855:30;13852:117;;;13888:79;;:::i;:::-;13852:117;13993:62;14047:7;14038:6;14027:9;14023:22;13993:62;:::i;:::-;13983:72;;13778:287;13129:943;;;;;;;:::o;14078:474::-;14146:6;14154;14203:2;14191:9;14182:7;14178:23;14174:32;14171:119;;;14209:79;;:::i;:::-;14171:119;14329:1;14354:53;14399:7;14390:6;14379:9;14375:22;14354:53;:::i;:::-;14344:63;;14300:117;14456:2;14482:53;14527:7;14518:6;14507:9;14503:22;14482:53;:::i;:::-;14472:63;;14427:118;14078:474;;;;;:::o;14558:174::-;14698:26;14694:1;14686:6;14682:14;14675:50;14558:174;:::o;14738:366::-;14880:3;14901:67;14965:2;14960:3;14901:67;:::i;:::-;14894:74;;14977:93;15066:3;14977:93;:::i;:::-;15095:2;15090:3;15086:12;15079:19;;14738:366;;;:::o;15110:419::-;15276:4;15314:2;15303:9;15299:18;15291:26;;15363:9;15357:4;15353:20;15349:1;15338:9;15334:17;15327:47;15391:131;15517:4;15391:131;:::i;:::-;15383:139;;15110:419;;;:::o;15535:180::-;15583:77;15580:1;15573:88;15680:4;15677:1;15670:15;15704:4;15701:1;15694:15;15721:320;15765:6;15802:1;15796:4;15792:12;15782:22;;15849:1;15843:4;15839:12;15870:18;15860:81;;15926:4;15918:6;15914:17;15904:27;;15860:81;15988:2;15980:6;15977:14;15957:18;15954:38;15951:84;;16007:18;;:::i;:::-;15951:84;15772:269;15721:320;;;:::o;16047:332::-;16168:4;16206:2;16195:9;16191:18;16183:26;;16219:71;16287:1;16276:9;16272:17;16263:6;16219:71;:::i;:::-;16300:72;16368:2;16357:9;16353:18;16344:6;16300:72;:::i;:::-;16047:332;;;;;:::o;16385:137::-;16439:5;16470:6;16464:13;16455:22;;16486:30;16510:5;16486:30;:::i;:::-;16385:137;;;;:::o;16528:345::-;16595:6;16644:2;16632:9;16623:7;16619:23;16615:32;16612:119;;;16650:79;;:::i;:::-;16612:119;16770:1;16795:61;16848:7;16839:6;16828:9;16824:22;16795:61;:::i;:::-;16785:71;;16741:125;16528:345;;;;:::o;16879:180::-;16927:77;16924:1;16917:88;17024:4;17021:1;17014:15;17048:4;17045:1;17038:15;17065:191;17105:3;17124:20;17142:1;17124:20;:::i;:::-;17119:25;;17158:20;17176:1;17158:20;:::i;:::-;17153:25;;17201:1;17198;17194:9;17187:16;;17222:3;17219:1;17216:10;17213:36;;;17229:18;;:::i;:::-;17213:36;17065:191;;;;:::o;17262:220::-;17402:34;17398:1;17390:6;17386:14;17379:58;17471:3;17466:2;17458:6;17454:15;17447:28;17262:220;:::o;17488:366::-;17630:3;17651:67;17715:2;17710:3;17651:67;:::i;:::-;17644:74;;17727:93;17816:3;17727:93;:::i;:::-;17845:2;17840:3;17836:12;17829:19;;17488:366;;;:::o;17860:419::-;18026:4;18064:2;18053:9;18049:18;18041:26;;18113:9;18107:4;18103:20;18099:1;18088:9;18084:17;18077:47;18141:131;18267:4;18141:131;:::i;:::-;18133:139;;17860:419;;;:::o;18285:180::-;18425:32;18421:1;18413:6;18409:14;18402:56;18285:180;:::o;18471:366::-;18613:3;18634:67;18698:2;18693:3;18634:67;:::i;:::-;18627:74;;18710:93;18799:3;18710:93;:::i;:::-;18828:2;18823:3;18819:12;18812:19;;18471:366;;;:::o;18843:419::-;19009:4;19047:2;19036:9;19032:18;19024:26;;19096:9;19090:4;19086:20;19082:1;19071:9;19067:17;19060:47;19124:131;19250:4;19124:131;:::i;:::-;19116:139;;18843:419;;;:::o;19268:170::-;19408:22;19404:1;19396:6;19392:14;19385:46;19268:170;:::o;19444:366::-;19586:3;19607:67;19671:2;19666:3;19607:67;:::i;:::-;19600:74;;19683:93;19772:3;19683:93;:::i;:::-;19801:2;19796:3;19792:12;19785:19;;19444:366;;;:::o;19816:419::-;19982:4;20020:2;20009:9;20005:18;19997:26;;20069:9;20063:4;20059:20;20055:1;20044:9;20040:17;20033:47;20097:131;20223:4;20097:131;:::i;:::-;20089:139;;19816:419;;;:::o;20241:170::-;20381:22;20377:1;20369:6;20365:14;20358:46;20241:170;:::o;20417:366::-;20559:3;20580:67;20644:2;20639:3;20580:67;:::i;:::-;20573:74;;20656:93;20745:3;20656:93;:::i;:::-;20774:2;20769:3;20765:12;20758:19;;20417:366;;;:::o;20789:419::-;20955:4;20993:2;20982:9;20978:18;20970:26;;21042:9;21036:4;21032:20;21028:1;21017:9;21013:17;21006:47;21070:131;21196:4;21070:131;:::i;:::-;21062:139;;20789:419;;;:::o;21214:175::-;21354:27;21350:1;21342:6;21338:14;21331:51;21214:175;:::o;21395:366::-;21537:3;21558:67;21622:2;21617:3;21558:67;:::i;:::-;21551:74;;21634:93;21723:3;21634:93;:::i;:::-;21752:2;21747:3;21743:12;21736:19;;21395:366;;;:::o;21767:419::-;21933:4;21971:2;21960:9;21956:18;21948:26;;22020:9;22014:4;22010:20;22006:1;21995:9;21991:17;21984:47;22048:131;22174:4;22048:131;:::i;:::-;22040:139;;21767:419;;;:::o;22192:176::-;22332:28;22328:1;22320:6;22316:14;22309:52;22192:176;:::o;22374:366::-;22516:3;22537:67;22601:2;22596:3;22537:67;:::i;:::-;22530:74;;22613:93;22702:3;22613:93;:::i;:::-;22731:2;22726:3;22722:12;22715:19;;22374:366;;;:::o;22746:419::-;22912:4;22950:2;22939:9;22935:18;22927:26;;22999:9;22993:4;22989:20;22985:1;22974:9;22970:17;22963:47;23027:131;23153:4;23027:131;:::i;:::-;23019:139;;22746:419;;;:::o;23171:181::-;23311:33;23307:1;23299:6;23295:14;23288:57;23171:181;:::o;23358:366::-;23500:3;23521:67;23585:2;23580:3;23521:67;:::i;:::-;23514:74;;23597:93;23686:3;23597:93;:::i;:::-;23715:2;23710:3;23706:12;23699:19;;23358:366;;;:::o;23730:419::-;23896:4;23934:2;23923:9;23919:18;23911:26;;23983:9;23977:4;23973:20;23969:1;23958:9;23954:17;23947:47;24011:131;24137:4;24011:131;:::i;:::-;24003:139;;23730:419;;;:::o;24155:181::-;24295:33;24291:1;24283:6;24279:14;24272:57;24155:181;:::o;24342:366::-;24484:3;24505:67;24569:2;24564:3;24505:67;:::i;:::-;24498:74;;24581:93;24670:3;24581:93;:::i;:::-;24699:2;24694:3;24690:12;24683:19;;24342:366;;;:::o;24714:419::-;24880:4;24918:2;24907:9;24903:18;24895:26;;24967:9;24961:4;24957:20;24953:1;24942:9;24938:17;24931:47;24995:131;25121:4;24995:131;:::i;:::-;24987:139;;24714:419;;;:::o;25139:174::-;25279:26;25275:1;25267:6;25263:14;25256:50;25139:174;:::o;25319:366::-;25461:3;25482:67;25546:2;25541:3;25482:67;:::i;:::-;25475:74;;25558:93;25647:3;25558:93;:::i;:::-;25676:2;25671:3;25667:12;25660:19;;25319:366;;;:::o;25691:419::-;25857:4;25895:2;25884:9;25880:18;25872:26;;25944:9;25938:4;25934:20;25930:1;25919:9;25915:17;25908:47;25972:131;26098:4;25972:131;:::i;:::-;25964:139;;25691:419;;;:::o;26116:228::-;26256:34;26252:1;26244:6;26240:14;26233:58;26325:11;26320:2;26312:6;26308:15;26301:36;26116:228;:::o;26350:366::-;26492:3;26513:67;26577:2;26572:3;26513:67;:::i;:::-;26506:74;;26589:93;26678:3;26589:93;:::i;:::-;26707:2;26702:3;26698:12;26691:19;;26350:366;;;:::o;26722:419::-;26888:4;26926:2;26915:9;26911:18;26903:26;;26975:9;26969:4;26965:20;26961:1;26950:9;26946:17;26939:47;27003:131;27129:4;27003:131;:::i;:::-;26995:139;;26722:419;;;:::o;27147:320::-;27262:4;27300:2;27289:9;27285:18;27277:26;;27313:71;27381:1;27370:9;27366:17;27357:6;27313:71;:::i;:::-;27394:66;27456:2;27445:9;27441:18;27432:6;27394:66;:::i;:::-;27147:320;;;;;:::o;27473:225::-;27613:34;27609:1;27601:6;27597:14;27590:58;27682:8;27677:2;27669:6;27665:15;27658:33;27473:225;:::o;27704:366::-;27846:3;27867:67;27931:2;27926:3;27867:67;:::i;:::-;27860:74;;27943:93;28032:3;27943:93;:::i;:::-;28061:2;28056:3;28052:12;28045:19;;27704:366;;;:::o;28076:419::-;28242:4;28280:2;28269:9;28265:18;28257:26;;28329:9;28323:4;28319:20;28315:1;28304:9;28300:17;28293:47;28357:131;28483:4;28357:131;:::i;:::-;28349:139;;28076:419;;;:::o;28501:220::-;28641:34;28637:1;28629:6;28625:14;28618:58;28710:3;28705:2;28697:6;28693:15;28686:28;28501:220;:::o;28727:366::-;28869:3;28890:67;28954:2;28949:3;28890:67;:::i;:::-;28883:74;;28966:93;29055:3;28966:93;:::i;:::-;29084:2;29079:3;29075:12;29068:19;;28727:366;;;:::o;29099:419::-;29265:4;29303:2;29292:9;29288:18;29280:26;;29352:9;29346:4;29342:20;29338:1;29327:9;29323:17;29316:47;29380:131;29506:4;29380:131;:::i;:::-;29372:139;;29099:419;;;:::o;29524:248::-;29664:34;29660:1;29652:6;29648:14;29641:58;29733:31;29728:2;29720:6;29716:15;29709:56;29524:248;:::o;29778:366::-;29920:3;29941:67;30005:2;30000:3;29941:67;:::i;:::-;29934:74;;30017:93;30106:3;30017:93;:::i;:::-;30135:2;30130:3;30126:12;30119:19;;29778:366;;;:::o;30150:419::-;30316:4;30354:2;30343:9;30339:18;30331:26;;30403:9;30397:4;30393:20;30389:1;30378:9;30374:17;30367:47;30431:131;30557:4;30431:131;:::i;:::-;30423:139;;30150:419;;;:::o;30575:233::-;30715:34;30711:1;30703:6;30699:14;30692:58;30784:16;30779:2;30771:6;30767:15;30760:41;30575:233;:::o;30814:366::-;30956:3;30977:67;31041:2;31036:3;30977:67;:::i;:::-;30970:74;;31053:93;31142:3;31053:93;:::i;:::-;31171:2;31166:3;31162:12;31155:19;;30814:366;;;:::o;31186:419::-;31352:4;31390:2;31379:9;31375:18;31367:26;;31439:9;31433:4;31429:20;31425:1;31414:9;31410:17;31403:47;31467:131;31593:4;31467:131;:::i;:::-;31459:139;;31186:419;;;:::o;31611:141::-;31660:4;31683:3;31675:11;;31706:3;31703:1;31696:14;31740:4;31737:1;31727:18;31719:26;;31611:141;;;:::o;31758:93::-;31795:6;31842:2;31837;31830:5;31826:14;31822:23;31812:33;;31758:93;;;:::o;31857:107::-;31901:8;31951:5;31945:4;31941:16;31920:37;;31857:107;;;;:::o;31970:393::-;32039:6;32089:1;32077:10;32073:18;32112:97;32142:66;32131:9;32112:97;:::i;:::-;32230:39;32260:8;32249:9;32230:39;:::i;:::-;32218:51;;32302:4;32298:9;32291:5;32287:21;32278:30;;32351:4;32341:8;32337:19;32330:5;32327:30;32317:40;;32046:317;;31970:393;;;;;:::o;32369:142::-;32419:9;32452:53;32470:34;32479:24;32497:5;32479:24;:::i;:::-;32470:34;:::i;:::-;32452:53;:::i;:::-;32439:66;;32369:142;;;:::o;32517:75::-;32560:3;32581:5;32574:12;;32517:75;;;:::o;32598:269::-;32708:39;32739:7;32708:39;:::i;:::-;32769:91;32818:41;32842:16;32818:41;:::i;:::-;32810:6;32803:4;32797:11;32769:91;:::i;:::-;32763:4;32756:105;32674:193;32598:269;;;:::o;32873:73::-;32918:3;32873:73;:::o;32952:189::-;33029:32;;:::i;:::-;33070:65;33128:6;33120;33114:4;33070:65;:::i;:::-;33005:136;32952:189;;:::o;33147:186::-;33207:120;33224:3;33217:5;33214:14;33207:120;;;33278:39;33315:1;33308:5;33278:39;:::i;:::-;33251:1;33244:5;33240:13;33231:22;;33207:120;;;33147:186;;:::o;33339:543::-;33440:2;33435:3;33432:11;33429:446;;;33474:38;33506:5;33474:38;:::i;:::-;33558:29;33576:10;33558:29;:::i;:::-;33548:8;33544:44;33741:2;33729:10;33726:18;33723:49;;;33762:8;33747:23;;33723:49;33785:80;33841:22;33859:3;33841:22;:::i;:::-;33831:8;33827:37;33814:11;33785:80;:::i;:::-;33444:431;;33429:446;33339:543;;;:::o;33888:117::-;33942:8;33992:5;33986:4;33982:16;33961:37;;33888:117;;;;:::o;34011:169::-;34055:6;34088:51;34136:1;34132:6;34124:5;34121:1;34117:13;34088:51;:::i;:::-;34084:56;34169:4;34163;34159:15;34149:25;;34062:118;34011:169;;;;:::o;34185:295::-;34261:4;34407:29;34432:3;34426:4;34407:29;:::i;:::-;34399:37;;34469:3;34466:1;34462:11;34456:4;34453:21;34445:29;;34185:295;;;;:::o;34485:1395::-;34602:37;34635:3;34602:37;:::i;:::-;34704:18;34696:6;34693:30;34690:56;;;34726:18;;:::i;:::-;34690:56;34770:38;34802:4;34796:11;34770:38;:::i;:::-;34855:67;34915:6;34907;34901:4;34855:67;:::i;:::-;34949:1;34973:4;34960:17;;35005:2;34997:6;34994:14;35022:1;35017:618;;;;35679:1;35696:6;35693:77;;;35745:9;35740:3;35736:19;35730:26;35721:35;;35693:77;35796:67;35856:6;35849:5;35796:67;:::i;:::-;35790:4;35783:81;35652:222;34987:887;;35017:618;35069:4;35065:9;35057:6;35053:22;35103:37;35135:4;35103:37;:::i;:::-;35162:1;35176:208;35190:7;35187:1;35184:14;35176:208;;;35269:9;35264:3;35260:19;35254:26;35246:6;35239:42;35320:1;35312:6;35308:14;35298:24;;35367:2;35356:9;35352:18;35339:31;;35213:4;35210:1;35206:12;35201:17;;35176:208;;;35412:6;35403:7;35400:19;35397:179;;;35470:9;35465:3;35461:19;35455:26;35513:48;35555:4;35547:6;35543:17;35532:9;35513:48;:::i;:::-;35505:6;35498:64;35420:156;35397:179;35622:1;35618;35610:6;35606:14;35602:22;35596:4;35589:36;35024:611;;;34987:887;;34577:1303;;;34485:1395;;:::o;35886:232::-;36026:34;36022:1;36014:6;36010:14;36003:58;36095:15;36090:2;36082:6;36078:15;36071:40;35886:232;:::o;36124:366::-;36266:3;36287:67;36351:2;36346:3;36287:67;:::i;:::-;36280:74;;36363:93;36452:3;36363:93;:::i;:::-;36481:2;36476:3;36472:12;36465:19;;36124:366;;;:::o;36496:419::-;36662:4;36700:2;36689:9;36685:18;36677:26;;36749:9;36743:4;36739:20;36735:1;36724:9;36720:17;36713:47;36777:131;36903:4;36777:131;:::i;:::-;36769:139;;36496:419;;;:::o;36921:182::-;37061:34;37057:1;37049:6;37045:14;37038:58;36921:182;:::o;37109:366::-;37251:3;37272:67;37336:2;37331:3;37272:67;:::i;:::-;37265:74;;37348:93;37437:3;37348:93;:::i;:::-;37466:2;37461:3;37457:12;37450:19;;37109:366;;;:::o;37481:419::-;37647:4;37685:2;37674:9;37670:18;37662:26;;37734:9;37728:4;37724:20;37720:1;37709:9;37705:17;37698:47;37762:131;37888:4;37762:131;:::i;:::-;37754:139;;37481:419;;;:::o;37906:148::-;38008:11;38045:3;38030:18;;37906:148;;;;:::o;38060:390::-;38166:3;38194:39;38227:5;38194:39;:::i;:::-;38249:89;38331:6;38326:3;38249:89;:::i;:::-;38242:96;;38347:65;38405:6;38400:3;38393:4;38386:5;38382:16;38347:65;:::i;:::-;38437:6;38432:3;38428:16;38421:23;;38170:280;38060:390;;;;:::o;38456:435::-;38636:3;38658:95;38749:3;38740:6;38658:95;:::i;:::-;38651:102;;38770:95;38861:3;38852:6;38770:95;:::i;:::-;38763:102;;38882:3;38875:10;;38456:435;;;;;:::o;38897:237::-;39037:34;39033:1;39025:6;39021:14;39014:58;39106:20;39101:2;39093:6;39089:15;39082:45;38897:237;:::o;39140:366::-;39282:3;39303:67;39367:2;39362:3;39303:67;:::i;:::-;39296:74;;39379:93;39468:3;39379:93;:::i;:::-;39497:2;39492:3;39488:12;39481:19;;39140:366;;;:::o;39512:419::-;39678:4;39716:2;39705:9;39701:18;39693:26;;39765:9;39759:4;39755:20;39751:1;39740:9;39736:17;39729:47;39793:131;39919:4;39793:131;:::i;:::-;39785:139;;39512:419;;;:::o;39937:224::-;40077:34;40073:1;40065:6;40061:14;40054:58;40146:7;40141:2;40133:6;40129:15;40122:32;39937:224;:::o;40167:366::-;40309:3;40330:67;40394:2;40389:3;40330:67;:::i;:::-;40323:74;;40406:93;40495:3;40406:93;:::i;:::-;40524:2;40519:3;40515:12;40508:19;;40167:366;;;:::o;40539:419::-;40705:4;40743:2;40732:9;40728:18;40720:26;;40792:9;40786:4;40782:20;40778:1;40767:9;40763:17;40756:47;40820:131;40946:4;40820:131;:::i;:::-;40812:139;;40539:419;;;:::o;40964:223::-;41104:34;41100:1;41092:6;41088:14;41081:58;41173:6;41168:2;41160:6;41156:15;41149:31;40964:223;:::o;41193:366::-;41335:3;41356:67;41420:2;41415:3;41356:67;:::i;:::-;41349:74;;41432:93;41521:3;41432:93;:::i;:::-;41550:2;41545:3;41541:12;41534:19;;41193:366;;;:::o;41565:419::-;41731:4;41769:2;41758:9;41754:18;41746:26;;41818:9;41812:4;41808:20;41804:1;41793:9;41789:17;41782:47;41846:131;41972:4;41846:131;:::i;:::-;41838:139;;41565:419;;;:::o;41990:175::-;42130:27;42126:1;42118:6;42114:14;42107:51;41990:175;:::o;42171:366::-;42313:3;42334:67;42398:2;42393:3;42334:67;:::i;:::-;42327:74;;42410:93;42499:3;42410:93;:::i;:::-;42528:2;42523:3;42519:12;42512:19;;42171:366;;;:::o;42543:419::-;42709:4;42747:2;42736:9;42732:18;42724:26;;42796:9;42790:4;42786:20;42782:1;42771:9;42767:17;42760:47;42824:131;42950:4;42824:131;:::i;:::-;42816:139;;42543:419;;;:::o;42968:182::-;43108:34;43104:1;43096:6;43092:14;43085:58;42968:182;:::o;43156:366::-;43298:3;43319:67;43383:2;43378:3;43319:67;:::i;:::-;43312:74;;43395:93;43484:3;43395:93;:::i;:::-;43513:2;43508:3;43504:12;43497:19;;43156:366;;;:::o;43528:419::-;43694:4;43732:2;43721:9;43717:18;43709:26;;43781:9;43775:4;43771:20;43767:1;43756:9;43752:17;43745:47;43809:131;43935:4;43809:131;:::i;:::-;43801:139;;43528:419;;;:::o;43953:178::-;44093:30;44089:1;44081:6;44077:14;44070:54;43953:178;:::o;44137:366::-;44279:3;44300:67;44364:2;44359:3;44300:67;:::i;:::-;44293:74;;44376:93;44465:3;44376:93;:::i;:::-;44494:2;44489:3;44485:12;44478:19;;44137:366;;;:::o;44509:419::-;44675:4;44713:2;44702:9;44698:18;44690:26;;44762:9;44756:4;44752:20;44748:1;44737:9;44733:17;44726:47;44790:131;44916:4;44790:131;:::i;:::-;44782:139;;44509:419;;;:::o;44934:98::-;44985:6;45019:5;45013:12;45003:22;;44934:98;;;:::o;45038:168::-;45121:11;45155:6;45150:3;45143:19;45195:4;45190:3;45186:14;45171:29;;45038:168;;;;:::o;45212:373::-;45298:3;45326:38;45358:5;45326:38;:::i;:::-;45380:70;45443:6;45438:3;45380:70;:::i;:::-;45373:77;;45459:65;45517:6;45512:3;45505:4;45498:5;45494:16;45459:65;:::i;:::-;45549:29;45571:6;45549:29;:::i;:::-;45544:3;45540:39;45533:46;;45302:283;45212:373;;;;:::o;45591:640::-;45786:4;45824:3;45813:9;45809:19;45801:27;;45838:71;45906:1;45895:9;45891:17;45882:6;45838:71;:::i;:::-;45919:72;45987:2;45976:9;45972:18;45963:6;45919:72;:::i;:::-;46001;46069:2;46058:9;46054:18;46045:6;46001:72;:::i;:::-;46120:9;46114:4;46110:20;46105:2;46094:9;46090:18;46083:48;46148:76;46219:4;46210:6;46148:76;:::i;:::-;46140:84;;45591:640;;;;;;;:::o;46237:141::-;46293:5;46324:6;46318:13;46309:22;;46340:32;46366:5;46340:32;:::i;:::-;46237:141;;;;:::o;46384:349::-;46453:6;46502:2;46490:9;46481:7;46477:23;46473:32;46470:119;;;46508:79;;:::i;:::-;46470:119;46628:1;46653:63;46708:7;46699:6;46688:9;46684:22;46653:63;:::i;:::-;46643:73;;46599:127;46384:349;;;;:::o;46739:194::-;46779:4;46799:20;46817:1;46799:20;:::i;:::-;46794:25;;46833:20;46851:1;46833:20;:::i;:::-;46828:25;;46877:1;46874;46870:9;46862:17;;46901:1;46895:4;46892:11;46889:37;;;46906:18;;:::i;:::-;46889:37;46739:194;;;;:::o;46939:180::-;46987:77;46984:1;46977:88;47084:4;47081:1;47074:15;47108:4;47105:1;47098:15

Swarm Source

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