ETH Price: $2,508.31 (+0.68%)

Token

TICKETZ (TICKETZ)
 

Overview

Max Total Supply

1,099 TICKETZ

Holders

284

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
4 TICKETZ
0x1e7a65E9cb80fF75409dd9E1a84f70af6F60Edb9
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:
Ticketz

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-10
*/

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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

// 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/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/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/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/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

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

// File: contracts/Ticketz.sol

/*MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMWXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOKWMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMNl.                                                                                                                                                  ,0MMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMWXK0o'..................................................................................................................................................:kKKNMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMWx'.,d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000k:..lNMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMWWNd..'xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0:..cKWWWMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMKl,:okkOKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0kkd:,;kWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMO. .lKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXNXXXXXXXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMO.  lKXXXXXXXXXXXXXx;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l0NXXXXXXXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMO.  lKXXXXXXXXXXXXKc                                                                                                                             ,OXXXXXXXXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMO.  lKNXXXXXXXXOlccc::::::::::,   .;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.   .:::::::::::cccxKNXXXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMO.  lKXXXXXXXXXo.  :0KKKKKKKKKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0KKKKKKKKKo.  :0NXXXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMO.  lKXXXXX0xdoc;,;o0XKKKKKKKKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0XXKKKKKXKx:,,:oddOXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMO.  lKXXXNXx'  ,kKKKKKKKKKKKXKd.  ,kKKKKKKKKKKKKKKKKK0dc:::::::ccxKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0d::;;;;;;:cxKKKKKKKKKKKKKKKKK0c   c0XKKKXKKKKKKK0c. .lKNXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMO. .lKXXXXXx.  ,OXXXKXKKKKKKXKd.  ,kKKKKKKKKKKKKKKKKKk,          :0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0:          c0KKKKKKKKKKKKKKKK0c.  c0XXKXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMO' .lKXXXXXx.  ,kXKKKKKKKKKKXKd.  ,kKKKKKKKKKKKKKKKKKk,          :0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0:          :0KKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKKXKd.  ,kKKKKKKKKKKKKKKKKKk,          :0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0:          :0KKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKKKKKKKKXKd.  ,kKKKKKKKKKKKKKKKKKk,          :0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0:          :0KKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKKXKd.  ,kKKKKKKKKKKKKKKKKKk,          c0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKO:          :0KKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKK0dlllllcllllx0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0xlllllllllok0KKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0Okkkkkkkkkkkkkkkkkkkk0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKx,....................l0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKd.                    c0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKK0kxxxxxkOKKKKKKd.                    c0KKKKOkkkkkkO0KKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKx,......l0KKKKKd.                    c0KKK0c......;kKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKx.      c0KKKKKd.                    c0KKK0:      'kKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKx.      c0KKKKKx,.....        ......'o0KKK0:      'kKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKx.      c0KKKKKK0OOOOk;       :O0O0O00KKKK0:      'kKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKx.      c0KKKKKKKKKKK0:       c0KKKKKKKKKK0:      'kKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKNXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKx'     .cO00000000000k;       :O0000000000k:      ,kKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKNXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKK0xoooool;''''''''''''..       ............':oooooox0KKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKNXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXx.  ,kXXKKXKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKk,                                  c0KKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0XKXXKKKKKKKK0c   lKNXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXO:'';oddOKKKKKKKXXKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKk,                                  c0KKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0XKKKXXKXKOxddc,',dXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXXKK0o. .c0XKKKKKKKKd.  ,kKKKKKKKKKKKKKKKKKKKKKKKKKKKKk,                                 .l0KKKKKKKKKKKKKKKKKKKKKKKKKKK0c   c0XKKKKKKKKd. .:OKKXXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXXXXXd'..:xOkkkkkkkkl.  'dkkkkkkkkkkkkkkkkkkkkkkkkkkkkxoc:::::::::ccccccccccccccccccccccccdkkkkkkkkkkkkkkkkkkkkkkkkkkkkx:   ;xOkkkkkOOkl...c0XXXXNXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXXXXXKOOkc..........     ...............................................................................................     ..........;xOO0XXXXXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXXXXXXXNKl.                                                                                                                            ;OXXXXXXXXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0'  lKXXXXXXXXXXXXXOxdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddxkKXXXXXXXXXXXXXx.  oWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMM0' .lKXXXNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx' .dWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMN0kkdc:lOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKdc:okkkXMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMWd. .dXNXXXNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXO,  cNMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMWKdloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddloOWMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMNl                                                                                                                                                   ,0MMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMWk:;;;;;;;::::;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;:dXMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
*/

pragma solidity ^0.8.16;






contract Ticketz is ERC721, Ownable {
    using Address for address;
    using Counters for Counters.Counter;
    using SafeMath for uint256;

    
    uint256 public constant MAX_PUBLIC_MINT = 5;
    uint256 public totalSupply;
    uint256 public price = 0 ether;
    uint256 public reserveSupply = 100;
    uint256 public maxPerWallet = 5;
    uint256 public constant MAX_SUPPLY = 1100;
    bool public saleActive; // public sale flag (false on deploy)
    

    constructor() ERC721("TICKETZ", "TICKETZ") {}

    //mint settings
    modifier mintParameters(uint256 numberToMint) {

        uint256 currentTokens = balanceOf(msg.sender);

        require(currentTokens + numberToMint <= maxPerWallet, "Exceeds maximum number of tokens per wallet");

        require(saleActive, "Sale not live");
        _;
        require(numberToMint < MAX_PUBLIC_MINT, "Save some for the rest of us!");

        require(msg.value == price * numberToMint, "this is Free99");

        require(numberToMint > 0, "Zero mint");

        require(totalSupply.add(numberToMint) <= MAX_SUPPLY, "Exceeds max supply");

        require(tx.origin == msg.sender, "1100 bonks for being greedy");


    
    }

     function _mintTokens(address to, uint256 numberToMint) internal {
        require(numberToMint > 0, "Zero mint");
        uint256 currentSupply_ = totalSupply; // memory variable
        for (uint256 i; i < numberToMint; ++i) {
            _safeMint(to, currentSupply_++); // mint then increment
        }
        totalSupply = currentSupply_; // update storage
    }


    //Function to set sale active

    function setSaleActive(bool state) external onlyOwner {
        saleActive = state;
    }

    // Mint for the Dog Groomer

    function devMint(address to, uint256 numberToMint) external onlyOwner {
        uint256 _reserveSupply = reserveSupply;
        require(numberToMint <= _reserveSupply, "Exceeds reserve limit");
        reserveSupply = _reserveSupply - numberToMint;

        _mintTokens(to, numberToMint);
    }

    //Public Mint

    function mint(uint256 numberToMint) external payable mintParameters(numberToMint) {
        _mintTokens(msg.sender, numberToMint);
    }


    // Take out ETH
      function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }



   // Set the Metadata

    string private baseURI;

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

    function setMetadata(string memory metadata) public onlyOwner {
        baseURI = metadata;
    }

    //Token Tracking
    Counters.Counter private tokens;

        function getTokensFromAddress(address wallet) public view returns(uint256[] memory) {
        uint256 tokensHeld = balanceOf(wallet);
        uint256 currentTokens = tokens.current();
        uint256 x = 0;

        uint256[] memory _tokens = new uint256[](tokensHeld);
        
        for (uint256 i;i < currentTokens;i++) {
            if (ownerOf(i) == wallet) {
                _tokens[x] = i;
                x++;
            }
        }

        return _tokens;
    }

    function maxSupply() external view returns(uint256) {
        return tokens.current();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberToMint","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getTokensFromAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadata","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060085560646009556005600a553480156200002057600080fd5b506040518060400160405280600781526020017f5449434b45545a000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f5449434b45545a0000000000000000000000000000000000000000000000000081525081600090816200009e919062000421565b508060019081620000b0919062000421565b505050620000d3620000c7620000d960201b60201c565b620000e160201b60201c565b62000508565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022957607f821691505b6020821081036200023f576200023e620001e1565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002a97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200026a565b620002b586836200026a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000302620002fc620002f684620002cd565b620002d7565b620002cd565b9050919050565b6000819050919050565b6200031e83620002e1565b620003366200032d8262000309565b84845462000277565b825550505050565b600090565b6200034d6200033e565b6200035a81848462000313565b505050565b5b8181101562000382576200037660008262000343565b60018101905062000360565b5050565b601f821115620003d1576200039b8162000245565b620003a6846200025a565b81016020851015620003b6578190505b620003ce620003c5856200025a565b8301826200035f565b50505b505050565b600082821c905092915050565b6000620003f660001984600802620003d6565b1980831691505092915050565b6000620004118383620003e3565b9150826002028217905092915050565b6200042c82620001a7565b67ffffffffffffffff811115620004485762000447620001b2565b5b62000454825462000210565b6200046182828562000386565b600060209050601f83116001811462000499576000841562000484578287015190505b62000490858262000403565b86555062000500565b601f198416620004a98662000245565b60005b82811015620004d357848901518255600182019150602085019450602081019050620004ac565b86831015620004f35784890151620004ef601f891682620003e3565b8355505b6001600288020188555050505b505050505050565b613c3a80620005186000396000f3fe6080604052600436106101cd5760003560e01c806368428a1b116100f7578063a0712d6811610095578063c87b56dd11610064578063c87b56dd14610643578063d5abeb0114610680578063e985e9c5146106ab578063f2fde38b146106e8576101cd565b8063a0712d68146105ac578063a22cb465146105c8578063a49a1e7d146105f1578063b88d4fde1461061a576101cd565b8063841718a6116100d1578063841718a6146105025780638da5cb5b1461052b57806395d89b4114610556578063a035b1fe14610581576101cd565b806368428a1b1461048357806370a08231146104ae578063715018a6146104eb576101cd565b806332cb6b0c1161016f578063453c23101161013e578063453c2310146103c7578063627804af146103f25780636352211e1461041b57806365f1309714610458576101cd565b806332cb6b0c1461031f578063360d506f1461034a5780633ccfd60b1461038757806342842e0e1461039e576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806318160ddd146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806303d41eb61461020f57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906124d5565b610711565b604051610206919061251d565b60405180910390f35b34801561021b57600080fd5b506102246107f3565b6040516102319190612551565b60405180910390f35b34801561024657600080fd5b5061024f6107f9565b60405161025c91906125fc565b60405180910390f35b34801561027157600080fd5b5061028c6004803603810190610287919061264a565b61088b565b60405161029991906126b8565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c491906126ff565b6108d1565b005b3480156102d757600080fd5b506102e06109e8565b6040516102ed9190612551565b60405180910390f35b34801561030257600080fd5b5061031d6004803603810190610318919061273f565b6109ee565b005b34801561032b57600080fd5b50610334610a4e565b6040516103419190612551565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612792565b610a54565b60405161037e919061287d565b60405180910390f35b34801561039357600080fd5b5061039c610b54565b005b3480156103aa57600080fd5b506103c560048036038101906103c0919061273f565b610bab565b005b3480156103d357600080fd5b506103dc610bcb565b6040516103e99190612551565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906126ff565b610bd1565b005b34801561042757600080fd5b50610442600480360381019061043d919061264a565b610c44565b60405161044f91906126b8565b60405180910390f35b34801561046457600080fd5b5061046d610cca565b60405161047a9190612551565b60405180910390f35b34801561048f57600080fd5b50610498610ccf565b6040516104a5919061251d565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d09190612792565b610ce2565b6040516104e29190612551565b60405180910390f35b3480156104f757600080fd5b50610500610d99565b005b34801561050e57600080fd5b50610529600480360381019061052491906128cb565b610dad565b005b34801561053757600080fd5b50610540610dd2565b60405161054d91906126b8565b60405180910390f35b34801561056257600080fd5b5061056b610dfc565b60405161057891906125fc565b60405180910390f35b34801561058d57600080fd5b50610596610e8e565b6040516105a39190612551565b60405180910390f35b6105c660048036038101906105c1919061264a565b610e94565b005b3480156105d457600080fd5b506105ef60048036038101906105ea91906128f8565b6110ec565b005b3480156105fd57600080fd5b5061061860048036038101906106139190612a6d565b611102565b005b34801561062657600080fd5b50610641600480360381019061063c9190612b57565b61111d565b005b34801561064f57600080fd5b5061066a6004803603810190610665919061264a565b61117f565b60405161067791906125fc565b60405180910390f35b34801561068c57600080fd5b506106956111e7565b6040516106a29190612551565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190612bda565b6111f8565b6040516106df919061251d565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190612792565b61128c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107dc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ec57506107eb8261130f565b5b9050919050565b60095481565b60606000805461080890612c49565b80601f016020809104026020016040519081016040528092919081815260200182805461083490612c49565b80156108815780601f1061085657610100808354040283529160200191610881565b820191906000526020600020905b81548152906001019060200180831161086457829003601f168201915b5050505050905090565b600061089682611379565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108dc82610c44565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390612cec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096b6113c4565b73ffffffffffffffffffffffffffffffffffffffff16148061099a5750610999816109946113c4565b6111f8565b5b6109d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d090612d7e565b60405180910390fd5b6109e383836113cc565b505050565b60075481565b6109ff6109f96113c4565b82611485565b610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590612e10565b60405180910390fd5b610a4983838361151a565b505050565b61044c81565b60606000610a6183610ce2565b90506000610a6f600d611813565b90506000808367ffffffffffffffff811115610a8e57610a8d612942565b5b604051908082528060200260200182016040528015610abc5781602001602082028036833780820191505090505b50905060005b83811015610b47578673ffffffffffffffffffffffffffffffffffffffff16610aea82610c44565b73ffffffffffffffffffffffffffffffffffffffff1603610b345780828481518110610b1957610b18612e30565b5b6020026020010181815250508280610b3090612e8e565b9350505b8080610b3f90612e8e565b915050610ac2565b5080945050505050919050565b610b5c611821565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ba7573d6000803e3d6000fd5b5050565b610bc68383836040518060200160405280600081525061111d565b505050565b600a5481565b610bd9611821565b6000600954905080821115610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90612f22565b60405180910390fd5b8181610c2f9190612f42565b600981905550610c3f838361189f565b505050565b600080610c5083611928565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890612fc2565b60405180910390fd5b80915050919050565b600581565b600b60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4990613054565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610da1611821565b610dab6000611965565b565b610db5611821565b80600b60006101000a81548160ff02191690831515021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0b90612c49565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3790612c49565b8015610e845780601f10610e5957610100808354040283529160200191610e84565b820191906000526020600020905b815481529060010190602001808311610e6757829003601f168201915b5050505050905090565b60085481565b806000610ea033610ce2565b9050600a548282610eb19190613074565b1115610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee99061311a565b60405180910390fd5b600b60009054906101000a900460ff16610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3890613186565b60405180910390fd5b610f4b338461189f565b60058210610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f85906131f2565b60405180910390fd5b81600854610f9c9190613212565b3414610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd4906132b8565b60405180910390fd5b60008211611020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101790613324565b60405180910390fd5b61044c61103883600754611a2b90919063ffffffff16565b1115611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090613390565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de906133fc565b60405180910390fd5b505050565b6110fe6110f76113c4565b8383611a41565b5050565b61110a611821565b80600c908161111991906135c8565b5050565b61112e6111286113c4565b83611485565b61116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612e10565b60405180910390fd5b61117984848484611bad565b50505050565b606061118a82611379565b6000611194611c09565b905060008151116111b457604051806020016040528060008152506111df565b806111be84611c9b565b6040516020016111cf9291906136d6565b6040516020818303038152906040525b915050919050565b60006111f3600d611813565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611294611821565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa9061376c565b60405180910390fd5b61130c81611965565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61138281611d69565b6113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890612fc2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661143f83610c44565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061149183610c44565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114d357506114d281856111f8565b5b8061151157508373ffffffffffffffffffffffffffffffffffffffff166114f98461088b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661153a82610c44565b73ffffffffffffffffffffffffffffffffffffffff1614611590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611587906137fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690613890565b60405180910390fd5b61160c8383836001611daa565b8273ffffffffffffffffffffffffffffffffffffffff1661162c82610c44565b73ffffffffffffffffffffffffffffffffffffffff1614611682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611679906137fe565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461180e8383836001611ed0565b505050565b600081600001549050919050565b6118296113c4565b73ffffffffffffffffffffffffffffffffffffffff16611847610dd2565b73ffffffffffffffffffffffffffffffffffffffff161461189d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611894906138fc565b60405180910390fd5b565b600081116118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d990613324565b60405180910390fd5b6000600754905060005b8281101561191b5761190a84838061190390612e8e565b9450611ed6565b8061191490612e8e565b90506118ec565b5080600781905550505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611a399190613074565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613968565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ba0919061251d565b60405180910390a3505050565b611bb884848461151a565b611bc484848484611ef4565b611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa906139fa565b60405180910390fd5b50505050565b6060600c8054611c1890612c49565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4490612c49565b8015611c915780601f10611c6657610100808354040283529160200191611c91565b820191906000526020600020905b815481529060010190602001808311611c7457829003601f168201915b5050505050905090565b606060006001611caa8461207b565b01905060008167ffffffffffffffff811115611cc957611cc8612942565b5b6040519080825280601f01601f191660200182016040528015611cfb5781602001600182028036833780820191505090505b509050600082602001820190505b600115611d5e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d5257611d51613a1a565b5b04945060008503611d09575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611d8b83611928565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115611eca57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611e3e5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e369190612f42565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ec95780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec19190613074565b925050819055505b5b50505050565b50505050565b611ef08282604051806020016040528060008152506121ce565b5050565b6000611f158473ffffffffffffffffffffffffffffffffffffffff16612229565b1561206e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f3e6113c4565b8786866040518563ffffffff1660e01b8152600401611f609493929190613a9e565b6020604051808303816000875af1925050508015611f9c57506040513d601f19601f82011682018060405250810190611f999190613aff565b60015b61201e573d8060008114611fcc576040519150601f19603f3d011682016040523d82523d6000602084013e611fd1565b606091505b506000815103612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d906139fa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612073565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106120d9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816120cf576120ce613a1a565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612116576d04ee2d6d415b85acef8100000000838161210c5761210b613a1a565b5b0492506020810190505b662386f26fc10000831061214557662386f26fc10000838161213b5761213a613a1a565b5b0492506010810190505b6305f5e100831061216e576305f5e100838161216457612163613a1a565b5b0492506008810190505b612710831061219357612710838161218957612188613a1a565b5b0492506004810190505b606483106121b657606483816121ac576121ab613a1a565b5b0492506002810190505b600a83106121c5576001810190505b80915050919050565b6121d8838361224c565b6121e56000848484611ef4565b612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b906139fa565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b290613b78565b60405180910390fd5b6122c481611d69565b15612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90613be4565b60405180910390fd5b612312600083836001611daa565b61231b81611d69565b1561235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290613be4565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612465600083836001611ed0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124b28161247d565b81146124bd57600080fd5b50565b6000813590506124cf816124a9565b92915050565b6000602082840312156124eb576124ea612473565b5b60006124f9848285016124c0565b91505092915050565b60008115159050919050565b61251781612502565b82525050565b6000602082019050612532600083018461250e565b92915050565b6000819050919050565b61254b81612538565b82525050565b60006020820190506125666000830184612542565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125a657808201518184015260208101905061258b565b60008484015250505050565b6000601f19601f8301169050919050565b60006125ce8261256c565b6125d88185612577565b93506125e8818560208601612588565b6125f1816125b2565b840191505092915050565b6000602082019050818103600083015261261681846125c3565b905092915050565b61262781612538565b811461263257600080fd5b50565b6000813590506126448161261e565b92915050565b6000602082840312156126605761265f612473565b5b600061266e84828501612635565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126a282612677565b9050919050565b6126b281612697565b82525050565b60006020820190506126cd60008301846126a9565b92915050565b6126dc81612697565b81146126e757600080fd5b50565b6000813590506126f9816126d3565b92915050565b6000806040838503121561271657612715612473565b5b6000612724858286016126ea565b925050602061273585828601612635565b9150509250929050565b60008060006060848603121561275857612757612473565b5b6000612766868287016126ea565b9350506020612777868287016126ea565b925050604061278886828701612635565b9150509250925092565b6000602082840312156127a8576127a7612473565b5b60006127b6848285016126ea565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127f481612538565b82525050565b600061280683836127eb565b60208301905092915050565b6000602082019050919050565b600061282a826127bf565b61283481856127ca565b935061283f836127db565b8060005b8381101561287057815161285788826127fa565b975061286283612812565b925050600181019050612843565b5085935050505092915050565b60006020820190508181036000830152612897818461281f565b905092915050565b6128a881612502565b81146128b357600080fd5b50565b6000813590506128c58161289f565b92915050565b6000602082840312156128e1576128e0612473565b5b60006128ef848285016128b6565b91505092915050565b6000806040838503121561290f5761290e612473565b5b600061291d858286016126ea565b925050602061292e858286016128b6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61297a826125b2565b810181811067ffffffffffffffff8211171561299957612998612942565b5b80604052505050565b60006129ac612469565b90506129b88282612971565b919050565b600067ffffffffffffffff8211156129d8576129d7612942565b5b6129e1826125b2565b9050602081019050919050565b82818337600083830152505050565b6000612a10612a0b846129bd565b6129a2565b905082815260208101848484011115612a2c57612a2b61293d565b5b612a378482856129ee565b509392505050565b600082601f830112612a5457612a53612938565b5b8135612a648482602086016129fd565b91505092915050565b600060208284031215612a8357612a82612473565b5b600082013567ffffffffffffffff811115612aa157612aa0612478565b5b612aad84828501612a3f565b91505092915050565b600067ffffffffffffffff821115612ad157612ad0612942565b5b612ada826125b2565b9050602081019050919050565b6000612afa612af584612ab6565b6129a2565b905082815260208101848484011115612b1657612b1561293d565b5b612b218482856129ee565b509392505050565b600082601f830112612b3e57612b3d612938565b5b8135612b4e848260208601612ae7565b91505092915050565b60008060008060808587031215612b7157612b70612473565b5b6000612b7f878288016126ea565b9450506020612b90878288016126ea565b9350506040612ba187828801612635565b925050606085013567ffffffffffffffff811115612bc257612bc1612478565b5b612bce87828801612b29565b91505092959194509250565b60008060408385031215612bf157612bf0612473565b5b6000612bff858286016126ea565b9250506020612c10858286016126ea565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c6157607f821691505b602082108103612c7457612c73612c1a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cd6602183612577565b9150612ce182612c7a565b604082019050919050565b60006020820190508181036000830152612d0581612cc9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612d68603d83612577565b9150612d7382612d0c565b604082019050919050565b60006020820190508181036000830152612d9781612d5b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612dfa602d83612577565b9150612e0582612d9e565b604082019050919050565b60006020820190508181036000830152612e2981612ded565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e9982612538565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ecb57612eca612e5f565b5b600182019050919050565b7f457863656564732072657365727665206c696d69740000000000000000000000600082015250565b6000612f0c601583612577565b9150612f1782612ed6565b602082019050919050565b60006020820190508181036000830152612f3b81612eff565b9050919050565b6000612f4d82612538565b9150612f5883612538565b9250828203905081811115612f7057612f6f612e5f565b5b92915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612fac601883612577565b9150612fb782612f76565b602082019050919050565b60006020820190508181036000830152612fdb81612f9f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061303e602983612577565b915061304982612fe2565b604082019050919050565b6000602082019050818103600083015261306d81613031565b9050919050565b600061307f82612538565b915061308a83612538565b92508282019050808211156130a2576130a1612e5f565b5b92915050565b7f45786365656473206d6178696d756d206e756d626572206f6620746f6b656e7360008201527f207065722077616c6c6574000000000000000000000000000000000000000000602082015250565b6000613104602b83612577565b915061310f826130a8565b604082019050919050565b60006020820190508181036000830152613133816130f7565b9050919050565b7f53616c65206e6f74206c69766500000000000000000000000000000000000000600082015250565b6000613170600d83612577565b915061317b8261313a565b602082019050919050565b6000602082019050818103600083015261319f81613163565b9050919050565b7f5361766520736f6d6520666f72207468652072657374206f6620757321000000600082015250565b60006131dc601d83612577565b91506131e7826131a6565b602082019050919050565b6000602082019050818103600083015261320b816131cf565b9050919050565b600061321d82612538565b915061322883612538565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561326157613260612e5f565b5b828202905092915050565b7f7468697320697320467265653939000000000000000000000000000000000000600082015250565b60006132a2600e83612577565b91506132ad8261326c565b602082019050919050565b600060208201905081810360008301526132d181613295565b9050919050565b7f5a65726f206d696e740000000000000000000000000000000000000000000000600082015250565b600061330e600983612577565b9150613319826132d8565b602082019050919050565b6000602082019050818103600083015261333d81613301565b9050919050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b600061337a601283612577565b915061338582613344565b602082019050919050565b600060208201905081810360008301526133a98161336d565b9050919050565b7f3131303020626f6e6b7320666f72206265696e67206772656564790000000000600082015250565b60006133e6601b83612577565b91506133f1826133b0565b602082019050919050565b60006020820190508181036000830152613415816133d9565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261347e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613441565b6134888683613441565b95508019841693508086168417925050509392505050565b6000819050919050565b60006134c56134c06134bb84612538565b6134a0565b612538565b9050919050565b6000819050919050565b6134df836134aa565b6134f36134eb826134cc565b84845461344e565b825550505050565b600090565b6135086134fb565b6135138184846134d6565b505050565b5b818110156135375761352c600082613500565b600181019050613519565b5050565b601f82111561357c5761354d8161341c565b61355684613431565b81016020851015613565578190505b61357961357185613431565b830182613518565b50505b505050565b600082821c905092915050565b600061359f60001984600802613581565b1980831691505092915050565b60006135b8838361358e565b9150826002028217905092915050565b6135d18261256c565b67ffffffffffffffff8111156135ea576135e9612942565b5b6135f48254612c49565b6135ff82828561353b565b600060209050601f8311600181146136325760008415613620578287015190505b61362a85826135ac565b865550613692565b601f1984166136408661341c565b60005b8281101561366857848901518255600182019150602085019450602081019050613643565b868310156136855784890151613681601f89168261358e565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b60006136b08261256c565b6136ba818561369a565b93506136ca818560208601612588565b80840191505092915050565b60006136e282856136a5565b91506136ee82846136a5565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613756602683612577565b9150613761826136fa565b604082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006137e8602583612577565b91506137f38261378c565b604082019050919050565b60006020820190508181036000830152613817816137db565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061387a602483612577565b91506138858261381e565b604082019050919050565b600060208201905081810360008301526138a98161386d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138e6602083612577565b91506138f1826138b0565b602082019050919050565b60006020820190508181036000830152613915816138d9565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613952601983612577565b915061395d8261391c565b602082019050919050565b6000602082019050818103600083015261398181613945565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006139e4603283612577565b91506139ef82613988565b604082019050919050565b60006020820190508181036000830152613a13816139d7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613a7082613a49565b613a7a8185613a54565b9350613a8a818560208601612588565b613a93816125b2565b840191505092915050565b6000608082019050613ab360008301876126a9565b613ac060208301866126a9565b613acd6040830185612542565b8181036060830152613adf8184613a65565b905095945050505050565b600081519050613af9816124a9565b92915050565b600060208284031215613b1557613b14612473565b5b6000613b2384828501613aea565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613b62602083612577565b9150613b6d82613b2c565b602082019050919050565b60006020820190508181036000830152613b9181613b55565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613bce601c83612577565b9150613bd982613b98565b602082019050919050565b60006020820190508181036000830152613bfd81613bc1565b905091905056fea2646970667358221220110a3b3f790dea2694ed5112de0377df6f45f789d6dd51855fb594754195a0e064736f6c63430008100033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806368428a1b116100f7578063a0712d6811610095578063c87b56dd11610064578063c87b56dd14610643578063d5abeb0114610680578063e985e9c5146106ab578063f2fde38b146106e8576101cd565b8063a0712d68146105ac578063a22cb465146105c8578063a49a1e7d146105f1578063b88d4fde1461061a576101cd565b8063841718a6116100d1578063841718a6146105025780638da5cb5b1461052b57806395d89b4114610556578063a035b1fe14610581576101cd565b806368428a1b1461048357806370a08231146104ae578063715018a6146104eb576101cd565b806332cb6b0c1161016f578063453c23101161013e578063453c2310146103c7578063627804af146103f25780636352211e1461041b57806365f1309714610458576101cd565b806332cb6b0c1461031f578063360d506f1461034a5780633ccfd60b1461038757806342842e0e1461039e576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806318160ddd146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806303d41eb61461020f57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906124d5565b610711565b604051610206919061251d565b60405180910390f35b34801561021b57600080fd5b506102246107f3565b6040516102319190612551565b60405180910390f35b34801561024657600080fd5b5061024f6107f9565b60405161025c91906125fc565b60405180910390f35b34801561027157600080fd5b5061028c6004803603810190610287919061264a565b61088b565b60405161029991906126b8565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c491906126ff565b6108d1565b005b3480156102d757600080fd5b506102e06109e8565b6040516102ed9190612551565b60405180910390f35b34801561030257600080fd5b5061031d6004803603810190610318919061273f565b6109ee565b005b34801561032b57600080fd5b50610334610a4e565b6040516103419190612551565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612792565b610a54565b60405161037e919061287d565b60405180910390f35b34801561039357600080fd5b5061039c610b54565b005b3480156103aa57600080fd5b506103c560048036038101906103c0919061273f565b610bab565b005b3480156103d357600080fd5b506103dc610bcb565b6040516103e99190612551565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906126ff565b610bd1565b005b34801561042757600080fd5b50610442600480360381019061043d919061264a565b610c44565b60405161044f91906126b8565b60405180910390f35b34801561046457600080fd5b5061046d610cca565b60405161047a9190612551565b60405180910390f35b34801561048f57600080fd5b50610498610ccf565b6040516104a5919061251d565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d09190612792565b610ce2565b6040516104e29190612551565b60405180910390f35b3480156104f757600080fd5b50610500610d99565b005b34801561050e57600080fd5b50610529600480360381019061052491906128cb565b610dad565b005b34801561053757600080fd5b50610540610dd2565b60405161054d91906126b8565b60405180910390f35b34801561056257600080fd5b5061056b610dfc565b60405161057891906125fc565b60405180910390f35b34801561058d57600080fd5b50610596610e8e565b6040516105a39190612551565b60405180910390f35b6105c660048036038101906105c1919061264a565b610e94565b005b3480156105d457600080fd5b506105ef60048036038101906105ea91906128f8565b6110ec565b005b3480156105fd57600080fd5b5061061860048036038101906106139190612a6d565b611102565b005b34801561062657600080fd5b50610641600480360381019061063c9190612b57565b61111d565b005b34801561064f57600080fd5b5061066a6004803603810190610665919061264a565b61117f565b60405161067791906125fc565b60405180910390f35b34801561068c57600080fd5b506106956111e7565b6040516106a29190612551565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190612bda565b6111f8565b6040516106df919061251d565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190612792565b61128c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107dc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107ec57506107eb8261130f565b5b9050919050565b60095481565b60606000805461080890612c49565b80601f016020809104026020016040519081016040528092919081815260200182805461083490612c49565b80156108815780601f1061085657610100808354040283529160200191610881565b820191906000526020600020905b81548152906001019060200180831161086457829003601f168201915b5050505050905090565b600061089682611379565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108dc82610c44565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390612cec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096b6113c4565b73ffffffffffffffffffffffffffffffffffffffff16148061099a5750610999816109946113c4565b6111f8565b5b6109d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d090612d7e565b60405180910390fd5b6109e383836113cc565b505050565b60075481565b6109ff6109f96113c4565b82611485565b610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590612e10565b60405180910390fd5b610a4983838361151a565b505050565b61044c81565b60606000610a6183610ce2565b90506000610a6f600d611813565b90506000808367ffffffffffffffff811115610a8e57610a8d612942565b5b604051908082528060200260200182016040528015610abc5781602001602082028036833780820191505090505b50905060005b83811015610b47578673ffffffffffffffffffffffffffffffffffffffff16610aea82610c44565b73ffffffffffffffffffffffffffffffffffffffff1603610b345780828481518110610b1957610b18612e30565b5b6020026020010181815250508280610b3090612e8e565b9350505b8080610b3f90612e8e565b915050610ac2565b5080945050505050919050565b610b5c611821565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ba7573d6000803e3d6000fd5b5050565b610bc68383836040518060200160405280600081525061111d565b505050565b600a5481565b610bd9611821565b6000600954905080821115610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90612f22565b60405180910390fd5b8181610c2f9190612f42565b600981905550610c3f838361189f565b505050565b600080610c5083611928565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890612fc2565b60405180910390fd5b80915050919050565b600581565b600b60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4990613054565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610da1611821565b610dab6000611965565b565b610db5611821565b80600b60006101000a81548160ff02191690831515021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0b90612c49565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3790612c49565b8015610e845780601f10610e5957610100808354040283529160200191610e84565b820191906000526020600020905b815481529060010190602001808311610e6757829003601f168201915b5050505050905090565b60085481565b806000610ea033610ce2565b9050600a548282610eb19190613074565b1115610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee99061311a565b60405180910390fd5b600b60009054906101000a900460ff16610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3890613186565b60405180910390fd5b610f4b338461189f565b60058210610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f85906131f2565b60405180910390fd5b81600854610f9c9190613212565b3414610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd4906132b8565b60405180910390fd5b60008211611020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101790613324565b60405180910390fd5b61044c61103883600754611a2b90919063ffffffff16565b1115611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090613390565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de906133fc565b60405180910390fd5b505050565b6110fe6110f76113c4565b8383611a41565b5050565b61110a611821565b80600c908161111991906135c8565b5050565b61112e6111286113c4565b83611485565b61116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490612e10565b60405180910390fd5b61117984848484611bad565b50505050565b606061118a82611379565b6000611194611c09565b905060008151116111b457604051806020016040528060008152506111df565b806111be84611c9b565b6040516020016111cf9291906136d6565b6040516020818303038152906040525b915050919050565b60006111f3600d611813565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611294611821565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa9061376c565b60405180910390fd5b61130c81611965565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61138281611d69565b6113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890612fc2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661143f83610c44565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061149183610c44565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114d357506114d281856111f8565b5b8061151157508373ffffffffffffffffffffffffffffffffffffffff166114f98461088b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661153a82610c44565b73ffffffffffffffffffffffffffffffffffffffff1614611590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611587906137fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690613890565b60405180910390fd5b61160c8383836001611daa565b8273ffffffffffffffffffffffffffffffffffffffff1661162c82610c44565b73ffffffffffffffffffffffffffffffffffffffff1614611682576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611679906137fe565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461180e8383836001611ed0565b505050565b600081600001549050919050565b6118296113c4565b73ffffffffffffffffffffffffffffffffffffffff16611847610dd2565b73ffffffffffffffffffffffffffffffffffffffff161461189d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611894906138fc565b60405180910390fd5b565b600081116118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d990613324565b60405180910390fd5b6000600754905060005b8281101561191b5761190a84838061190390612e8e565b9450611ed6565b8061191490612e8e565b90506118ec565b5080600781905550505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611a399190613074565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613968565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ba0919061251d565b60405180910390a3505050565b611bb884848461151a565b611bc484848484611ef4565b611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa906139fa565b60405180910390fd5b50505050565b6060600c8054611c1890612c49565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4490612c49565b8015611c915780601f10611c6657610100808354040283529160200191611c91565b820191906000526020600020905b815481529060010190602001808311611c7457829003601f168201915b5050505050905090565b606060006001611caa8461207b565b01905060008167ffffffffffffffff811115611cc957611cc8612942565b5b6040519080825280601f01601f191660200182016040528015611cfb5781602001600182028036833780820191505090505b509050600082602001820190505b600115611d5e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d5257611d51613a1a565b5b04945060008503611d09575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611d8b83611928565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115611eca57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611e3e5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e369190612f42565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ec95780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec19190613074565b925050819055505b5b50505050565b50505050565b611ef08282604051806020016040528060008152506121ce565b5050565b6000611f158473ffffffffffffffffffffffffffffffffffffffff16612229565b1561206e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f3e6113c4565b8786866040518563ffffffff1660e01b8152600401611f609493929190613a9e565b6020604051808303816000875af1925050508015611f9c57506040513d601f19601f82011682018060405250810190611f999190613aff565b60015b61201e573d8060008114611fcc576040519150601f19603f3d011682016040523d82523d6000602084013e611fd1565b606091505b506000815103612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d906139fa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612073565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106120d9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816120cf576120ce613a1a565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612116576d04ee2d6d415b85acef8100000000838161210c5761210b613a1a565b5b0492506020810190505b662386f26fc10000831061214557662386f26fc10000838161213b5761213a613a1a565b5b0492506010810190505b6305f5e100831061216e576305f5e100838161216457612163613a1a565b5b0492506008810190505b612710831061219357612710838161218957612188613a1a565b5b0492506004810190505b606483106121b657606483816121ac576121ab613a1a565b5b0492506002810190505b600a83106121c5576001810190505b80915050919050565b6121d8838361224c565b6121e56000848484611ef4565b612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b906139fa565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b290613b78565b60405180910390fd5b6122c481611d69565b15612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90613be4565b60405180910390fd5b612312600083836001611daa565b61231b81611d69565b1561235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290613be4565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612465600083836001611ed0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124b28161247d565b81146124bd57600080fd5b50565b6000813590506124cf816124a9565b92915050565b6000602082840312156124eb576124ea612473565b5b60006124f9848285016124c0565b91505092915050565b60008115159050919050565b61251781612502565b82525050565b6000602082019050612532600083018461250e565b92915050565b6000819050919050565b61254b81612538565b82525050565b60006020820190506125666000830184612542565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125a657808201518184015260208101905061258b565b60008484015250505050565b6000601f19601f8301169050919050565b60006125ce8261256c565b6125d88185612577565b93506125e8818560208601612588565b6125f1816125b2565b840191505092915050565b6000602082019050818103600083015261261681846125c3565b905092915050565b61262781612538565b811461263257600080fd5b50565b6000813590506126448161261e565b92915050565b6000602082840312156126605761265f612473565b5b600061266e84828501612635565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126a282612677565b9050919050565b6126b281612697565b82525050565b60006020820190506126cd60008301846126a9565b92915050565b6126dc81612697565b81146126e757600080fd5b50565b6000813590506126f9816126d3565b92915050565b6000806040838503121561271657612715612473565b5b6000612724858286016126ea565b925050602061273585828601612635565b9150509250929050565b60008060006060848603121561275857612757612473565b5b6000612766868287016126ea565b9350506020612777868287016126ea565b925050604061278886828701612635565b9150509250925092565b6000602082840312156127a8576127a7612473565b5b60006127b6848285016126ea565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127f481612538565b82525050565b600061280683836127eb565b60208301905092915050565b6000602082019050919050565b600061282a826127bf565b61283481856127ca565b935061283f836127db565b8060005b8381101561287057815161285788826127fa565b975061286283612812565b925050600181019050612843565b5085935050505092915050565b60006020820190508181036000830152612897818461281f565b905092915050565b6128a881612502565b81146128b357600080fd5b50565b6000813590506128c58161289f565b92915050565b6000602082840312156128e1576128e0612473565b5b60006128ef848285016128b6565b91505092915050565b6000806040838503121561290f5761290e612473565b5b600061291d858286016126ea565b925050602061292e858286016128b6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61297a826125b2565b810181811067ffffffffffffffff8211171561299957612998612942565b5b80604052505050565b60006129ac612469565b90506129b88282612971565b919050565b600067ffffffffffffffff8211156129d8576129d7612942565b5b6129e1826125b2565b9050602081019050919050565b82818337600083830152505050565b6000612a10612a0b846129bd565b6129a2565b905082815260208101848484011115612a2c57612a2b61293d565b5b612a378482856129ee565b509392505050565b600082601f830112612a5457612a53612938565b5b8135612a648482602086016129fd565b91505092915050565b600060208284031215612a8357612a82612473565b5b600082013567ffffffffffffffff811115612aa157612aa0612478565b5b612aad84828501612a3f565b91505092915050565b600067ffffffffffffffff821115612ad157612ad0612942565b5b612ada826125b2565b9050602081019050919050565b6000612afa612af584612ab6565b6129a2565b905082815260208101848484011115612b1657612b1561293d565b5b612b218482856129ee565b509392505050565b600082601f830112612b3e57612b3d612938565b5b8135612b4e848260208601612ae7565b91505092915050565b60008060008060808587031215612b7157612b70612473565b5b6000612b7f878288016126ea565b9450506020612b90878288016126ea565b9350506040612ba187828801612635565b925050606085013567ffffffffffffffff811115612bc257612bc1612478565b5b612bce87828801612b29565b91505092959194509250565b60008060408385031215612bf157612bf0612473565b5b6000612bff858286016126ea565b9250506020612c10858286016126ea565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c6157607f821691505b602082108103612c7457612c73612c1a565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612cd6602183612577565b9150612ce182612c7a565b604082019050919050565b60006020820190508181036000830152612d0581612cc9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612d68603d83612577565b9150612d7382612d0c565b604082019050919050565b60006020820190508181036000830152612d9781612d5b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612dfa602d83612577565b9150612e0582612d9e565b604082019050919050565b60006020820190508181036000830152612e2981612ded565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e9982612538565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ecb57612eca612e5f565b5b600182019050919050565b7f457863656564732072657365727665206c696d69740000000000000000000000600082015250565b6000612f0c601583612577565b9150612f1782612ed6565b602082019050919050565b60006020820190508181036000830152612f3b81612eff565b9050919050565b6000612f4d82612538565b9150612f5883612538565b9250828203905081811115612f7057612f6f612e5f565b5b92915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612fac601883612577565b9150612fb782612f76565b602082019050919050565b60006020820190508181036000830152612fdb81612f9f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061303e602983612577565b915061304982612fe2565b604082019050919050565b6000602082019050818103600083015261306d81613031565b9050919050565b600061307f82612538565b915061308a83612538565b92508282019050808211156130a2576130a1612e5f565b5b92915050565b7f45786365656473206d6178696d756d206e756d626572206f6620746f6b656e7360008201527f207065722077616c6c6574000000000000000000000000000000000000000000602082015250565b6000613104602b83612577565b915061310f826130a8565b604082019050919050565b60006020820190508181036000830152613133816130f7565b9050919050565b7f53616c65206e6f74206c69766500000000000000000000000000000000000000600082015250565b6000613170600d83612577565b915061317b8261313a565b602082019050919050565b6000602082019050818103600083015261319f81613163565b9050919050565b7f5361766520736f6d6520666f72207468652072657374206f6620757321000000600082015250565b60006131dc601d83612577565b91506131e7826131a6565b602082019050919050565b6000602082019050818103600083015261320b816131cf565b9050919050565b600061321d82612538565b915061322883612538565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561326157613260612e5f565b5b828202905092915050565b7f7468697320697320467265653939000000000000000000000000000000000000600082015250565b60006132a2600e83612577565b91506132ad8261326c565b602082019050919050565b600060208201905081810360008301526132d181613295565b9050919050565b7f5a65726f206d696e740000000000000000000000000000000000000000000000600082015250565b600061330e600983612577565b9150613319826132d8565b602082019050919050565b6000602082019050818103600083015261333d81613301565b9050919050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b600061337a601283612577565b915061338582613344565b602082019050919050565b600060208201905081810360008301526133a98161336d565b9050919050565b7f3131303020626f6e6b7320666f72206265696e67206772656564790000000000600082015250565b60006133e6601b83612577565b91506133f1826133b0565b602082019050919050565b60006020820190508181036000830152613415816133d9565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261347e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613441565b6134888683613441565b95508019841693508086168417925050509392505050565b6000819050919050565b60006134c56134c06134bb84612538565b6134a0565b612538565b9050919050565b6000819050919050565b6134df836134aa565b6134f36134eb826134cc565b84845461344e565b825550505050565b600090565b6135086134fb565b6135138184846134d6565b505050565b5b818110156135375761352c600082613500565b600181019050613519565b5050565b601f82111561357c5761354d8161341c565b61355684613431565b81016020851015613565578190505b61357961357185613431565b830182613518565b50505b505050565b600082821c905092915050565b600061359f60001984600802613581565b1980831691505092915050565b60006135b8838361358e565b9150826002028217905092915050565b6135d18261256c565b67ffffffffffffffff8111156135ea576135e9612942565b5b6135f48254612c49565b6135ff82828561353b565b600060209050601f8311600181146136325760008415613620578287015190505b61362a85826135ac565b865550613692565b601f1984166136408661341c565b60005b8281101561366857848901518255600182019150602085019450602081019050613643565b868310156136855784890151613681601f89168261358e565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b60006136b08261256c565b6136ba818561369a565b93506136ca818560208601612588565b80840191505092915050565b60006136e282856136a5565b91506136ee82846136a5565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613756602683612577565b9150613761826136fa565b604082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006137e8602583612577565b91506137f38261378c565b604082019050919050565b60006020820190508181036000830152613817816137db565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061387a602483612577565b91506138858261381e565b604082019050919050565b600060208201905081810360008301526138a98161386d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138e6602083612577565b91506138f1826138b0565b602082019050919050565b60006020820190508181036000830152613915816138d9565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613952601983612577565b915061395d8261391c565b602082019050919050565b6000602082019050818103600083015261398181613945565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006139e4603283612577565b91506139ef82613988565b604082019050919050565b60006020820190508181036000830152613a13816139d7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613a7082613a49565b613a7a8185613a54565b9350613a8a818560208601612588565b613a93816125b2565b840191505092915050565b6000608082019050613ab360008301876126a9565b613ac060208301866126a9565b613acd6040830185612542565b8181036060830152613adf8184613a65565b905095945050505050565b600081519050613af9816124a9565b92915050565b600060208284031215613b1557613b14612473565b5b6000613b2384828501613aea565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613b62602083612577565b9150613b6d82613b2c565b602082019050919050565b60006020820190508181036000830152613b9181613b55565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613bce601c83612577565b9150613bd982613b98565b602082019050919050565b60006020820190508181036000830152613bfd81613bc1565b905091905056fea2646970667358221220110a3b3f790dea2694ed5112de0377df6f45f789d6dd51855fb594754195a0e064736f6c63430008100033

Deployed Bytecode Sourcemap

75292:3373:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47050:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75570:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47978:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49490:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49008:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75500:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50190:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75649:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78071:489;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77576:143;;;;;;;;;;;;;:::i;:::-;;50596:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75611:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77076:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47688:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75450:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75697:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47419:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25016:103;;;;;;;;;;;;;:::i;:::-;;76942:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24368:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48147:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75533:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77405:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49733:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77898:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50852:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48322:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78568:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49959:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25274:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47050:305;47152:4;47204:25;47189:40;;;:11;:40;;;;:105;;;;47261:33;47246:48;;;:11;:48;;;;47189:105;:158;;;;47311:36;47335:11;47311:23;:36::i;:::-;47189:158;47169:178;;47050:305;;;:::o;75570:34::-;;;;:::o;47978:100::-;48032:13;48065:5;48058:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47978:100;:::o;49490:171::-;49566:7;49586:23;49601:7;49586:14;:23::i;:::-;49629:15;:24;49645:7;49629:24;;;;;;;;;;;;;;;;;;;;;49622:31;;49490:171;;;:::o;49008:416::-;49089:13;49105:23;49120:7;49105:14;:23::i;:::-;49089:39;;49153:5;49147:11;;:2;:11;;;49139:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49247:5;49231:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49256:37;49273:5;49280:12;:10;:12::i;:::-;49256:16;:37::i;:::-;49231:62;49209:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;49395:21;49404:2;49408:7;49395:8;:21::i;:::-;49078:346;49008:416;;:::o;75500:26::-;;;;:::o;50190:335::-;50385:41;50404:12;:10;:12::i;:::-;50418:7;50385:18;:41::i;:::-;50377:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;50489:28;50499:4;50505:2;50509:7;50489:9;:28::i;:::-;50190:335;;;:::o;75649:41::-;75686:4;75649:41;:::o;78071:489::-;78137:16;78166:18;78187:17;78197:6;78187:9;:17::i;:::-;78166:38;;78215:21;78239:16;:6;:14;:16::i;:::-;78215:40;;78266:9;78292:24;78333:10;78319:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78292:52;;78370:9;78365:161;78384:13;78380:1;:17;78365:161;;;78436:6;78422:20;;:10;78430:1;78422:7;:10::i;:::-;:20;;;78418:97;;78476:1;78463:7;78471:1;78463:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;78496:3;;;;;:::i;:::-;;;;78418:97;78398:3;;;;;:::i;:::-;;;;78365:161;;;;78545:7;78538:14;;;;;;78071:489;;;:::o;77576:143::-;24254:13;:11;:13::i;:::-;77624:15:::1;77642:21;77624:39;;77682:10;77674:28;;:37;77703:7;77674:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;77613:106;77576:143::o:0;50596:185::-;50734:39;50751:4;50757:2;50761:7;50734:39;;;;;;;;;;;;:16;:39::i;:::-;50596:185;;;:::o;75611:31::-;;;;:::o;77076:300::-;24254:13;:11;:13::i;:::-;77157:22:::1;77182:13;;77157:38;;77230:14;77214:12;:30;;77206:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;77314:12;77297:14;:29;;;;:::i;:::-;77281:13;:45;;;;77339:29;77351:2;77355:12;77339:11;:29::i;:::-;77146:230;77076:300:::0;;:::o;47688:223::-;47760:7;47780:13;47796:17;47805:7;47796:8;:17::i;:::-;47780:33;;47849:1;47832:19;;:5;:19;;;47824:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;47898:5;47891:12;;;47688:223;;;:::o;75450:43::-;75492:1;75450:43;:::o;75697:22::-;;;;;;;;;;;;;:::o;47419:207::-;47491:7;47536:1;47519:19;;:5;:19;;;47511:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47602:9;:16;47612:5;47602:16;;;;;;;;;;;;;;;;47595:23;;47419:207;;;:::o;25016:103::-;24254:13;:11;:13::i;:::-;25081:30:::1;25108:1;25081:18;:30::i;:::-;25016:103::o:0;76942:91::-;24254:13;:11;:13::i;:::-;77020:5:::1;77007:10;;:18;;;;;;;;;;;;;;;;;;76942:91:::0;:::o;24368:87::-;24414:7;24441:6;;;;;;;;;;;24434:13;;24368:87;:::o;48147:104::-;48203:13;48236:7;48229:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48147:104;:::o;75533:30::-;;;;:::o;77405:138::-;77473:12;75905:21;75929;75939:10;75929:9;:21::i;:::-;75905:45;;76003:12;;75987;75971:13;:28;;;;:::i;:::-;:44;;75963:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;76084:10;;;;;;;;;;;76076:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;77498:37:::1;77510:10;77522:12;77498:11;:37::i;:::-;75492:1:::0;76143:12;:30;76135:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;76249:12;76241:5;;:20;;;;:::i;:::-;76228:9;:33;76220:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;76316:1;76301:12;:16;76293:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;75686:4;76352:29;76368:12;76352:11;;:15;;:29;;;;:::i;:::-;:43;;76344:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;76452:10;76439:23;;:9;:23;;;76431:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;75892:620;77405:138;;:::o;49733:155::-;49828:52;49847:12;:10;:12::i;:::-;49861:8;49871;49828:18;:52::i;:::-;49733:155;;:::o;77898:99::-;24254:13;:11;:13::i;:::-;77981:8:::1;77971:7;:18;;;;;;:::i;:::-;;77898:99:::0;:::o;50852:322::-;51026:41;51045:12;:10;:12::i;:::-;51059:7;51026:18;:41::i;:::-;51018:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51128:38;51142:4;51148:2;51152:7;51161:4;51128:13;:38::i;:::-;50852:322;;;;:::o;48322:281::-;48395:13;48421:23;48436:7;48421:14;:23::i;:::-;48457:21;48481:10;:8;:10::i;:::-;48457:34;;48533:1;48515:7;48509:21;:25;:86;;;;;;;;;;;;;;;;;48561:7;48570:18;:7;:16;:18::i;:::-;48544:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48509:86;48502:93;;;48322:281;;;:::o;78568:94::-;78611:7;78638:16;:6;:14;:16::i;:::-;78631:23;;78568:94;:::o;49959:164::-;50056:4;50080:18;:25;50099:5;50080:25;;;;;;;;;;;;;;;:35;50106:8;50080:35;;;;;;;;;;;;;;;;;;;;;;;;;50073:42;;49959:164;;;;:::o;25274:201::-;24254:13;:11;:13::i;:::-;25383:1:::1;25363:22;;:8;:22;;::::0;25355:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;25439:28;25458:8;25439:18;:28::i;:::-;25274:201:::0;:::o;28669:157::-;28754:4;28793:25;28778:40;;;:11;:40;;;;28771:47;;28669:157;;;:::o;59309:135::-;59391:16;59399:7;59391;:16::i;:::-;59383:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59309:135;:::o;22919:98::-;22972:7;22999:10;22992:17;;22919:98;:::o;58588:174::-;58690:2;58663:15;:24;58679:7;58663:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58746:7;58742:2;58708:46;;58717:23;58732:7;58717:14;:23::i;:::-;58708:46;;;;;;;;;;;;58588:174;;:::o;53207:264::-;53300:4;53317:13;53333:23;53348:7;53333:14;:23::i;:::-;53317:39;;53386:5;53375:16;;:7;:16;;;:52;;;;53395:32;53412:5;53419:7;53395:16;:32::i;:::-;53375:52;:87;;;;53455:7;53431:31;;:20;53443:7;53431:11;:20::i;:::-;:31;;;53375:87;53367:96;;;53207:264;;;;:::o;57206:1263::-;57365:4;57338:31;;:23;57353:7;57338:14;:23::i;:::-;:31;;;57330:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57444:1;57430:16;;:2;:16;;;57422:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57500:42;57521:4;57527:2;57531:7;57540:1;57500:20;:42::i;:::-;57672:4;57645:31;;:23;57660:7;57645:14;:23::i;:::-;:31;;;57637:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57790:15;:24;57806:7;57790:24;;;;;;;;;;;;57783:31;;;;;;;;;;;58285:1;58266:9;:15;58276:4;58266:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;58318:1;58301:9;:13;58311:2;58301:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;58360:2;58341:7;:16;58349:7;58341:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;58399:7;58395:2;58380:27;;58389:4;58380:27;;;;;;;;;;;;58420:41;58440:4;58446:2;58450:7;58459:1;58420:19;:41::i;:::-;57206:1263;;;:::o;35622:114::-;35687:7;35714;:14;;;35707:21;;35622:114;;;:::o;24533:132::-;24608:12;:10;:12::i;:::-;24597:23;;:7;:5;:7::i;:::-;:23;;;24589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24533:132::o;76521:374::-;76619:1;76604:12;:16;76596:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;76645:22;76670:11;;76645:36;;76716:9;76711:120;76731:12;76727:1;:16;76711:120;;;76765:31;76775:2;76779:16;;;;;:::i;:::-;;;76765:9;:31::i;:::-;76745:3;;;;:::i;:::-;;;76711:120;;;;76855:14;76841:11;:28;;;;76585:310;76521:374;;:::o;52482:117::-;52548:7;52575;:16;52583:7;52575:16;;;;;;;;;;;;;;;;;;;;;52568:23;;52482:117;;;:::o;25635:191::-;25709:16;25728:6;;;;;;;;;;;25709:25;;25754:8;25745:6;;:17;;;;;;;;;;;;;;;;;;25809:8;25778:40;;25799:8;25778:40;;;;;;;;;;;;25698:128;25635:191;:::o;2876:98::-;2934:7;2965:1;2961;:5;;;;:::i;:::-;2954:12;;2876:98;;;;:::o;58905:315::-;59060:8;59051:17;;:5;:17;;;59043:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59147:8;59109:18;:25;59128:5;59109:25;;;;;;;;;;;;;;;:35;59135:8;59109:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;59193:8;59171:41;;59186:5;59171:41;;;59203:8;59171:41;;;;;;:::i;:::-;;;;;;;;58905:315;;;:::o;52055:313::-;52211:28;52221:4;52227:2;52231:7;52211:9;:28::i;:::-;52258:47;52281:4;52287:2;52291:7;52300:4;52258:22;:47::i;:::-;52250:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;52055:313;;;;:::o;77790:100::-;77842:13;77875:7;77868:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77790:100;:::o;20346:716::-;20402:13;20453:14;20490:1;20470:17;20481:5;20470:10;:17::i;:::-;:21;20453:38;;20506:20;20540:6;20529:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20506:41;;20562:11;20691:6;20687:2;20683:15;20675:6;20671:28;20664:35;;20728:288;20735:4;20728:288;;;20760:5;;;;;;;;20902:8;20897:2;20890:5;20886:14;20881:30;20876:3;20868:44;20958:2;20949:11;;;;;;:::i;:::-;;;;;20992:1;20983:5;:10;20728:288;20979:21;20728:288;21037:6;21030:13;;;;;20346:716;;;:::o;52912:128::-;52977:4;53030:1;53001:31;;:17;53010:7;53001:8;:17::i;:::-;:31;;;;52994:38;;52912:128;;;:::o;61593:410::-;61783:1;61771:9;:13;61767:229;;;61821:1;61805:18;;:4;:18;;;61801:87;;61863:9;61844;:15;61854:4;61844:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;61801:87;61920:1;61906:16;;:2;:16;;;61902:83;;61960:9;61943;:13;61953:2;61943:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;61902:83;61767:229;61593:410;;;;:::o;62725:158::-;;;;;:::o;53813:110::-;53889:26;53899:2;53903:7;53889:26;;;;;;;;;;;;:9;:26::i;:::-;53813:110;;:::o;60008:853::-;60162:4;60183:15;:2;:13;;;:15::i;:::-;60179:675;;;60235:2;60219:36;;;60256:12;:10;:12::i;:::-;60270:4;60276:7;60285:4;60219:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60215:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60477:1;60460:6;:13;:18;60456:328;;60503:60;;;;;;;;;;:::i;:::-;;;;;;;;60456:328;60734:6;60728:13;60719:6;60715:2;60711:15;60704:38;60215:584;60351:41;;;60341:51;;;:6;:51;;;;60334:58;;;;;60179:675;60838:4;60831:11;;60008:853;;;;;;;:::o;17212:922::-;17265:7;17285:14;17302:1;17285:18;;17352:6;17343:5;:15;17339:102;;17388:6;17379:15;;;;;;:::i;:::-;;;;;17423:2;17413:12;;;;17339:102;17468:6;17459:5;:15;17455:102;;17504:6;17495:15;;;;;;:::i;:::-;;;;;17539:2;17529:12;;;;17455:102;17584:6;17575:5;:15;17571:102;;17620:6;17611:15;;;;;;:::i;:::-;;;;;17655:2;17645:12;;;;17571:102;17700:5;17691;:14;17687:99;;17735:5;17726:14;;;;;;:::i;:::-;;;;;17769:1;17759:11;;;;17687:99;17813:5;17804;:14;17800:99;;17848:5;17839:14;;;;;;:::i;:::-;;;;;17882:1;17872:11;;;;17800:99;17926:5;17917;:14;17913:99;;17961:5;17952:14;;;;;;:::i;:::-;;;;;17995:1;17985:11;;;;17913:99;18039:5;18030;:14;18026:66;;18075:1;18065:11;;;;18026:66;18120:6;18113:13;;;17212:922;;;:::o;54150:319::-;54279:18;54285:2;54289:7;54279:5;:18::i;:::-;54330:53;54361:1;54365:2;54369:7;54378:4;54330:22;:53::i;:::-;54308:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;54150:319;;;:::o;37448:326::-;37508:4;37765:1;37743:7;:19;;;:23;37736:30;;37448:326;;;:::o;54805:942::-;54899:1;54885:16;;:2;:16;;;54877:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54958:16;54966:7;54958;:16::i;:::-;54957:17;54949:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55020:48;55049:1;55053:2;55057:7;55066:1;55020:20;:48::i;:::-;55167:16;55175:7;55167;:16::i;:::-;55166:17;55158:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55582:1;55565:9;:13;55575:2;55565:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;55626:2;55607:7;:16;55615:7;55607:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55671:7;55667:2;55646:33;;55663:1;55646:33;;;;;;;;;;;;55692:47;55720:1;55724:2;55728:7;55737:1;55692:19;:47::i;:::-;54805:942;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:114::-;6269:6;6303:5;6297:12;6287:22;;6202:114;;;:::o;6322:184::-;6421:11;6455:6;6450:3;6443:19;6495:4;6490:3;6486:14;6471:29;;6322:184;;;;:::o;6512:132::-;6579:4;6602:3;6594:11;;6632:4;6627:3;6623:14;6615:22;;6512:132;;;:::o;6650:108::-;6727:24;6745:5;6727:24;:::i;:::-;6722:3;6715:37;6650:108;;:::o;6764:179::-;6833:10;6854:46;6896:3;6888:6;6854:46;:::i;:::-;6932:4;6927:3;6923:14;6909:28;;6764:179;;;;:::o;6949:113::-;7019:4;7051;7046:3;7042:14;7034:22;;6949:113;;;:::o;7098:732::-;7217:3;7246:54;7294:5;7246:54;:::i;:::-;7316:86;7395:6;7390:3;7316:86;:::i;:::-;7309:93;;7426:56;7476:5;7426:56;:::i;:::-;7505:7;7536:1;7521:284;7546:6;7543:1;7540:13;7521:284;;;7622:6;7616:13;7649:63;7708:3;7693:13;7649:63;:::i;:::-;7642:70;;7735:60;7788:6;7735:60;:::i;:::-;7725:70;;7581:224;7568:1;7565;7561:9;7556:14;;7521:284;;;7525:14;7821:3;7814:10;;7222:608;;;7098:732;;;;:::o;7836:373::-;7979:4;8017:2;8006:9;8002:18;7994:26;;8066:9;8060:4;8056:20;8052:1;8041:9;8037:17;8030:47;8094:108;8197:4;8188:6;8094:108;:::i;:::-;8086:116;;7836:373;;;;:::o;8215:116::-;8285:21;8300:5;8285:21;:::i;:::-;8278:5;8275:32;8265:60;;8321:1;8318;8311:12;8265:60;8215:116;:::o;8337:133::-;8380:5;8418:6;8405:20;8396:29;;8434:30;8458:5;8434:30;:::i;:::-;8337:133;;;;:::o;8476:323::-;8532:6;8581:2;8569:9;8560:7;8556:23;8552:32;8549:119;;;8587:79;;:::i;:::-;8549:119;8707:1;8732:50;8774:7;8765:6;8754:9;8750:22;8732:50;:::i;:::-;8722:60;;8678:114;8476:323;;;;:::o;8805:468::-;8870:6;8878;8927:2;8915:9;8906:7;8902:23;8898:32;8895:119;;;8933:79;;:::i;:::-;8895:119;9053:1;9078:53;9123:7;9114:6;9103:9;9099:22;9078:53;:::i;:::-;9068:63;;9024:117;9180:2;9206:50;9248:7;9239:6;9228:9;9224:22;9206:50;:::i;:::-;9196:60;;9151:115;8805:468;;;;;:::o;9279:117::-;9388:1;9385;9378:12;9402:117;9511:1;9508;9501:12;9525:180;9573:77;9570:1;9563:88;9670:4;9667:1;9660:15;9694:4;9691:1;9684:15;9711:281;9794:27;9816:4;9794:27;:::i;:::-;9786:6;9782:40;9924:6;9912:10;9909:22;9888:18;9876:10;9873:34;9870:62;9867:88;;;9935:18;;:::i;:::-;9867:88;9975:10;9971:2;9964:22;9754:238;9711:281;;:::o;9998:129::-;10032:6;10059:20;;:::i;:::-;10049:30;;10088:33;10116:4;10108:6;10088:33;:::i;:::-;9998:129;;;:::o;10133:308::-;10195:4;10285:18;10277:6;10274:30;10271:56;;;10307:18;;:::i;:::-;10271:56;10345:29;10367:6;10345:29;:::i;:::-;10337:37;;10429:4;10423;10419:15;10411:23;;10133:308;;;:::o;10447:146::-;10544:6;10539:3;10534;10521:30;10585:1;10576:6;10571:3;10567:16;10560:27;10447:146;;;:::o;10599:425::-;10677:5;10702:66;10718:49;10760:6;10718:49;:::i;:::-;10702:66;:::i;:::-;10693:75;;10791:6;10784:5;10777:21;10829:4;10822:5;10818:16;10867:3;10858:6;10853:3;10849:16;10846:25;10843:112;;;10874:79;;:::i;:::-;10843:112;10964:54;11011:6;11006:3;11001;10964:54;:::i;:::-;10683:341;10599:425;;;;;:::o;11044:340::-;11100:5;11149:3;11142:4;11134:6;11130:17;11126:27;11116:122;;11157:79;;:::i;:::-;11116:122;11274:6;11261:20;11299:79;11374:3;11366:6;11359:4;11351:6;11347:17;11299:79;:::i;:::-;11290:88;;11106:278;11044:340;;;;:::o;11390:509::-;11459:6;11508:2;11496:9;11487:7;11483:23;11479:32;11476:119;;;11514:79;;:::i;:::-;11476:119;11662:1;11651:9;11647:17;11634:31;11692:18;11684:6;11681:30;11678:117;;;11714:79;;:::i;:::-;11678:117;11819:63;11874:7;11865:6;11854:9;11850:22;11819:63;:::i;:::-;11809:73;;11605:287;11390:509;;;;:::o;11905:307::-;11966:4;12056:18;12048:6;12045:30;12042:56;;;12078:18;;:::i;:::-;12042:56;12116:29;12138:6;12116:29;:::i;:::-;12108:37;;12200:4;12194;12190:15;12182:23;;11905:307;;;:::o;12218:423::-;12295:5;12320:65;12336:48;12377:6;12336:48;:::i;:::-;12320:65;:::i;:::-;12311:74;;12408:6;12401:5;12394:21;12446:4;12439:5;12435:16;12484:3;12475:6;12470:3;12466:16;12463:25;12460:112;;;12491:79;;:::i;:::-;12460:112;12581:54;12628:6;12623:3;12618;12581:54;:::i;:::-;12301:340;12218:423;;;;;:::o;12660:338::-;12715:5;12764:3;12757:4;12749:6;12745:17;12741:27;12731:122;;12772:79;;:::i;:::-;12731:122;12889:6;12876:20;12914:78;12988:3;12980:6;12973:4;12965:6;12961:17;12914:78;:::i;:::-;12905:87;;12721:277;12660:338;;;;:::o;13004:943::-;13099:6;13107;13115;13123;13172:3;13160:9;13151:7;13147:23;13143:33;13140:120;;;13179:79;;:::i;:::-;13140:120;13299:1;13324:53;13369:7;13360:6;13349:9;13345:22;13324:53;:::i;:::-;13314:63;;13270:117;13426:2;13452:53;13497:7;13488:6;13477:9;13473:22;13452:53;:::i;:::-;13442:63;;13397:118;13554:2;13580:53;13625:7;13616:6;13605:9;13601:22;13580:53;:::i;:::-;13570:63;;13525:118;13710:2;13699:9;13695:18;13682:32;13741:18;13733:6;13730:30;13727:117;;;13763:79;;:::i;:::-;13727:117;13868:62;13922:7;13913:6;13902:9;13898:22;13868:62;:::i;:::-;13858:72;;13653:287;13004:943;;;;;;;:::o;13953:474::-;14021:6;14029;14078:2;14066:9;14057:7;14053:23;14049:32;14046:119;;;14084:79;;:::i;:::-;14046:119;14204:1;14229:53;14274:7;14265:6;14254:9;14250:22;14229:53;:::i;:::-;14219:63;;14175:117;14331:2;14357:53;14402:7;14393:6;14382:9;14378:22;14357:53;:::i;:::-;14347:63;;14302:118;13953:474;;;;;:::o;14433:180::-;14481:77;14478:1;14471:88;14578:4;14575:1;14568:15;14602:4;14599:1;14592:15;14619:320;14663:6;14700:1;14694:4;14690:12;14680:22;;14747:1;14741:4;14737:12;14768:18;14758:81;;14824:4;14816:6;14812:17;14802:27;;14758:81;14886:2;14878:6;14875:14;14855:18;14852:38;14849:84;;14905:18;;:::i;:::-;14849:84;14670:269;14619:320;;;:::o;14945:220::-;15085:34;15081:1;15073:6;15069:14;15062:58;15154:3;15149:2;15141:6;15137:15;15130:28;14945:220;:::o;15171:366::-;15313:3;15334:67;15398:2;15393:3;15334:67;:::i;:::-;15327:74;;15410:93;15499:3;15410:93;:::i;:::-;15528:2;15523:3;15519:12;15512:19;;15171:366;;;:::o;15543:419::-;15709:4;15747:2;15736:9;15732:18;15724:26;;15796:9;15790:4;15786:20;15782:1;15771:9;15767:17;15760:47;15824:131;15950:4;15824:131;:::i;:::-;15816:139;;15543:419;;;:::o;15968:248::-;16108:34;16104:1;16096:6;16092:14;16085:58;16177:31;16172:2;16164:6;16160:15;16153:56;15968:248;:::o;16222:366::-;16364:3;16385:67;16449:2;16444:3;16385:67;:::i;:::-;16378:74;;16461:93;16550:3;16461:93;:::i;:::-;16579:2;16574:3;16570:12;16563:19;;16222:366;;;:::o;16594:419::-;16760:4;16798:2;16787:9;16783:18;16775:26;;16847:9;16841:4;16837:20;16833:1;16822:9;16818:17;16811:47;16875:131;17001:4;16875:131;:::i;:::-;16867:139;;16594:419;;;:::o;17019:232::-;17159:34;17155:1;17147:6;17143:14;17136:58;17228:15;17223:2;17215:6;17211:15;17204:40;17019:232;:::o;17257:366::-;17399:3;17420:67;17484:2;17479:3;17420:67;:::i;:::-;17413:74;;17496:93;17585:3;17496:93;:::i;:::-;17614:2;17609:3;17605:12;17598:19;;17257:366;;;:::o;17629:419::-;17795:4;17833:2;17822:9;17818:18;17810:26;;17882:9;17876:4;17872:20;17868:1;17857:9;17853:17;17846:47;17910:131;18036:4;17910:131;:::i;:::-;17902:139;;17629:419;;;:::o;18054:180::-;18102:77;18099:1;18092:88;18199:4;18196:1;18189:15;18223:4;18220:1;18213:15;18240:180;18288:77;18285:1;18278:88;18385:4;18382:1;18375:15;18409:4;18406:1;18399:15;18426:233;18465:3;18488:24;18506:5;18488:24;:::i;:::-;18479:33;;18534:66;18527:5;18524:77;18521:103;;18604:18;;:::i;:::-;18521:103;18651:1;18644:5;18640:13;18633:20;;18426:233;;;:::o;18665:171::-;18805:23;18801:1;18793:6;18789:14;18782:47;18665:171;:::o;18842:366::-;18984:3;19005:67;19069:2;19064:3;19005:67;:::i;:::-;18998:74;;19081:93;19170:3;19081:93;:::i;:::-;19199:2;19194:3;19190:12;19183:19;;18842:366;;;:::o;19214:419::-;19380:4;19418:2;19407:9;19403:18;19395:26;;19467:9;19461:4;19457:20;19453:1;19442:9;19438:17;19431:47;19495:131;19621:4;19495:131;:::i;:::-;19487:139;;19214:419;;;:::o;19639:194::-;19679:4;19699:20;19717:1;19699:20;:::i;:::-;19694:25;;19733:20;19751:1;19733:20;:::i;:::-;19728:25;;19777:1;19774;19770:9;19762:17;;19801:1;19795:4;19792:11;19789:37;;;19806:18;;:::i;:::-;19789:37;19639:194;;;;:::o;19839:174::-;19979:26;19975:1;19967:6;19963:14;19956:50;19839:174;:::o;20019:366::-;20161:3;20182:67;20246:2;20241:3;20182:67;:::i;:::-;20175:74;;20258:93;20347:3;20258:93;:::i;:::-;20376:2;20371:3;20367:12;20360:19;;20019:366;;;:::o;20391:419::-;20557:4;20595:2;20584:9;20580:18;20572:26;;20644:9;20638:4;20634:20;20630:1;20619:9;20615:17;20608:47;20672:131;20798:4;20672:131;:::i;:::-;20664:139;;20391:419;;;:::o;20816:228::-;20956:34;20952:1;20944:6;20940:14;20933:58;21025:11;21020:2;21012:6;21008:15;21001:36;20816:228;:::o;21050:366::-;21192:3;21213:67;21277:2;21272:3;21213:67;:::i;:::-;21206:74;;21289:93;21378:3;21289:93;:::i;:::-;21407:2;21402:3;21398:12;21391:19;;21050:366;;;:::o;21422:419::-;21588:4;21626:2;21615:9;21611:18;21603:26;;21675:9;21669:4;21665:20;21661:1;21650:9;21646:17;21639:47;21703:131;21829:4;21703:131;:::i;:::-;21695:139;;21422:419;;;:::o;21847:191::-;21887:3;21906:20;21924:1;21906:20;:::i;:::-;21901:25;;21940:20;21958:1;21940:20;:::i;:::-;21935:25;;21983:1;21980;21976:9;21969:16;;22004:3;22001:1;21998:10;21995:36;;;22011:18;;:::i;:::-;21995:36;21847:191;;;;:::o;22044:230::-;22184:34;22180:1;22172:6;22168:14;22161:58;22253:13;22248:2;22240:6;22236:15;22229:38;22044:230;:::o;22280:366::-;22422:3;22443:67;22507:2;22502:3;22443:67;:::i;:::-;22436:74;;22519:93;22608:3;22519:93;:::i;:::-;22637:2;22632:3;22628:12;22621:19;;22280:366;;;:::o;22652:419::-;22818:4;22856:2;22845:9;22841:18;22833:26;;22905:9;22899:4;22895:20;22891:1;22880:9;22876:17;22869:47;22933:131;23059:4;22933:131;:::i;:::-;22925:139;;22652:419;;;:::o;23077:163::-;23217:15;23213:1;23205:6;23201:14;23194:39;23077:163;:::o;23246:366::-;23388:3;23409:67;23473:2;23468:3;23409:67;:::i;:::-;23402:74;;23485:93;23574:3;23485:93;:::i;:::-;23603:2;23598:3;23594:12;23587:19;;23246:366;;;:::o;23618:419::-;23784:4;23822:2;23811:9;23807:18;23799:26;;23871:9;23865:4;23861:20;23857:1;23846:9;23842:17;23835:47;23899:131;24025:4;23899:131;:::i;:::-;23891:139;;23618:419;;;:::o;24043:179::-;24183:31;24179:1;24171:6;24167:14;24160:55;24043:179;:::o;24228:366::-;24370:3;24391:67;24455:2;24450:3;24391:67;:::i;:::-;24384:74;;24467:93;24556:3;24467:93;:::i;:::-;24585:2;24580:3;24576:12;24569:19;;24228:366;;;:::o;24600:419::-;24766:4;24804:2;24793:9;24789:18;24781:26;;24853:9;24847:4;24843:20;24839:1;24828:9;24824:17;24817:47;24881:131;25007:4;24881:131;:::i;:::-;24873:139;;24600:419;;;:::o;25025:348::-;25065:7;25088:20;25106:1;25088:20;:::i;:::-;25083:25;;25122:20;25140:1;25122:20;:::i;:::-;25117:25;;25310:1;25242:66;25238:74;25235:1;25232:81;25227:1;25220:9;25213:17;25209:105;25206:131;;;25317:18;;:::i;:::-;25206:131;25365:1;25362;25358:9;25347:20;;25025:348;;;;:::o;25379:164::-;25519:16;25515:1;25507:6;25503:14;25496:40;25379:164;:::o;25549:366::-;25691:3;25712:67;25776:2;25771:3;25712:67;:::i;:::-;25705:74;;25788:93;25877:3;25788:93;:::i;:::-;25906:2;25901:3;25897:12;25890:19;;25549:366;;;:::o;25921:419::-;26087:4;26125:2;26114:9;26110:18;26102:26;;26174:9;26168:4;26164:20;26160:1;26149:9;26145:17;26138:47;26202:131;26328:4;26202:131;:::i;:::-;26194:139;;25921:419;;;:::o;26346:159::-;26486:11;26482:1;26474:6;26470:14;26463:35;26346:159;:::o;26511:365::-;26653:3;26674:66;26738:1;26733:3;26674:66;:::i;:::-;26667:73;;26749:93;26838:3;26749:93;:::i;:::-;26867:2;26862:3;26858:12;26851:19;;26511:365;;;:::o;26882:419::-;27048:4;27086:2;27075:9;27071:18;27063:26;;27135:9;27129:4;27125:20;27121:1;27110:9;27106:17;27099:47;27163:131;27289:4;27163:131;:::i;:::-;27155:139;;26882:419;;;:::o;27307:168::-;27447:20;27443:1;27435:6;27431:14;27424:44;27307:168;:::o;27481:366::-;27623:3;27644:67;27708:2;27703:3;27644:67;:::i;:::-;27637:74;;27720:93;27809:3;27720:93;:::i;:::-;27838:2;27833:3;27829:12;27822:19;;27481:366;;;:::o;27853:419::-;28019:4;28057:2;28046:9;28042:18;28034:26;;28106:9;28100:4;28096:20;28092:1;28081:9;28077:17;28070:47;28134:131;28260:4;28134:131;:::i;:::-;28126:139;;27853:419;;;:::o;28278:177::-;28418:29;28414:1;28406:6;28402:14;28395:53;28278:177;:::o;28461:366::-;28603:3;28624:67;28688:2;28683:3;28624:67;:::i;:::-;28617:74;;28700:93;28789:3;28700:93;:::i;:::-;28818:2;28813:3;28809:12;28802:19;;28461:366;;;:::o;28833:419::-;28999:4;29037:2;29026:9;29022:18;29014:26;;29086:9;29080:4;29076:20;29072:1;29061:9;29057:17;29050:47;29114:131;29240:4;29114:131;:::i;:::-;29106:139;;28833:419;;;:::o;29258:141::-;29307:4;29330:3;29322:11;;29353:3;29350:1;29343:14;29387:4;29384:1;29374:18;29366:26;;29258:141;;;:::o;29405:93::-;29442:6;29489:2;29484;29477:5;29473:14;29469:23;29459:33;;29405:93;;;:::o;29504:107::-;29548:8;29598:5;29592:4;29588:16;29567:37;;29504:107;;;;:::o;29617:393::-;29686:6;29736:1;29724:10;29720:18;29759:97;29789:66;29778:9;29759:97;:::i;:::-;29877:39;29907:8;29896:9;29877:39;:::i;:::-;29865:51;;29949:4;29945:9;29938:5;29934:21;29925:30;;29998:4;29988:8;29984:19;29977:5;29974:30;29964:40;;29693:317;;29617:393;;;;;:::o;30016:60::-;30044:3;30065:5;30058:12;;30016:60;;;:::o;30082:142::-;30132:9;30165:53;30183:34;30192:24;30210:5;30192:24;:::i;:::-;30183:34;:::i;:::-;30165:53;:::i;:::-;30152:66;;30082:142;;;:::o;30230:75::-;30273:3;30294:5;30287:12;;30230:75;;;:::o;30311:269::-;30421:39;30452:7;30421:39;:::i;:::-;30482:91;30531:41;30555:16;30531:41;:::i;:::-;30523:6;30516:4;30510:11;30482:91;:::i;:::-;30476:4;30469:105;30387:193;30311:269;;;:::o;30586:73::-;30631:3;30586:73;:::o;30665:189::-;30742:32;;:::i;:::-;30783:65;30841:6;30833;30827:4;30783:65;:::i;:::-;30718:136;30665:189;;:::o;30860:186::-;30920:120;30937:3;30930:5;30927:14;30920:120;;;30991:39;31028:1;31021:5;30991:39;:::i;:::-;30964:1;30957:5;30953:13;30944:22;;30920:120;;;30860:186;;:::o;31052:543::-;31153:2;31148:3;31145:11;31142:446;;;31187:38;31219:5;31187:38;:::i;:::-;31271:29;31289:10;31271:29;:::i;:::-;31261:8;31257:44;31454:2;31442:10;31439:18;31436:49;;;31475:8;31460:23;;31436:49;31498:80;31554:22;31572:3;31554:22;:::i;:::-;31544:8;31540:37;31527:11;31498:80;:::i;:::-;31157:431;;31142:446;31052:543;;;:::o;31601:117::-;31655:8;31705:5;31699:4;31695:16;31674:37;;31601:117;;;;:::o;31724:169::-;31768:6;31801:51;31849:1;31845:6;31837:5;31834:1;31830:13;31801:51;:::i;:::-;31797:56;31882:4;31876;31872:15;31862:25;;31775:118;31724:169;;;;:::o;31898:295::-;31974:4;32120:29;32145:3;32139:4;32120:29;:::i;:::-;32112:37;;32182:3;32179:1;32175:11;32169:4;32166:21;32158:29;;31898:295;;;;:::o;32198:1395::-;32315:37;32348:3;32315:37;:::i;:::-;32417:18;32409:6;32406:30;32403:56;;;32439:18;;:::i;:::-;32403:56;32483:38;32515:4;32509:11;32483:38;:::i;:::-;32568:67;32628:6;32620;32614:4;32568:67;:::i;:::-;32662:1;32686:4;32673:17;;32718:2;32710:6;32707:14;32735:1;32730:618;;;;33392:1;33409:6;33406:77;;;33458:9;33453:3;33449:19;33443:26;33434:35;;33406:77;33509:67;33569:6;33562:5;33509:67;:::i;:::-;33503:4;33496:81;33365:222;32700:887;;32730:618;32782:4;32778:9;32770:6;32766:22;32816:37;32848:4;32816:37;:::i;:::-;32875:1;32889:208;32903:7;32900:1;32897:14;32889:208;;;32982:9;32977:3;32973:19;32967:26;32959:6;32952:42;33033:1;33025:6;33021:14;33011:24;;33080:2;33069:9;33065:18;33052:31;;32926:4;32923:1;32919:12;32914:17;;32889:208;;;33125:6;33116:7;33113:19;33110:179;;;33183:9;33178:3;33174:19;33168:26;33226:48;33268:4;33260:6;33256:17;33245:9;33226:48;:::i;:::-;33218:6;33211:64;33133:156;33110:179;33335:1;33331;33323:6;33319:14;33315:22;33309:4;33302:36;32737:611;;;32700:887;;32290:1303;;;32198:1395;;:::o;33599:148::-;33701:11;33738:3;33723:18;;33599:148;;;;:::o;33753:390::-;33859:3;33887:39;33920:5;33887:39;:::i;:::-;33942:89;34024:6;34019:3;33942:89;:::i;:::-;33935:96;;34040:65;34098:6;34093:3;34086:4;34079:5;34075:16;34040:65;:::i;:::-;34130:6;34125:3;34121:16;34114:23;;33863:280;33753:390;;;;:::o;34149:435::-;34329:3;34351:95;34442:3;34433:6;34351:95;:::i;:::-;34344:102;;34463:95;34554:3;34545:6;34463:95;:::i;:::-;34456:102;;34575:3;34568:10;;34149:435;;;;;:::o;34590:225::-;34730:34;34726:1;34718:6;34714:14;34707:58;34799:8;34794:2;34786:6;34782:15;34775:33;34590:225;:::o;34821:366::-;34963:3;34984:67;35048:2;35043:3;34984:67;:::i;:::-;34977:74;;35060:93;35149:3;35060:93;:::i;:::-;35178:2;35173:3;35169:12;35162:19;;34821:366;;;:::o;35193:419::-;35359:4;35397:2;35386:9;35382:18;35374:26;;35446:9;35440:4;35436:20;35432:1;35421:9;35417:17;35410:47;35474:131;35600:4;35474:131;:::i;:::-;35466:139;;35193:419;;;:::o;35618:224::-;35758:34;35754:1;35746:6;35742:14;35735:58;35827:7;35822:2;35814:6;35810:15;35803:32;35618:224;:::o;35848:366::-;35990:3;36011:67;36075:2;36070:3;36011:67;:::i;:::-;36004:74;;36087:93;36176:3;36087:93;:::i;:::-;36205:2;36200:3;36196:12;36189:19;;35848:366;;;:::o;36220:419::-;36386:4;36424:2;36413:9;36409:18;36401:26;;36473:9;36467:4;36463:20;36459:1;36448:9;36444:17;36437:47;36501:131;36627:4;36501:131;:::i;:::-;36493:139;;36220:419;;;:::o;36645:223::-;36785:34;36781:1;36773:6;36769:14;36762:58;36854:6;36849:2;36841:6;36837:15;36830:31;36645:223;:::o;36874:366::-;37016:3;37037:67;37101:2;37096:3;37037:67;:::i;:::-;37030:74;;37113:93;37202:3;37113:93;:::i;:::-;37231:2;37226:3;37222:12;37215:19;;36874:366;;;:::o;37246:419::-;37412:4;37450:2;37439:9;37435:18;37427:26;;37499:9;37493:4;37489:20;37485:1;37474:9;37470:17;37463:47;37527:131;37653:4;37527:131;:::i;:::-;37519:139;;37246:419;;;:::o;37671:182::-;37811:34;37807:1;37799:6;37795:14;37788:58;37671:182;:::o;37859:366::-;38001:3;38022:67;38086:2;38081:3;38022:67;:::i;:::-;38015:74;;38098:93;38187:3;38098:93;:::i;:::-;38216:2;38211:3;38207:12;38200:19;;37859:366;;;:::o;38231:419::-;38397:4;38435:2;38424:9;38420:18;38412:26;;38484:9;38478:4;38474:20;38470:1;38459:9;38455:17;38448:47;38512:131;38638:4;38512:131;:::i;:::-;38504:139;;38231:419;;;:::o;38656:175::-;38796:27;38792:1;38784:6;38780:14;38773:51;38656:175;:::o;38837:366::-;38979:3;39000:67;39064:2;39059:3;39000:67;:::i;:::-;38993:74;;39076:93;39165:3;39076:93;:::i;:::-;39194:2;39189:3;39185:12;39178:19;;38837:366;;;:::o;39209:419::-;39375:4;39413:2;39402:9;39398:18;39390:26;;39462:9;39456:4;39452:20;39448:1;39437:9;39433:17;39426:47;39490:131;39616:4;39490:131;:::i;:::-;39482:139;;39209:419;;;:::o;39634:237::-;39774:34;39770:1;39762:6;39758:14;39751:58;39843:20;39838:2;39830:6;39826:15;39819:45;39634:237;:::o;39877:366::-;40019:3;40040:67;40104:2;40099:3;40040:67;:::i;:::-;40033:74;;40116:93;40205:3;40116:93;:::i;:::-;40234:2;40229:3;40225:12;40218:19;;39877:366;;;:::o;40249:419::-;40415:4;40453:2;40442:9;40438:18;40430:26;;40502:9;40496:4;40492:20;40488:1;40477:9;40473:17;40466:47;40530:131;40656:4;40530:131;:::i;:::-;40522:139;;40249:419;;;:::o;40674:180::-;40722:77;40719:1;40712:88;40819:4;40816:1;40809:15;40843:4;40840:1;40833:15;40860:98;40911:6;40945:5;40939:12;40929:22;;40860:98;;;:::o;40964:168::-;41047:11;41081:6;41076:3;41069:19;41121:4;41116:3;41112:14;41097:29;;40964:168;;;;:::o;41138:373::-;41224:3;41252:38;41284:5;41252:38;:::i;:::-;41306:70;41369:6;41364:3;41306:70;:::i;:::-;41299:77;;41385:65;41443:6;41438:3;41431:4;41424:5;41420:16;41385:65;:::i;:::-;41475:29;41497:6;41475:29;:::i;:::-;41470:3;41466:39;41459:46;;41228:283;41138:373;;;;:::o;41517:640::-;41712:4;41750:3;41739:9;41735:19;41727:27;;41764:71;41832:1;41821:9;41817:17;41808:6;41764:71;:::i;:::-;41845:72;41913:2;41902:9;41898:18;41889:6;41845:72;:::i;:::-;41927;41995:2;41984:9;41980:18;41971:6;41927:72;:::i;:::-;42046:9;42040:4;42036:20;42031:2;42020:9;42016:18;42009:48;42074:76;42145:4;42136:6;42074:76;:::i;:::-;42066:84;;41517:640;;;;;;;:::o;42163:141::-;42219:5;42250:6;42244:13;42235:22;;42266:32;42292:5;42266:32;:::i;:::-;42163:141;;;;:::o;42310:349::-;42379:6;42428:2;42416:9;42407:7;42403:23;42399:32;42396:119;;;42434:79;;:::i;:::-;42396:119;42554:1;42579:63;42634:7;42625:6;42614:9;42610:22;42579:63;:::i;:::-;42569:73;;42525:127;42310:349;;;;:::o;42665:182::-;42805:34;42801:1;42793:6;42789:14;42782:58;42665:182;:::o;42853:366::-;42995:3;43016:67;43080:2;43075:3;43016:67;:::i;:::-;43009:74;;43092:93;43181:3;43092:93;:::i;:::-;43210:2;43205:3;43201:12;43194:19;;42853:366;;;:::o;43225:419::-;43391:4;43429:2;43418:9;43414:18;43406:26;;43478:9;43472:4;43468:20;43464:1;43453:9;43449:17;43442:47;43506:131;43632:4;43506:131;:::i;:::-;43498:139;;43225:419;;;:::o;43650:178::-;43790:30;43786:1;43778:6;43774:14;43767:54;43650:178;:::o;43834:366::-;43976:3;43997:67;44061:2;44056:3;43997:67;:::i;:::-;43990:74;;44073:93;44162:3;44073:93;:::i;:::-;44191:2;44186:3;44182:12;44175:19;;43834:366;;;:::o;44206:419::-;44372:4;44410:2;44399:9;44395:18;44387:26;;44459:9;44453:4;44449:20;44445:1;44434:9;44430:17;44423:47;44487:131;44613:4;44487:131;:::i;:::-;44479:139;;44206:419;;;:::o

Swarm Source

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