ETH Price: $3,702.96 (+2.97%)

Token

ERC-20: The Giddys (TG)
 

Overview

Max Total Supply

1,500 TG

Holders

868

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TG
0xbfd8b3d30ef7c3633a340e10c1d5d3c5d3a3617a
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:
GiddyNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_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) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_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/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.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 functionCall(target, data, "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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.7.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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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 = _owners[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 nor 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 nor 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 nor 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 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 _owners[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);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

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

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

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @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.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

// File: contracts/GiddysNFT.sol


pragma solidity >=0.4.22 <0.9.0;









contract GiddyNFT is
  ERC721URIStorage,
  ERC721Pausable,
  ERC721Enumerable,
  Ownable
{
  using SafeMath for uint256;
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private _tokenIdTracker;

  uint256 public MAX_GIDDYS = 1500;
  uint256 public PRICE = 0.00 ether;
  uint256 public MAX_BY_MINT = 1;

  string public baseTokenURI;
  string public placeholderTokenURI;

  bool public revealed = false;
  bool public whitelistActive = true;

  bytes32 public root;

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

  event CreateGiddy(uint256 indexed id);

  constructor(
    string memory _nftBaseURI,
    string memory _nftPlaceholderURI,
    bytes32 _root
  ) ERC721("The Giddys", "TG") {
    baseTokenURI = _nftBaseURI;
    placeholderTokenURI = _nftPlaceholderURI;
    root = _root;
  }

  function setMAX_GIDDYS(uint256 _maxGiddys) external onlyOwner {
    require(
      _maxGiddys < 6667,
      "You can't set the MAX ELEMENTS to be over 6666."
    );
    MAX_GIDDYS = _maxGiddys;
  }

  function setMAX_BY_MINT(uint256 _maxByMint) external onlyOwner {
    require(_maxByMint > 0, "You can't set the MAX BY MINT to be 0 or less.");
    MAX_BY_MINT = _maxByMint;
  }

  function setWhitelistActive(bool _active) external onlyOwner {
    whitelistActive = _active;
  }

  function setPRICE(uint256 _price) external onlyOwner {
    PRICE = _price;
  }

  function _totalSupply() internal view returns (uint256) {
    return _tokenIdTracker.current();
  }

  function totalMint() public view returns (uint256) {
    return _totalSupply();
  }

  function mint(uint256 _numTokensToMint, bytes32[] memory proof)
    public
    payable
  {
    if (whitelistActive == true) {
      require(
        isValid(proof, keccak256(abi.encodePacked(msg.sender))),
        "Not a part of Allowlist"
      );
    }

    uint256 total = _totalSupply();
    require(total + _numTokensToMint <= MAX_GIDDYS, "Max limit");
    require(
      balanceOf(msg.sender) + _numTokensToMint <= MAX_BY_MINT,
      "Can't mint more than MAX_BY_MINT NFTs to this address"
    );
    require(total <= MAX_GIDDYS, "This sale has ended");
    require(msg.value >= price(_numTokensToMint), "Value paid is below price");

    for (uint256 i = 0; i < _numTokensToMint; i++) {
      _mintGiddy(msg.sender);
    }
  }

  function _mintGiddy(address _to) private {
    uint256 id = _totalSupply() + 1;
    _tokenIdTracker.increment();
    _safeMint(_to, id);
    _setTokenURI(id, string(abi.encodePacked(baseTokenURI, id, ".json")));
    emit CreateGiddy(id);
  }

  function price(uint256 _count) public view returns (uint256) {
    return PRICE.mul(_count);
  }

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

  function setBaseURI(string memory baseURI) public onlyOwner {
    baseTokenURI = baseURI;
  }

  function setPlaceholderURI(string memory _placeholderURI) public onlyOwner {
    placeholderTokenURI = _placeholderURI;
  }

  function pause() public onlyOwner {
    _pause();
    return;
  }

  function unpause() public onlyOwner {
    _unpause();
    return;
  }

  function getContractBalance() public view returns (uint256) {
    return address(this).balance;
  }

  // function withdrawAll() public payable onlyOwner {
  function withdrawAll() public onlyOwner {
    uint256 balance = address(this).balance;
    require(balance > 0);
    _withdraw(owner(), balance);
  }

  function _withdraw(address _address, uint256 _amount) private {
    (bool success, ) = _address.call{ value: _amount }("");
    require(success, "Transfer failed.");
  }

  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC721, ERC721Enumerable)
    returns (bool)
  {
    return super.supportsInterface(interfaceId);
  }

  function reveal() public onlyOwner {
    revealed = true;
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual override(ERC721, ERC721Pausable, ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  function _burn(uint256 tokenId)
    internal
    virtual
    override(ERC721, ERC721URIStorage)
  {
    require(tokenId == 0);
    revert("Don't burn your Giddy");
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override(ERC721, ERC721URIStorage)
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721URIStorage: URI query for nonexistent token"
    );
    string memory baseURIToUse;
    if (revealed == false) {
      baseURIToUse = placeholderTokenURI;
    } else {
      baseURIToUse = baseTokenURI;
    }
    return
      bytes(baseURIToUse).length > 0
        ? string(abi.encodePacked(baseURIToUse, tokenId.toString()))
        : "";
  }

  function isValid(bytes32[] memory proof, bytes32 leaf)
    public
    view
    returns (bool)
  {
    return MerkleProof.verify(proof, root, leaf);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_nftBaseURI","type":"string"},{"internalType":"string","name":"_nftPlaceholderURI","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"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":"uint256","name":"id","type":"uint256"}],"name":"CreateGiddy","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_BY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GIDDYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","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":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokensToMint","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxByMint","type":"uint256"}],"name":"setMAX_BY_MINT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxGiddys","type":"uint256"}],"name":"setMAX_GIDDYS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_placeholderURI","type":"string"}],"name":"setPlaceholderURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_active","type":"bool"}],"name":"setWhitelistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526105dc600e556000600f5560016010556000601360006101000a81548160ff0219169083151502179055506001601360016101000a81548160ff0219169083151502179055503480156200005757600080fd5b50604051620053393803806200533983398181016040528101906200007d9190620003ad565b6040518060400160405280600a81526020017f54686520476964647973000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f544700000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010192919062000268565b5080600190805190602001906200011a92919062000268565b5050506000600760006101000a81548160ff021916908315150217905550620001586200014c6200019a60201b60201c565b620001a260201b60201c565b82601190805190602001906200017092919062000268565b5081601290805190602001906200018992919062000268565b5080601481905550505050620005ef565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027690620004e6565b90600052602060002090601f0160209004810192826200029a5760008555620002e6565b82601f10620002b557805160ff1916838001178555620002e6565b82800160010185558215620002e6579182015b82811115620002e5578251825591602001919060010190620002c8565b5b509050620002f59190620002f9565b5090565b5b8082111562000314576000816000905550600101620002fa565b5090565b60006200032f620003298462000470565b62000447565b9050828152602081018484840111156200034e576200034d620005b5565b5b6200035b848285620004b0565b509392505050565b6000815190506200037481620005d5565b92915050565b600082601f830112620003925762000391620005b0565b5b8151620003a484826020860162000318565b91505092915050565b600080600060608486031215620003c957620003c8620005bf565b5b600084015167ffffffffffffffff811115620003ea57620003e9620005ba565b5b620003f8868287016200037a565b935050602084015167ffffffffffffffff8111156200041c576200041b620005ba565b5b6200042a868287016200037a565b92505060406200043d8682870162000363565b9150509250925092565b60006200045362000466565b90506200046182826200051c565b919050565b6000604051905090565b600067ffffffffffffffff8211156200048e576200048d62000581565b5b6200049982620005c4565b9050602081019050919050565b6000819050919050565b60005b83811015620004d0578082015181840152602081019050620004b3565b83811115620004e0576000848401525b50505050565b60006002820490506001821680620004ff57607f821691505b6020821081141562000516576200051562000552565b5b50919050565b6200052782620005c4565b810181811067ffffffffffffffff8211171562000549576200054862000581565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620005e081620004a6565b8114620005ec57600080fd5b50565b614d3a80620005ff6000396000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063b88d4fde116100b6578063d547cfb71161007a578063d547cfb7146108b3578063dc0fa974146108de578063e985e9c514610909578063ebf0c71714610946578063eea52d3814610971578063f2fde38b1461099a5761025c565b8063b88d4fde146107cb578063b8a20ed0146107f4578063ba41b0c614610831578063c3b754dc1461084d578063c87b56dd146108765761025c565b80638da5cb5b116101085780638da5cb5b146106e15780638ecc80831461070c57806395d89b4114610737578063976cb45614610762578063a22cb4651461078b578063a475b5dd146107b45761025c565b8063715018a6146106465780638456cb591461065d578063853828b6146106745780638ad5de281461068b5780638d859f3e146106b65761025c565b80633f4ba83a116101dd57806359a7715a116101a157806359a7715a146105225780635c975abb1461054d5780636223a798146105785780636352211e146105a15780636f9fb98a146105de57806370a08231146106095761025c565b80633f4ba83a1461045157806342842e0e146104685780634f6ccce71461049157806351830227146104ce57806355f804b3146104f95761025c565b806318160ddd1161022457806318160ddd1461035a57806323b872dd1461038557806326a49e37146103ae5780632f745c59146103eb5780633574a2dd146104285761025c565b806301ffc9a71461026157806302ce58131461029e57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b506102886004803603810190610283919061348f565b6109c3565b6040516102959190613c4f565b60405180910390f35b3480156102aa57600080fd5b506102b36109d5565b6040516102c09190613c4f565b60405180910390f35b3480156102d557600080fd5b506102de6109e8565b6040516102eb9190613c85565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190613532565b610a7a565b6040516103289190613be8565b60405180910390f35b34801561033d57600080fd5b50610358600480360381019061035391906133c6565b610ac0565b005b34801561036657600080fd5b5061036f610bd8565b60405161037c9190614027565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a791906132b0565b610be5565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190613532565b610c45565b6040516103e29190614027565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d91906133c6565b610c63565b60405161041f9190614027565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a91906134e9565b610d08565b005b34801561045d57600080fd5b50610466610d2a565b005b34801561047457600080fd5b5061048f600480360381019061048a91906132b0565b610d3c565b005b34801561049d57600080fd5b506104b860048036038101906104b39190613532565b610d5c565b6040516104c59190614027565b60405180910390f35b3480156104da57600080fd5b506104e3610dcd565b6040516104f09190613c4f565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b91906134e9565b610de0565b005b34801561052e57600080fd5b50610537610e02565b6040516105449190614027565b60405180910390f35b34801561055957600080fd5b50610562610e11565b60405161056f9190613c4f565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a9190613532565b610e28565b005b3480156105ad57600080fd5b506105c860048036038101906105c39190613532565b610e7d565b6040516105d59190613be8565b60405180910390f35b3480156105ea57600080fd5b506105f3610f2f565b6040516106009190614027565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613243565b610f37565b60405161063d9190614027565b60405180910390f35b34801561065257600080fd5b5061065b610fef565b005b34801561066957600080fd5b50610672611003565b005b34801561068057600080fd5b50610689611015565b005b34801561069757600080fd5b506106a0611043565b6040516106ad9190614027565b60405180910390f35b3480156106c257600080fd5b506106cb611049565b6040516106d89190614027565b60405180910390f35b3480156106ed57600080fd5b506106f661104f565b6040516107039190613be8565b60405180910390f35b34801561071857600080fd5b50610721611079565b60405161072e9190613c85565b60405180910390f35b34801561074357600080fd5b5061074c611107565b6040516107599190613c85565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613532565b611199565b005b34801561079757600080fd5b506107b260048036038101906107ad9190613386565b6111ef565b005b3480156107c057600080fd5b506107c9611205565b005b3480156107d757600080fd5b506107f260048036038101906107ed9190613303565b61122a565b005b34801561080057600080fd5b5061081b60048036038101906108169190613406565b61128c565b6040516108289190613c4f565b60405180910390f35b61084b6004803603810190610846919061355f565b6112a3565b005b34801561085957600080fd5b50610874600480360381019061086f9190613462565b6114a0565b005b34801561088257600080fd5b5061089d60048036038101906108989190613532565b6114c5565b6040516108aa9190613c85565b60405180910390f35b3480156108bf57600080fd5b506108c861169e565b6040516108d59190613c85565b60405180910390f35b3480156108ea57600080fd5b506108f361172c565b6040516109009190614027565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190613270565b611732565b60405161093d9190613c4f565b60405180910390f35b34801561095257600080fd5b5061095b6117c6565b6040516109689190613c6a565b60405180910390f35b34801561097d57600080fd5b5061099860048036038101906109939190613532565b6117cc565b005b3480156109a657600080fd5b506109c160048036038101906109bc9190613243565b6117de565b005b60006109ce82611862565b9050919050565b601360019054906101000a900460ff1681565b6060600080546109f79061432d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a239061432d565b8015610a705780601f10610a4557610100808354040283529160200191610a70565b820191906000526020600020905b815481529060010190602001808311610a5357829003601f168201915b5050505050905090565b6000610a85826118dc565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610acb82610e7d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613f67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5b611927565b73ffffffffffffffffffffffffffffffffffffffff161480610b8a5750610b8981610b84611927565b611732565b5b610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090613ea7565b60405180910390fd5b610bd3838361192f565b505050565b6000600a80549050905090565b610bf6610bf0611927565b826119e8565b610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c90614007565b60405180910390fd5b610c40838383611a7d565b505050565b6000610c5c82600f54611ce490919063ffffffff16565b9050919050565b6000610c6e83610f37565b8210610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690613ce7565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d10611cfa565b8060129080519060200190610d26929190612fa4565b5050565b610d32611cfa565b610d3a611d78565b565b610d578383836040518060200160405280600081525061122a565b505050565b6000610d66610bd8565b8210610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90613fc7565b60405180910390fd5b600a8281548110610dbb57610dba6144f4565b5b90600052602060002001549050919050565b601360009054906101000a900460ff1681565b610de8611cfa565b8060119080519060200190610dfe929190612fa4565b5050565b6000610e0c611ddb565b905090565b6000600760009054906101000a900460ff16905090565b610e30611cfa565b60008111610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90613e27565b60405180910390fd5b8060108190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613f47565b60405180910390fd5b80915050919050565b600047905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f90613e47565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ff7611cfa565b6110016000611dec565b565b61100b611cfa565b611013611eb2565b565b61101d611cfa565b60004790506000811161102f57600080fd5b61104061103a61104f565b82611f15565b50565b60105481565b600f5481565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601280546110869061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546110b29061432d565b80156110ff5780601f106110d4576101008083540402835291602001916110ff565b820191906000526020600020905b8154815290600101906020018083116110e257829003601f168201915b505050505081565b6060600180546111169061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546111429061432d565b801561118f5780601f106111645761010080835404028352916020019161118f565b820191906000526020600020905b81548152906001019060200180831161117257829003601f168201915b5050505050905090565b6111a1611cfa565b611a0b81106111e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dc90613f27565b60405180910390fd5b80600e8190555050565b6112016111fa611927565b8383611fc6565b5050565b61120d611cfa565b6001601360006101000a81548160ff021916908315150217905550565b61123b611235611927565b836119e8565b61127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190614007565b60405180910390fd5b61128684848484612133565b50505050565b600061129b836014548461218f565b905092915050565b60011515601360019054906101000a900460ff161515141561132f576112ef81336040516020016112d49190613b61565b6040516020818303038152906040528051906020012061128c565b61132e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132590613e87565b60405180910390fd5b5b6000611339611ddb565b9050600e54838261134a9190614158565b111561138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290613dc7565b60405180910390fd5b6010548361139833610f37565b6113a29190614158565b11156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90613fa7565b60405180910390fd5b600e54811115611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90613de7565b60405180910390fd5b61143183610c45565b341015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613fe7565b60405180910390fd5b60005b8381101561149a57611487336121a6565b808061149290614390565b915050611476565b50505050565b6114a8611cfa565b80601360016101000a81548160ff02191690831515021790555050565b60606114d08261222f565b61150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690613ee7565b60405180910390fd5b606060001515601360009054906101000a900460ff16151514156115bf576012805461153a9061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546115669061432d565b80156115b35780601f10611588576101008083540402835291602001916115b3565b820191906000526020600020905b81548152906001019060200180831161159657829003601f168201915b5050505050905061164d565b601180546115cc9061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546115f89061432d565b80156116455780601f1061161a57610100808354040283529160200191611645565b820191906000526020600020905b81548152906001019060200180831161162857829003601f168201915b505050505090505b600081511161166b5760405180602001604052806000815250611696565b806116758461229b565b604051602001611686929190613b7c565b6040516020818303038152906040525b915050919050565b601180546116ab9061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546116d79061432d565b80156117245780601f106116f957610100808354040283529160200191611724565b820191906000526020600020905b81548152906001019060200180831161170757829003601f168201915b505050505081565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60145481565b6117d4611cfa565b80600f8190555050565b6117e6611cfa565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d90613d27565b60405180910390fd5b61185f81611dec565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118d557506118d4826123fc565b5b9050919050565b6118e58161222f565b611924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191b90613f47565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119a283610e7d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806119f483610e7d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a365750611a358185611732565b5b80611a7457508373ffffffffffffffffffffffffffffffffffffffff16611a5c84610a7a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a9d82610e7d565b73ffffffffffffffffffffffffffffffffffffffff1614611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90613d47565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5a90613d87565b60405180910390fd5b611b6e8383836124de565b611b7960008261192f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bc99190614239565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c209190614158565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cdf8383836124ee565b505050565b60008183611cf291906141df565b905092915050565b611d02611927565b73ffffffffffffffffffffffffffffffffffffffff16611d2061104f565b73ffffffffffffffffffffffffffffffffffffffff1614611d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6d90613f07565b60405180910390fd5b565b611d806124f3565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611dc4611927565b604051611dd19190613be8565b60405180910390a1565b6000611de7600d61253c565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611eba61254a565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611efe611927565b604051611f0b9190613be8565b60405180910390a1565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611f3b90613bd3565b60006040518083038185875af1925050503d8060008114611f78576040519150601f19603f3d011682016040523d82523d6000602084013e611f7d565b606091505b5050905080611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb890613f87565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202c90613da7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121269190613c4f565b60405180910390a3505050565b61213e848484611a7d565b61214a84848484612594565b612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090613d07565b60405180910390fd5b50505050565b60008261219c858461272b565b1490509392505050565b600060016121b2611ddb565b6121bc9190614158565b90506121c8600d612781565b6121d28282612797565b6121fe816011836040516020016121ea929190613ba0565b6040516020818303038152906040526127b5565b807f907dc5b613ee3f400eb23a2d3403716ba0a7c3661e1e4ec1b18b4c1474bb60fe60405160405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008214156122e3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123f7565b600082905060005b600082146123155780806122fe90614390565b915050600a8261230e91906141ae565b91506122eb565b60008167ffffffffffffffff81111561233157612330614523565b5b6040519080825280601f01601f1916602001820160405280156123635781602001600182028036833780820191505090505b5090505b600085146123f05760018261237c9190614239565b9150600a8561238b9190614407565b60306123979190614158565b60f81b8183815181106123ad576123ac6144f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123e991906141ae565b9450612367565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124c757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124d757506124d682612829565b5b9050919050565b6124e9838383612893565b505050565b505050565b6124fb610e11565b61253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190613cc7565b60405180910390fd5b565b600081600001549050919050565b612552610e11565b15612592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258990613e07565b60405180910390fd5b565b60006125b58473ffffffffffffffffffffffffffffffffffffffff166129a7565b1561271e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125de611927565b8786866040518563ffffffff1660e01b81526004016126009493929190613c03565b602060405180830381600087803b15801561261a57600080fd5b505af192505050801561264b57506040513d601f19601f8201168201806040525081019061264891906134bc565b60015b6126ce573d806000811461267b576040519150601f19603f3d011682016040523d82523d6000602084013e612680565b606091505b506000815114156126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd90613d07565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612723565b600190505b949350505050565b60008082905060005b84518110156127765761276182868381518110612754576127536144f4565b5b60200260200101516129ca565b9150808061276e90614390565b915050612734565b508091505092915050565b6001816000016000828254019250508190555050565b6127b18282604051806020016040528060008152506129f5565b5050565b6127be8261222f565b6127fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f490613e67565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612824929190612fa4565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61289e838383612a50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128e1576128dc81612aa8565b612920565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461291f5761291e8382612af1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129635761295e81612c5e565b6129a2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129a1576129a08282612d2f565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008183106129e2576129dd8284612dae565b6129ed565b6129ec8383612dae565b5b905092915050565b6129ff8383612dc5565b612a0c6000848484612594565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4290613d07565b60405180910390fd5b505050565b612a5b838383612f9f565b612a63610e11565b15612aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9a90613ca7565b60405180910390fd5b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612afe84610f37565b612b089190614239565b9050600060096000848152602001908152602001600020549050818114612bed576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612c729190614239565b90506000600b60008481526020019081526020016000205490506000600a8381548110612ca257612ca16144f4565b5b9060005260206000200154905080600a8381548110612cc457612cc36144f4565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612d1357612d126144c5565b5b6001900381819060005260206000200160009055905550505050565b6000612d3a83610f37565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2c90613ec7565b60405180910390fd5b612e3e8161222f565b15612e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7590613d67565b60405180910390fd5b612e8a600083836124de565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eda9190614158565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f9b600083836124ee565b5050565b505050565b828054612fb09061432d565b90600052602060002090601f016020900481019282612fd25760008555613019565b82601f10612feb57805160ff1916838001178555613019565b82800160010185558215613019579182015b82811115613018578251825591602001919060010190612ffd565b5b509050613026919061302a565b5090565b5b8082111561304357600081600090555060010161302b565b5090565b600061305a61305584614067565b614042565b9050808382526020820190508285602086028201111561307d5761307c614557565b5b60005b858110156130ad57816130938882613193565b845260208401935060208301925050600181019050613080565b5050509392505050565b60006130ca6130c584614093565b614042565b9050828152602081018484840111156130e6576130e561455c565b5b6130f18482856142eb565b509392505050565b600061310c613107846140c4565b614042565b9050828152602081018484840111156131285761312761455c565b5b6131338482856142eb565b509392505050565b60008135905061314a81614c91565b92915050565b600082601f83011261316557613164614552565b5b8135613175848260208601613047565b91505092915050565b60008135905061318d81614ca8565b92915050565b6000813590506131a281614cbf565b92915050565b6000813590506131b781614cd6565b92915050565b6000815190506131cc81614cd6565b92915050565b600082601f8301126131e7576131e6614552565b5b81356131f78482602086016130b7565b91505092915050565b600082601f83011261321557613214614552565b5b81356132258482602086016130f9565b91505092915050565b60008135905061323d81614ced565b92915050565b60006020828403121561325957613258614566565b5b60006132678482850161313b565b91505092915050565b6000806040838503121561328757613286614566565b5b60006132958582860161313b565b92505060206132a68582860161313b565b9150509250929050565b6000806000606084860312156132c9576132c8614566565b5b60006132d78682870161313b565b93505060206132e88682870161313b565b92505060406132f98682870161322e565b9150509250925092565b6000806000806080858703121561331d5761331c614566565b5b600061332b8782880161313b565b945050602061333c8782880161313b565b935050604061334d8782880161322e565b925050606085013567ffffffffffffffff81111561336e5761336d614561565b5b61337a878288016131d2565b91505092959194509250565b6000806040838503121561339d5761339c614566565b5b60006133ab8582860161313b565b92505060206133bc8582860161317e565b9150509250929050565b600080604083850312156133dd576133dc614566565b5b60006133eb8582860161313b565b92505060206133fc8582860161322e565b9150509250929050565b6000806040838503121561341d5761341c614566565b5b600083013567ffffffffffffffff81111561343b5761343a614561565b5b61344785828601613150565b925050602061345885828601613193565b9150509250929050565b60006020828403121561347857613477614566565b5b60006134868482850161317e565b91505092915050565b6000602082840312156134a5576134a4614566565b5b60006134b3848285016131a8565b91505092915050565b6000602082840312156134d2576134d1614566565b5b60006134e0848285016131bd565b91505092915050565b6000602082840312156134ff576134fe614566565b5b600082013567ffffffffffffffff81111561351d5761351c614561565b5b61352984828501613200565b91505092915050565b60006020828403121561354857613547614566565b5b60006135568482850161322e565b91505092915050565b6000806040838503121561357657613575614566565b5b60006135848582860161322e565b925050602083013567ffffffffffffffff8111156135a5576135a4614561565b5b6135b185828601613150565b9150509250929050565b6135c48161426d565b82525050565b6135db6135d68261426d565b6143d9565b82525050565b6135ea8161427f565b82525050565b6135f98161428b565b82525050565b600061360a8261410a565b6136148185614120565b93506136248185602086016142fa565b61362d8161456b565b840191505092915050565b600061364382614115565b61364d818561413c565b935061365d8185602086016142fa565b6136668161456b565b840191505092915050565b600061367c82614115565b613686818561414d565b93506136968185602086016142fa565b80840191505092915050565b600081546136af8161432d565b6136b9818661414d565b945060018216600081146136d457600181146136e557613718565b60ff19831686528186019350613718565b6136ee856140f5565b60005b83811015613710578154818901526001820191506020810190506136f1565b838801955050505b50505092915050565b600061372e602b8361413c565b915061373982614589565b604082019050919050565b600061375160148361413c565b915061375c826145d8565b602082019050919050565b6000613774602b8361413c565b915061377f82614601565b604082019050919050565b600061379760328361413c565b91506137a282614650565b604082019050919050565b60006137ba60268361413c565b91506137c58261469f565b604082019050919050565b60006137dd60258361413c565b91506137e8826146ee565b604082019050919050565b6000613800601c8361413c565b915061380b8261473d565b602082019050919050565b600061382360248361413c565b915061382e82614766565b604082019050919050565b600061384660198361413c565b9150613851826147b5565b602082019050919050565b600061386960098361413c565b9150613874826147de565b602082019050919050565b600061388c60138361413c565b915061389782614807565b602082019050919050565b60006138af60108361413c565b91506138ba82614830565b602082019050919050565b60006138d2602e8361413c565b91506138dd82614859565b604082019050919050565b60006138f560298361413c565b9150613900826148a8565b604082019050919050565b6000613918602e8361413c565b9150613923826148f7565b604082019050919050565b600061393b60178361413c565b915061394682614946565b602082019050919050565b600061395e603e8361413c565b91506139698261496f565b604082019050919050565b600061398160208361413c565b915061398c826149be565b602082019050919050565b60006139a460318361413c565b91506139af826149e7565b604082019050919050565b60006139c760058361414d565b91506139d282614a36565b600582019050919050565b60006139ea60208361413c565b91506139f582614a5f565b602082019050919050565b6000613a0d602f8361413c565b9150613a1882614a88565b604082019050919050565b6000613a3060188361413c565b9150613a3b82614ad7565b602082019050919050565b6000613a5360218361413c565b9150613a5e82614b00565b604082019050919050565b6000613a76600083614131565b9150613a8182614b4f565b600082019050919050565b6000613a9960108361413c565b9150613aa482614b52565b602082019050919050565b6000613abc60358361413c565b9150613ac782614b7b565b604082019050919050565b6000613adf602c8361413c565b9150613aea82614bca565b604082019050919050565b6000613b0260198361413c565b9150613b0d82614c19565b602082019050919050565b6000613b25602e8361413c565b9150613b3082614c42565b604082019050919050565b613b44816142e1565b82525050565b613b5b613b56826142e1565b6143fd565b82525050565b6000613b6d82846135ca565b60148201915081905092915050565b6000613b888285613671565b9150613b948284613671565b91508190509392505050565b6000613bac82856136a2565b9150613bb88284613b4a565b602082019150613bc7826139ba565b91508190509392505050565b6000613bde82613a69565b9150819050919050565b6000602082019050613bfd60008301846135bb565b92915050565b6000608082019050613c1860008301876135bb565b613c2560208301866135bb565b613c326040830185613b3b565b8181036060830152613c4481846135ff565b905095945050505050565b6000602082019050613c6460008301846135e1565b92915050565b6000602082019050613c7f60008301846135f0565b92915050565b60006020820190508181036000830152613c9f8184613638565b905092915050565b60006020820190508181036000830152613cc081613721565b9050919050565b60006020820190508181036000830152613ce081613744565b9050919050565b60006020820190508181036000830152613d0081613767565b9050919050565b60006020820190508181036000830152613d208161378a565b9050919050565b60006020820190508181036000830152613d40816137ad565b9050919050565b60006020820190508181036000830152613d60816137d0565b9050919050565b60006020820190508181036000830152613d80816137f3565b9050919050565b60006020820190508181036000830152613da081613816565b9050919050565b60006020820190508181036000830152613dc081613839565b9050919050565b60006020820190508181036000830152613de08161385c565b9050919050565b60006020820190508181036000830152613e008161387f565b9050919050565b60006020820190508181036000830152613e20816138a2565b9050919050565b60006020820190508181036000830152613e40816138c5565b9050919050565b60006020820190508181036000830152613e60816138e8565b9050919050565b60006020820190508181036000830152613e808161390b565b9050919050565b60006020820190508181036000830152613ea08161392e565b9050919050565b60006020820190508181036000830152613ec081613951565b9050919050565b60006020820190508181036000830152613ee081613974565b9050919050565b60006020820190508181036000830152613f0081613997565b9050919050565b60006020820190508181036000830152613f20816139dd565b9050919050565b60006020820190508181036000830152613f4081613a00565b9050919050565b60006020820190508181036000830152613f6081613a23565b9050919050565b60006020820190508181036000830152613f8081613a46565b9050919050565b60006020820190508181036000830152613fa081613a8c565b9050919050565b60006020820190508181036000830152613fc081613aaf565b9050919050565b60006020820190508181036000830152613fe081613ad2565b9050919050565b6000602082019050818103600083015261400081613af5565b9050919050565b6000602082019050818103600083015261402081613b18565b9050919050565b600060208201905061403c6000830184613b3b565b92915050565b600061404c61405d565b9050614058828261435f565b919050565b6000604051905090565b600067ffffffffffffffff82111561408257614081614523565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156140ae576140ad614523565b5b6140b78261456b565b9050602081019050919050565b600067ffffffffffffffff8211156140df576140de614523565b5b6140e88261456b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614163826142e1565b915061416e836142e1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141a3576141a2614438565b5b828201905092915050565b60006141b9826142e1565b91506141c4836142e1565b9250826141d4576141d3614467565b5b828204905092915050565b60006141ea826142e1565b91506141f5836142e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422e5761422d614438565b5b828202905092915050565b6000614244826142e1565b915061424f836142e1565b92508282101561426257614261614438565b5b828203905092915050565b6000614278826142c1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143185780820151818401526020810190506142fd565b83811115614327576000848401525b50505050565b6000600282049050600182168061434557607f821691505b6020821081141561435957614358614496565b5b50919050565b6143688261456b565b810181811067ffffffffffffffff8211171561438757614386614523565b5b80604052505050565b600061439b826142e1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143ce576143cd614438565b5b600182019050919050565b60006143e4826143eb565b9050919050565b60006143f68261457c565b9050919050565b6000819050919050565b6000614412826142e1565b915061441d836142e1565b92508261442d5761442c614467565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f546869732073616c652068617320656e64656400000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f596f752063616e27742073657420746865204d4158204259204d494e5420746f60008201527f2062652030206f72206c6573732e000000000000000000000000000000000000602082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752063616e27742073657420746865204d415820454c454d454e5453207460008201527f6f206265206f76657220363636362e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f43616e2774206d696e74206d6f7265207468616e204d41585f42595f4d494e5460008201527f204e46547320746f207468697320616464726573730000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f56616c756520706169642069732062656c6f7720707269636500000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b614c9a8161426d565b8114614ca557600080fd5b50565b614cb18161427f565b8114614cbc57600080fd5b50565b614cc88161428b565b8114614cd357600080fd5b50565b614cdf81614295565b8114614cea57600080fd5b50565b614cf6816142e1565b8114614d0157600080fd5b5056fea264697066735822122099e2bf3278b823bfebbdb60fbe8f7adb1ea9b259e7c90d7253390edfeee83e4d64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00ef9308ff70a9d65d860a58279b906c2dde1a92a5c57a84e2e8206a7bc89a0f1000000000000000000000000000000000000000000000000000000000000002568747470733a2f2f6170702e7468656769646479732e636f2f6170692f626173655552492f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68747470733a2f2f6170702e7468656769646479732e636f2f6170692f706c616365686f6c6465725552492f0000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063b88d4fde116100b6578063d547cfb71161007a578063d547cfb7146108b3578063dc0fa974146108de578063e985e9c514610909578063ebf0c71714610946578063eea52d3814610971578063f2fde38b1461099a5761025c565b8063b88d4fde146107cb578063b8a20ed0146107f4578063ba41b0c614610831578063c3b754dc1461084d578063c87b56dd146108765761025c565b80638da5cb5b116101085780638da5cb5b146106e15780638ecc80831461070c57806395d89b4114610737578063976cb45614610762578063a22cb4651461078b578063a475b5dd146107b45761025c565b8063715018a6146106465780638456cb591461065d578063853828b6146106745780638ad5de281461068b5780638d859f3e146106b65761025c565b80633f4ba83a116101dd57806359a7715a116101a157806359a7715a146105225780635c975abb1461054d5780636223a798146105785780636352211e146105a15780636f9fb98a146105de57806370a08231146106095761025c565b80633f4ba83a1461045157806342842e0e146104685780634f6ccce71461049157806351830227146104ce57806355f804b3146104f95761025c565b806318160ddd1161022457806318160ddd1461035a57806323b872dd1461038557806326a49e37146103ae5780632f745c59146103eb5780633574a2dd146104285761025c565b806301ffc9a71461026157806302ce58131461029e57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b506102886004803603810190610283919061348f565b6109c3565b6040516102959190613c4f565b60405180910390f35b3480156102aa57600080fd5b506102b36109d5565b6040516102c09190613c4f565b60405180910390f35b3480156102d557600080fd5b506102de6109e8565b6040516102eb9190613c85565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190613532565b610a7a565b6040516103289190613be8565b60405180910390f35b34801561033d57600080fd5b50610358600480360381019061035391906133c6565b610ac0565b005b34801561036657600080fd5b5061036f610bd8565b60405161037c9190614027565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a791906132b0565b610be5565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190613532565b610c45565b6040516103e29190614027565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d91906133c6565b610c63565b60405161041f9190614027565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a91906134e9565b610d08565b005b34801561045d57600080fd5b50610466610d2a565b005b34801561047457600080fd5b5061048f600480360381019061048a91906132b0565b610d3c565b005b34801561049d57600080fd5b506104b860048036038101906104b39190613532565b610d5c565b6040516104c59190614027565b60405180910390f35b3480156104da57600080fd5b506104e3610dcd565b6040516104f09190613c4f565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b91906134e9565b610de0565b005b34801561052e57600080fd5b50610537610e02565b6040516105449190614027565b60405180910390f35b34801561055957600080fd5b50610562610e11565b60405161056f9190613c4f565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a9190613532565b610e28565b005b3480156105ad57600080fd5b506105c860048036038101906105c39190613532565b610e7d565b6040516105d59190613be8565b60405180910390f35b3480156105ea57600080fd5b506105f3610f2f565b6040516106009190614027565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190613243565b610f37565b60405161063d9190614027565b60405180910390f35b34801561065257600080fd5b5061065b610fef565b005b34801561066957600080fd5b50610672611003565b005b34801561068057600080fd5b50610689611015565b005b34801561069757600080fd5b506106a0611043565b6040516106ad9190614027565b60405180910390f35b3480156106c257600080fd5b506106cb611049565b6040516106d89190614027565b60405180910390f35b3480156106ed57600080fd5b506106f661104f565b6040516107039190613be8565b60405180910390f35b34801561071857600080fd5b50610721611079565b60405161072e9190613c85565b60405180910390f35b34801561074357600080fd5b5061074c611107565b6040516107599190613c85565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613532565b611199565b005b34801561079757600080fd5b506107b260048036038101906107ad9190613386565b6111ef565b005b3480156107c057600080fd5b506107c9611205565b005b3480156107d757600080fd5b506107f260048036038101906107ed9190613303565b61122a565b005b34801561080057600080fd5b5061081b60048036038101906108169190613406565b61128c565b6040516108289190613c4f565b60405180910390f35b61084b6004803603810190610846919061355f565b6112a3565b005b34801561085957600080fd5b50610874600480360381019061086f9190613462565b6114a0565b005b34801561088257600080fd5b5061089d60048036038101906108989190613532565b6114c5565b6040516108aa9190613c85565b60405180910390f35b3480156108bf57600080fd5b506108c861169e565b6040516108d59190613c85565b60405180910390f35b3480156108ea57600080fd5b506108f361172c565b6040516109009190614027565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190613270565b611732565b60405161093d9190613c4f565b60405180910390f35b34801561095257600080fd5b5061095b6117c6565b6040516109689190613c6a565b60405180910390f35b34801561097d57600080fd5b5061099860048036038101906109939190613532565b6117cc565b005b3480156109a657600080fd5b506109c160048036038101906109bc9190613243565b6117de565b005b60006109ce82611862565b9050919050565b601360019054906101000a900460ff1681565b6060600080546109f79061432d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a239061432d565b8015610a705780601f10610a4557610100808354040283529160200191610a70565b820191906000526020600020905b815481529060010190602001808311610a5357829003601f168201915b5050505050905090565b6000610a85826118dc565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610acb82610e7d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613f67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5b611927565b73ffffffffffffffffffffffffffffffffffffffff161480610b8a5750610b8981610b84611927565b611732565b5b610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090613ea7565b60405180910390fd5b610bd3838361192f565b505050565b6000600a80549050905090565b610bf6610bf0611927565b826119e8565b610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c90614007565b60405180910390fd5b610c40838383611a7d565b505050565b6000610c5c82600f54611ce490919063ffffffff16565b9050919050565b6000610c6e83610f37565b8210610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690613ce7565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d10611cfa565b8060129080519060200190610d26929190612fa4565b5050565b610d32611cfa565b610d3a611d78565b565b610d578383836040518060200160405280600081525061122a565b505050565b6000610d66610bd8565b8210610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90613fc7565b60405180910390fd5b600a8281548110610dbb57610dba6144f4565b5b90600052602060002001549050919050565b601360009054906101000a900460ff1681565b610de8611cfa565b8060119080519060200190610dfe929190612fa4565b5050565b6000610e0c611ddb565b905090565b6000600760009054906101000a900460ff16905090565b610e30611cfa565b60008111610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90613e27565b60405180910390fd5b8060108190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613f47565b60405180910390fd5b80915050919050565b600047905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f90613e47565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ff7611cfa565b6110016000611dec565b565b61100b611cfa565b611013611eb2565b565b61101d611cfa565b60004790506000811161102f57600080fd5b61104061103a61104f565b82611f15565b50565b60105481565b600f5481565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601280546110869061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546110b29061432d565b80156110ff5780601f106110d4576101008083540402835291602001916110ff565b820191906000526020600020905b8154815290600101906020018083116110e257829003601f168201915b505050505081565b6060600180546111169061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546111429061432d565b801561118f5780601f106111645761010080835404028352916020019161118f565b820191906000526020600020905b81548152906001019060200180831161117257829003601f168201915b5050505050905090565b6111a1611cfa565b611a0b81106111e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dc90613f27565b60405180910390fd5b80600e8190555050565b6112016111fa611927565b8383611fc6565b5050565b61120d611cfa565b6001601360006101000a81548160ff021916908315150217905550565b61123b611235611927565b836119e8565b61127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190614007565b60405180910390fd5b61128684848484612133565b50505050565b600061129b836014548461218f565b905092915050565b60011515601360019054906101000a900460ff161515141561132f576112ef81336040516020016112d49190613b61565b6040516020818303038152906040528051906020012061128c565b61132e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132590613e87565b60405180910390fd5b5b6000611339611ddb565b9050600e54838261134a9190614158565b111561138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290613dc7565b60405180910390fd5b6010548361139833610f37565b6113a29190614158565b11156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90613fa7565b60405180910390fd5b600e54811115611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90613de7565b60405180910390fd5b61143183610c45565b341015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613fe7565b60405180910390fd5b60005b8381101561149a57611487336121a6565b808061149290614390565b915050611476565b50505050565b6114a8611cfa565b80601360016101000a81548160ff02191690831515021790555050565b60606114d08261222f565b61150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690613ee7565b60405180910390fd5b606060001515601360009054906101000a900460ff16151514156115bf576012805461153a9061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546115669061432d565b80156115b35780601f10611588576101008083540402835291602001916115b3565b820191906000526020600020905b81548152906001019060200180831161159657829003601f168201915b5050505050905061164d565b601180546115cc9061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546115f89061432d565b80156116455780601f1061161a57610100808354040283529160200191611645565b820191906000526020600020905b81548152906001019060200180831161162857829003601f168201915b505050505090505b600081511161166b5760405180602001604052806000815250611696565b806116758461229b565b604051602001611686929190613b7c565b6040516020818303038152906040525b915050919050565b601180546116ab9061432d565b80601f01602080910402602001604051908101604052809291908181526020018280546116d79061432d565b80156117245780601f106116f957610100808354040283529160200191611724565b820191906000526020600020905b81548152906001019060200180831161170757829003601f168201915b505050505081565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60145481565b6117d4611cfa565b80600f8190555050565b6117e6611cfa565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d90613d27565b60405180910390fd5b61185f81611dec565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118d557506118d4826123fc565b5b9050919050565b6118e58161222f565b611924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191b90613f47565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119a283610e7d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806119f483610e7d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a365750611a358185611732565b5b80611a7457508373ffffffffffffffffffffffffffffffffffffffff16611a5c84610a7a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a9d82610e7d565b73ffffffffffffffffffffffffffffffffffffffff1614611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90613d47565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5a90613d87565b60405180910390fd5b611b6e8383836124de565b611b7960008261192f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bc99190614239565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c209190614158565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cdf8383836124ee565b505050565b60008183611cf291906141df565b905092915050565b611d02611927565b73ffffffffffffffffffffffffffffffffffffffff16611d2061104f565b73ffffffffffffffffffffffffffffffffffffffff1614611d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6d90613f07565b60405180910390fd5b565b611d806124f3565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611dc4611927565b604051611dd19190613be8565b60405180910390a1565b6000611de7600d61253c565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611eba61254a565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611efe611927565b604051611f0b9190613be8565b60405180910390a1565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611f3b90613bd3565b60006040518083038185875af1925050503d8060008114611f78576040519150601f19603f3d011682016040523d82523d6000602084013e611f7d565b606091505b5050905080611fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb890613f87565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202c90613da7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121269190613c4f565b60405180910390a3505050565b61213e848484611a7d565b61214a84848484612594565b612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090613d07565b60405180910390fd5b50505050565b60008261219c858461272b565b1490509392505050565b600060016121b2611ddb565b6121bc9190614158565b90506121c8600d612781565b6121d28282612797565b6121fe816011836040516020016121ea929190613ba0565b6040516020818303038152906040526127b5565b807f907dc5b613ee3f400eb23a2d3403716ba0a7c3661e1e4ec1b18b4c1474bb60fe60405160405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008214156122e3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123f7565b600082905060005b600082146123155780806122fe90614390565b915050600a8261230e91906141ae565b91506122eb565b60008167ffffffffffffffff81111561233157612330614523565b5b6040519080825280601f01601f1916602001820160405280156123635781602001600182028036833780820191505090505b5090505b600085146123f05760018261237c9190614239565b9150600a8561238b9190614407565b60306123979190614158565b60f81b8183815181106123ad576123ac6144f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123e991906141ae565b9450612367565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124c757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124d757506124d682612829565b5b9050919050565b6124e9838383612893565b505050565b505050565b6124fb610e11565b61253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190613cc7565b60405180910390fd5b565b600081600001549050919050565b612552610e11565b15612592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258990613e07565b60405180910390fd5b565b60006125b58473ffffffffffffffffffffffffffffffffffffffff166129a7565b1561271e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125de611927565b8786866040518563ffffffff1660e01b81526004016126009493929190613c03565b602060405180830381600087803b15801561261a57600080fd5b505af192505050801561264b57506040513d601f19601f8201168201806040525081019061264891906134bc565b60015b6126ce573d806000811461267b576040519150601f19603f3d011682016040523d82523d6000602084013e612680565b606091505b506000815114156126c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bd90613d07565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612723565b600190505b949350505050565b60008082905060005b84518110156127765761276182868381518110612754576127536144f4565b5b60200260200101516129ca565b9150808061276e90614390565b915050612734565b508091505092915050565b6001816000016000828254019250508190555050565b6127b18282604051806020016040528060008152506129f5565b5050565b6127be8261222f565b6127fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f490613e67565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612824929190612fa4565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61289e838383612a50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128e1576128dc81612aa8565b612920565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461291f5761291e8382612af1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129635761295e81612c5e565b6129a2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129a1576129a08282612d2f565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008183106129e2576129dd8284612dae565b6129ed565b6129ec8383612dae565b5b905092915050565b6129ff8383612dc5565b612a0c6000848484612594565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4290613d07565b60405180910390fd5b505050565b612a5b838383612f9f565b612a63610e11565b15612aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9a90613ca7565b60405180910390fd5b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612afe84610f37565b612b089190614239565b9050600060096000848152602001908152602001600020549050818114612bed576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612c729190614239565b90506000600b60008481526020019081526020016000205490506000600a8381548110612ca257612ca16144f4565b5b9060005260206000200154905080600a8381548110612cc457612cc36144f4565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612d1357612d126144c5565b5b6001900381819060005260206000200160009055905550505050565b6000612d3a83610f37565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2c90613ec7565b60405180910390fd5b612e3e8161222f565b15612e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7590613d67565b60405180910390fd5b612e8a600083836124de565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eda9190614158565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f9b600083836124ee565b5050565b505050565b828054612fb09061432d565b90600052602060002090601f016020900481019282612fd25760008555613019565b82601f10612feb57805160ff1916838001178555613019565b82800160010185558215613019579182015b82811115613018578251825591602001919060010190612ffd565b5b509050613026919061302a565b5090565b5b8082111561304357600081600090555060010161302b565b5090565b600061305a61305584614067565b614042565b9050808382526020820190508285602086028201111561307d5761307c614557565b5b60005b858110156130ad57816130938882613193565b845260208401935060208301925050600181019050613080565b5050509392505050565b60006130ca6130c584614093565b614042565b9050828152602081018484840111156130e6576130e561455c565b5b6130f18482856142eb565b509392505050565b600061310c613107846140c4565b614042565b9050828152602081018484840111156131285761312761455c565b5b6131338482856142eb565b509392505050565b60008135905061314a81614c91565b92915050565b600082601f83011261316557613164614552565b5b8135613175848260208601613047565b91505092915050565b60008135905061318d81614ca8565b92915050565b6000813590506131a281614cbf565b92915050565b6000813590506131b781614cd6565b92915050565b6000815190506131cc81614cd6565b92915050565b600082601f8301126131e7576131e6614552565b5b81356131f78482602086016130b7565b91505092915050565b600082601f83011261321557613214614552565b5b81356132258482602086016130f9565b91505092915050565b60008135905061323d81614ced565b92915050565b60006020828403121561325957613258614566565b5b60006132678482850161313b565b91505092915050565b6000806040838503121561328757613286614566565b5b60006132958582860161313b565b92505060206132a68582860161313b565b9150509250929050565b6000806000606084860312156132c9576132c8614566565b5b60006132d78682870161313b565b93505060206132e88682870161313b565b92505060406132f98682870161322e565b9150509250925092565b6000806000806080858703121561331d5761331c614566565b5b600061332b8782880161313b565b945050602061333c8782880161313b565b935050604061334d8782880161322e565b925050606085013567ffffffffffffffff81111561336e5761336d614561565b5b61337a878288016131d2565b91505092959194509250565b6000806040838503121561339d5761339c614566565b5b60006133ab8582860161313b565b92505060206133bc8582860161317e565b9150509250929050565b600080604083850312156133dd576133dc614566565b5b60006133eb8582860161313b565b92505060206133fc8582860161322e565b9150509250929050565b6000806040838503121561341d5761341c614566565b5b600083013567ffffffffffffffff81111561343b5761343a614561565b5b61344785828601613150565b925050602061345885828601613193565b9150509250929050565b60006020828403121561347857613477614566565b5b60006134868482850161317e565b91505092915050565b6000602082840312156134a5576134a4614566565b5b60006134b3848285016131a8565b91505092915050565b6000602082840312156134d2576134d1614566565b5b60006134e0848285016131bd565b91505092915050565b6000602082840312156134ff576134fe614566565b5b600082013567ffffffffffffffff81111561351d5761351c614561565b5b61352984828501613200565b91505092915050565b60006020828403121561354857613547614566565b5b60006135568482850161322e565b91505092915050565b6000806040838503121561357657613575614566565b5b60006135848582860161322e565b925050602083013567ffffffffffffffff8111156135a5576135a4614561565b5b6135b185828601613150565b9150509250929050565b6135c48161426d565b82525050565b6135db6135d68261426d565b6143d9565b82525050565b6135ea8161427f565b82525050565b6135f98161428b565b82525050565b600061360a8261410a565b6136148185614120565b93506136248185602086016142fa565b61362d8161456b565b840191505092915050565b600061364382614115565b61364d818561413c565b935061365d8185602086016142fa565b6136668161456b565b840191505092915050565b600061367c82614115565b613686818561414d565b93506136968185602086016142fa565b80840191505092915050565b600081546136af8161432d565b6136b9818661414d565b945060018216600081146136d457600181146136e557613718565b60ff19831686528186019350613718565b6136ee856140f5565b60005b83811015613710578154818901526001820191506020810190506136f1565b838801955050505b50505092915050565b600061372e602b8361413c565b915061373982614589565b604082019050919050565b600061375160148361413c565b915061375c826145d8565b602082019050919050565b6000613774602b8361413c565b915061377f82614601565b604082019050919050565b600061379760328361413c565b91506137a282614650565b604082019050919050565b60006137ba60268361413c565b91506137c58261469f565b604082019050919050565b60006137dd60258361413c565b91506137e8826146ee565b604082019050919050565b6000613800601c8361413c565b915061380b8261473d565b602082019050919050565b600061382360248361413c565b915061382e82614766565b604082019050919050565b600061384660198361413c565b9150613851826147b5565b602082019050919050565b600061386960098361413c565b9150613874826147de565b602082019050919050565b600061388c60138361413c565b915061389782614807565b602082019050919050565b60006138af60108361413c565b91506138ba82614830565b602082019050919050565b60006138d2602e8361413c565b91506138dd82614859565b604082019050919050565b60006138f560298361413c565b9150613900826148a8565b604082019050919050565b6000613918602e8361413c565b9150613923826148f7565b604082019050919050565b600061393b60178361413c565b915061394682614946565b602082019050919050565b600061395e603e8361413c565b91506139698261496f565b604082019050919050565b600061398160208361413c565b915061398c826149be565b602082019050919050565b60006139a460318361413c565b91506139af826149e7565b604082019050919050565b60006139c760058361414d565b91506139d282614a36565b600582019050919050565b60006139ea60208361413c565b91506139f582614a5f565b602082019050919050565b6000613a0d602f8361413c565b9150613a1882614a88565b604082019050919050565b6000613a3060188361413c565b9150613a3b82614ad7565b602082019050919050565b6000613a5360218361413c565b9150613a5e82614b00565b604082019050919050565b6000613a76600083614131565b9150613a8182614b4f565b600082019050919050565b6000613a9960108361413c565b9150613aa482614b52565b602082019050919050565b6000613abc60358361413c565b9150613ac782614b7b565b604082019050919050565b6000613adf602c8361413c565b9150613aea82614bca565b604082019050919050565b6000613b0260198361413c565b9150613b0d82614c19565b602082019050919050565b6000613b25602e8361413c565b9150613b3082614c42565b604082019050919050565b613b44816142e1565b82525050565b613b5b613b56826142e1565b6143fd565b82525050565b6000613b6d82846135ca565b60148201915081905092915050565b6000613b888285613671565b9150613b948284613671565b91508190509392505050565b6000613bac82856136a2565b9150613bb88284613b4a565b602082019150613bc7826139ba565b91508190509392505050565b6000613bde82613a69565b9150819050919050565b6000602082019050613bfd60008301846135bb565b92915050565b6000608082019050613c1860008301876135bb565b613c2560208301866135bb565b613c326040830185613b3b565b8181036060830152613c4481846135ff565b905095945050505050565b6000602082019050613c6460008301846135e1565b92915050565b6000602082019050613c7f60008301846135f0565b92915050565b60006020820190508181036000830152613c9f8184613638565b905092915050565b60006020820190508181036000830152613cc081613721565b9050919050565b60006020820190508181036000830152613ce081613744565b9050919050565b60006020820190508181036000830152613d0081613767565b9050919050565b60006020820190508181036000830152613d208161378a565b9050919050565b60006020820190508181036000830152613d40816137ad565b9050919050565b60006020820190508181036000830152613d60816137d0565b9050919050565b60006020820190508181036000830152613d80816137f3565b9050919050565b60006020820190508181036000830152613da081613816565b9050919050565b60006020820190508181036000830152613dc081613839565b9050919050565b60006020820190508181036000830152613de08161385c565b9050919050565b60006020820190508181036000830152613e008161387f565b9050919050565b60006020820190508181036000830152613e20816138a2565b9050919050565b60006020820190508181036000830152613e40816138c5565b9050919050565b60006020820190508181036000830152613e60816138e8565b9050919050565b60006020820190508181036000830152613e808161390b565b9050919050565b60006020820190508181036000830152613ea08161392e565b9050919050565b60006020820190508181036000830152613ec081613951565b9050919050565b60006020820190508181036000830152613ee081613974565b9050919050565b60006020820190508181036000830152613f0081613997565b9050919050565b60006020820190508181036000830152613f20816139dd565b9050919050565b60006020820190508181036000830152613f4081613a00565b9050919050565b60006020820190508181036000830152613f6081613a23565b9050919050565b60006020820190508181036000830152613f8081613a46565b9050919050565b60006020820190508181036000830152613fa081613a8c565b9050919050565b60006020820190508181036000830152613fc081613aaf565b9050919050565b60006020820190508181036000830152613fe081613ad2565b9050919050565b6000602082019050818103600083015261400081613af5565b9050919050565b6000602082019050818103600083015261402081613b18565b9050919050565b600060208201905061403c6000830184613b3b565b92915050565b600061404c61405d565b9050614058828261435f565b919050565b6000604051905090565b600067ffffffffffffffff82111561408257614081614523565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156140ae576140ad614523565b5b6140b78261456b565b9050602081019050919050565b600067ffffffffffffffff8211156140df576140de614523565b5b6140e88261456b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614163826142e1565b915061416e836142e1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141a3576141a2614438565b5b828201905092915050565b60006141b9826142e1565b91506141c4836142e1565b9250826141d4576141d3614467565b5b828204905092915050565b60006141ea826142e1565b91506141f5836142e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422e5761422d614438565b5b828202905092915050565b6000614244826142e1565b915061424f836142e1565b92508282101561426257614261614438565b5b828203905092915050565b6000614278826142c1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143185780820151818401526020810190506142fd565b83811115614327576000848401525b50505050565b6000600282049050600182168061434557607f821691505b6020821081141561435957614358614496565b5b50919050565b6143688261456b565b810181811067ffffffffffffffff8211171561438757614386614523565b5b80604052505050565b600061439b826142e1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143ce576143cd614438565b5b600182019050919050565b60006143e4826143eb565b9050919050565b60006143f68261457c565b9050919050565b6000819050919050565b6000614412826142e1565b915061441d836142e1565b92508261442d5761442c614467565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f546869732073616c652068617320656e64656400000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f596f752063616e27742073657420746865204d4158204259204d494e5420746f60008201527f2062652030206f72206c6573732e000000000000000000000000000000000000602082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f752063616e27742073657420746865204d415820454c454d454e5453207460008201527f6f206265206f76657220363636362e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f43616e2774206d696e74206d6f7265207468616e204d41585f42595f4d494e5460008201527f204e46547320746f207468697320616464726573730000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f56616c756520706169642069732062656c6f7720707269636500000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b614c9a8161426d565b8114614ca557600080fd5b50565b614cb18161427f565b8114614cbc57600080fd5b50565b614cc88161428b565b8114614cd357600080fd5b50565b614cdf81614295565b8114614cea57600080fd5b50565b614cf6816142e1565b8114614d0157600080fd5b5056fea264697066735822122099e2bf3278b823bfebbdb60fbe8f7adb1ea9b259e7c90d7253390edfeee83e4d64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00ef9308ff70a9d65d860a58279b906c2dde1a92a5c57a84e2e8206a7bc89a0f1000000000000000000000000000000000000000000000000000000000000002568747470733a2f2f6170702e7468656769646479732e636f2f6170692f626173655552492f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68747470733a2f2f6170702e7468656769646479732e636f2f6170692f706c616365686f6c6465725552492f0000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _nftBaseURI (string): https://app.thegiddys.co/api/baseURI/
Arg [1] : _nftPlaceholderURI (string): https://app.thegiddys.co/api/placeholderURI/
Arg [2] : _root (bytes32): 0x0ef9308ff70a9d65d860a58279b906c2dde1a92a5c57a84e2e8206a7bc89a0f1

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0ef9308ff70a9d65d860a58279b906c2dde1a92a5c57a84e2e8206a7bc89a0f1
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000025
Arg [4] : 68747470733a2f2f6170702e7468656769646479732e636f2f6170692f626173
Arg [5] : 655552492f000000000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [7] : 68747470733a2f2f6170702e7468656769646479732e636f2f6170692f706c61
Arg [8] : 6365686f6c6465725552492f0000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

69088:5211:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72900:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69553:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46663:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48176:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47693:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61529:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48876:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71799:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61197:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72117:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72322:72;;;;;;;;;;;;;:::i;:::-;;49283:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61719:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69520:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72016:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70693:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22327:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70209:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46374:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72400:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46105:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25192:103;;;;;;;;;;;;;:::i;:::-;;72248:68;;;;;;;;;;;;;:::i;:::-;;72563:153;;;;;;;;;;;;;:::i;:::-;;69412:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69374:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69480:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46832:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70000:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48419:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73107:63;;;;;;;;;;;;;:::i;:::-;;49539:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74139:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70784:756;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70395:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73581:552;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69449:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69337:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48645:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69594:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70500:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25450:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72900;73036:4;73059:36;73083:11;73059:23;:36::i;:::-;73052:43;;72900:201;;;:::o;69553:34::-;;;;;;;;;;;;;:::o;46663:100::-;46717:13;46750:5;46743:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46663:100;:::o;48176:171::-;48252:7;48272:23;48287:7;48272:14;:23::i;:::-;48315:15;:24;48331:7;48315:24;;;;;;;;;;;;;;;;;;;;;48308:31;;48176:171;;;:::o;47693:417::-;47774:13;47790:23;47805:7;47790:14;:23::i;:::-;47774:39;;47838:5;47832:11;;:2;:11;;;;47824:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47932:5;47916:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47941:37;47958:5;47965:12;:10;:12::i;:::-;47941:16;:37::i;:::-;47916:62;47894:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;48081:21;48090:2;48094:7;48081:8;:21::i;:::-;47763:347;47693:417;;:::o;61529:113::-;61590:7;61617:10;:17;;;;61610:24;;61529:113;:::o;48876:336::-;49071:41;49090:12;:10;:12::i;:::-;49104:7;49071:18;:41::i;:::-;49063:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;49176:28;49186:4;49192:2;49196:7;49176:9;:28::i;:::-;48876:336;;;:::o;71799:98::-;71851:7;71874:17;71884:6;71874:5;;:9;;:17;;;;:::i;:::-;71867:24;;71799:98;;;:::o;61197:256::-;61294:7;61330:23;61347:5;61330:16;:23::i;:::-;61322:5;:31;61314:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;61419:12;:19;61432:5;61419:19;;;;;;;;;;;;;;;:26;61439:5;61419:26;;;;;;;;;;;;61412:33;;61197:256;;;;:::o;72117:125::-;24430:13;:11;:13::i;:::-;72221:15:::1;72199:19;:37;;;;;;;;;;;;:::i;:::-;;72117:125:::0;:::o;72322:72::-;24430:13;:11;:13::i;:::-;72365:10:::1;:8;:10::i;:::-;72322:72::o:0;49283:185::-;49421:39;49438:4;49444:2;49448:7;49421:39;;;;;;;;;;;;:16;:39::i;:::-;49283:185;;;:::o;61719:233::-;61794:7;61830:30;:28;:30::i;:::-;61822:5;:38;61814:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;61927:10;61938:5;61927:17;;;;;;;;:::i;:::-;;;;;;;;;;61920:24;;61719:233;;;:::o;69520:28::-;;;;;;;;;;;;;:::o;72016:95::-;24430:13;:11;:13::i;:::-;72098:7:::1;72083:12;:22;;;;;;;;;;;;:::i;:::-;;72016:95:::0;:::o;70693:85::-;70735:7;70758:14;:12;:14::i;:::-;70751:21;;70693:85;:::o;22327:86::-;22374:4;22398:7;;;;;;;;;;;22391:14;;22327:86;:::o;70209:180::-;24430:13;:11;:13::i;:::-;70300:1:::1;70287:10;:14;70279:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;70373:10;70359:11;:24;;;;70209:180:::0;:::o;46374:222::-;46446:7;46466:13;46482:7;:16;46490:7;46482:16;;;;;;;;;;;;;;;;;;;;;46466:32;;46534:1;46517:19;;:5;:19;;;;46509:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;46583:5;46576:12;;;46374:222;;;:::o;72400:101::-;72451:7;72474:21;72467:28;;72400:101;:::o;46105:207::-;46177:7;46222:1;46205:19;;:5;:19;;;;46197:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46288:9;:16;46298:5;46288:16;;;;;;;;;;;;;;;;46281:23;;46105:207;;;:::o;25192:103::-;24430:13;:11;:13::i;:::-;25257:30:::1;25284:1;25257:18;:30::i;:::-;25192:103::o:0;72248:68::-;24430:13;:11;:13::i;:::-;72289:8:::1;:6;:8::i;:::-;72248:68::o:0;72563:153::-;24430:13;:11;:13::i;:::-;72610:15:::1;72628:21;72610:39;;72674:1;72664:7;:11;72656:20;;;::::0;::::1;;72683:27;72693:7;:5;:7::i;:::-;72702;72683:9;:27::i;:::-;72603:113;72563:153::o:0;69412:30::-;;;;:::o;69374:33::-;;;;:::o;24544:87::-;24590:7;24617:6;;;;;;;;;;;24610:13;;24544:87;:::o;69480:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46832:104::-;46888:13;46921:7;46914:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46832:104;:::o;70000:203::-;24430:13;:11;:13::i;:::-;70098:4:::1;70085:10;:17;70069:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;70187:10;70174;:23;;;;70000:203:::0;:::o;48419:155::-;48514:52;48533:12;:10;:12::i;:::-;48547:8;48557;48514:18;:52::i;:::-;48419:155;;:::o;73107:63::-;24430:13;:11;:13::i;:::-;73160:4:::1;73149:8;;:15;;;;;;;;;;;;;;;;;;73107:63::o:0;49539:323::-;49713:41;49732:12;:10;:12::i;:::-;49746:7;49713:18;:41::i;:::-;49705:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;49816:38;49830:4;49836:2;49840:7;49849:4;49816:13;:38::i;:::-;49539:323;;;;:::o;74139:157::-;74230:4;74253:37;74272:5;74279:4;;74285;74253:18;:37::i;:::-;74246:44;;74139:157;;;;:::o;70784:756::-;70906:4;70887:23;;:15;;;;;;;;;;;:23;;;70883:164;;;70939:55;70947:5;70981:10;70964:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;70954:39;;;;;;70939:7;:55::i;:::-;70921:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;70883:164;71055:13;71071:14;:12;:14::i;:::-;71055:30;;71128:10;;71108:16;71100:5;:24;;;;:::i;:::-;:38;;71092:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;71219:11;;71199:16;71175:21;71185:10;71175:9;:21::i;:::-;:40;;;;:::i;:::-;:55;;71159:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;71325:10;;71316:5;:19;;71308:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;71387:23;71393:16;71387:5;:23::i;:::-;71374:9;:36;;71366:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;71454:9;71449:86;71473:16;71469:1;:20;71449:86;;;71505:22;71516:10;71505;:22::i;:::-;71491:3;;;;;:::i;:::-;;;;71449:86;;;;70876:664;70784:756;;:::o;70395:99::-;24430:13;:11;:13::i;:::-;70481:7:::1;70463:15;;:25;;;;;;;;;;;;;;;;;;70395:99:::0;:::o;73581:552::-;73705:13;73746:16;73754:7;73746;:16::i;:::-;73730:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;73836:26;73885:5;73873:17;;:8;;;;;;;;;;;:17;;;73869:124;;;73916:19;73901:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73869:124;;;73973:12;73958:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73869:124;74042:1;74019:12;74013:26;:30;:114;;;;;;;;;;;;;;;;;74079:12;74093:18;:7;:16;:18::i;:::-;74062:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74013:114;73999:128;;;73581:552;;;:::o;69449:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69337:32::-;;;;:::o;48645:164::-;48742:4;48766:18;:25;48785:5;48766:25;;;;;;;;;;;;;;;:35;48792:8;48766:35;;;;;;;;;;;;;;;;;;;;;;;;;48759:42;;48645:164;;;;:::o;69594:19::-;;;;:::o;70500:80::-;24430:13;:11;:13::i;:::-;70568:6:::1;70560:5;:14;;;;70500:80:::0;:::o;25450:201::-;24430:13;:11;:13::i;:::-;25559:1:::1;25539:22;;:8;:22;;;;25531:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25615:28;25634:8;25615:18;:28::i;:::-;25450:201:::0;:::o;60889:224::-;60991:4;61030:35;61015:50;;;:11;:50;;;;:90;;;;61069:36;61093:11;61069:23;:36::i;:::-;61015:90;61008:97;;60889:224;;;:::o;56151:135::-;56233:16;56241:7;56233;:16::i;:::-;56225:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56151:135;:::o;20440:98::-;20493:7;20520:10;20513:17;;20440:98;:::o;55430:174::-;55532:2;55505:15;:24;55521:7;55505:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55588:7;55584:2;55550:46;;55559:23;55574:7;55559:14;:23::i;:::-;55550:46;;;;;;;;;;;;55430:174;;:::o;51663:264::-;51756:4;51773:13;51789:23;51804:7;51789:14;:23::i;:::-;51773:39;;51842:5;51831:16;;:7;:16;;;:52;;;;51851:32;51868:5;51875:7;51851:16;:32::i;:::-;51831:52;:87;;;;51911:7;51887:31;;:20;51899:7;51887:11;:20::i;:::-;:31;;;51831:87;51823:96;;;51663:264;;;;:::o;54686:625::-;54845:4;54818:31;;:23;54833:7;54818:14;:23::i;:::-;:31;;;54810:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54924:1;54910:16;;:2;:16;;;;54902:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54980:39;55001:4;55007:2;55011:7;54980:20;:39::i;:::-;55084:29;55101:1;55105:7;55084:8;:29::i;:::-;55145:1;55126:9;:15;55136:4;55126:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;55174:1;55157:9;:13;55167:2;55157:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;55205:2;55186:7;:16;55194:7;55186:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55244:7;55240:2;55225:27;;55234:4;55225:27;;;;;;;;;;;;55265:38;55285:4;55291:2;55295:7;55265:19;:38::i;:::-;54686:625;;;:::o;13837:98::-;13895:7;13926:1;13922;:5;;;;:::i;:::-;13915:12;;13837:98;;;;:::o;24709:132::-;24784:12;:10;:12::i;:::-;24773:23;;:7;:5;:7::i;:::-;:23;;;24765:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24709:132::o;23182:120::-;22191:16;:14;:16::i;:::-;23251:5:::1;23241:7;;:15;;;;;;;;;;;;;;;;;;23272:22;23281:12;:10;:12::i;:::-;23272:22;;;;;;:::i;:::-;;;;;;;;23182:120::o:0;70586:101::-;70633:7;70656:25;:15;:23;:25::i;:::-;70649:32;;70586:101;:::o;25811:191::-;25885:16;25904:6;;;;;;;;;;;25885:25;;25930:8;25921:6;;:17;;;;;;;;;;;;;;;;;;25985:8;25954:40;;25975:8;25954:40;;;;;;;;;;;;25874:128;25811:191;:::o;22923:118::-;21932:19;:17;:19::i;:::-;22993:4:::1;22983:7;;:14;;;;;;;;;;;;;;;;;;23013:20;23020:12;:10;:12::i;:::-;23013:20;;;;;;:::i;:::-;;;;;;;;22923:118::o:0;72722:172::-;72792:12;72810:8;:13;;72832:7;72810:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72791:54;;;72860:7;72852:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72784:110;72722:172;;:::o;55747:315::-;55902:8;55893:17;;:5;:17;;;;55885:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55989:8;55951:18;:25;55970:5;55951:25;;;;;;;;;;;;;;;:35;55977:8;55951:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;56035:8;56013:41;;56028:5;56013:41;;;56045:8;56013:41;;;;;;:::i;:::-;;;;;;;;55747:315;;;:::o;50743:313::-;50899:28;50909:4;50915:2;50919:7;50899:9;:28::i;:::-;50946:47;50969:4;50975:2;50979:7;50988:4;50946:22;:47::i;:::-;50938:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50743:313;;;;:::o;1252:190::-;1377:4;1430;1401:25;1414:5;1421:4;1401:12;:25::i;:::-;:33;1394:40;;1252:190;;;;;:::o;71546:247::-;71594:10;71624:1;71607:14;:12;:14::i;:::-;:18;;;;:::i;:::-;71594:31;;71632:27;:15;:25;:27::i;:::-;71666:18;71676:3;71681:2;71666:9;:18::i;:::-;71691:69;71704:2;71732:12;71746:2;71715:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71691:12;:69::i;:::-;71784:2;71772:15;;;;;;;;;;71587:206;71546:247;:::o;51369:127::-;51434:4;51486:1;51458:30;;:7;:16;51466:7;51458:16;;;;;;;;;;;;;;;;;;;;;:30;;;;51451:37;;51369:127;;;:::o;17694:723::-;17750:13;17980:1;17971:5;:10;17967:53;;;17998:10;;;;;;;;;;;;;;;;;;;;;17967:53;18030:12;18045:5;18030:20;;18061:14;18086:78;18101:1;18093:4;:9;18086:78;;18119:8;;;;;:::i;:::-;;;;18150:2;18142:10;;;;;:::i;:::-;;;18086:78;;;18174:19;18206:6;18196:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18174:39;;18224:154;18240:1;18231:5;:10;18224:154;;18268:1;18258:11;;;;;:::i;:::-;;;18335:2;18327:5;:10;;;;:::i;:::-;18314:2;:24;;;;:::i;:::-;18301:39;;18284:6;18291;18284:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18364:2;18355:11;;;;;:::i;:::-;;;18224:154;;;18402:6;18388:21;;;;;17694:723;;;;:::o;45736:305::-;45838:4;45890:25;45875:40;;;:11;:40;;;;:105;;;;45947:33;45932:48;;;:11;:48;;;;45875:105;:158;;;;45997:36;46021:11;45997:23;:36::i;:::-;45875:158;45855:178;;45736:305;;;:::o;73176:219::-;73344:45;73371:4;73377:2;73381:7;73344:26;:45::i;:::-;73176:219;;;:::o;58786:125::-;;;;:::o;22671:108::-;22738:8;:6;:8::i;:::-;22730:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;22671:108::o;9630:114::-;9695:7;9722;:14;;;9715:21;;9630:114;;;:::o;22486:108::-;22557:8;:6;:8::i;:::-;22556:9;22548:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;22486:108::o;56850:853::-;57004:4;57025:15;:2;:13;;;:15::i;:::-;57021:675;;;57077:2;57061:36;;;57098:12;:10;:12::i;:::-;57112:4;57118:7;57127:4;57061:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57057:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57319:1;57302:6;:13;:18;57298:328;;;57345:60;;;;;;;;;;:::i;:::-;;;;;;;;57298:328;57576:6;57570:13;57561:6;57557:2;57553:15;57546:38;57057:584;57193:41;;;57183:51;;;:6;:51;;;;57176:58;;;;;57021:675;57680:4;57673:11;;56850:853;;;;;;;:::o;2119:296::-;2202:7;2222:20;2245:4;2222:27;;2265:9;2260:118;2284:5;:12;2280:1;:16;2260:118;;;2333:33;2343:12;2357:5;2363:1;2357:8;;;;;;;;:::i;:::-;;;;;;;;2333:9;:33::i;:::-;2318:48;;2298:3;;;;;:::i;:::-;;;;2260:118;;;;2395:12;2388:19;;;2119:296;;;;:::o;9752:127::-;9859:1;9841:7;:14;;;:19;;;;;;;;;;;9752:127;:::o;52269:110::-;52345:26;52355:2;52359:7;52345:26;;;;;;;;;;;;:9;:26::i;:::-;52269:110;;:::o;68343:217::-;68443:16;68451:7;68443;:16::i;:::-;68435:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;68543:9;68521:10;:19;68532:7;68521:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;68343:217;;:::o;37398:157::-;37483:4;37522:25;37507:40;;;:11;:40;;;;37500:47;;37398:157;;;:::o;62565:589::-;62709:45;62736:4;62742:2;62746:7;62709:26;:45::i;:::-;62787:1;62771:18;;:4;:18;;;62767:187;;;62806:40;62838:7;62806:31;:40::i;:::-;62767:187;;;62876:2;62868:10;;:4;:10;;;62864:90;;62895:47;62928:4;62934:7;62895:32;:47::i;:::-;62864:90;62767:187;62982:1;62968:16;;:2;:16;;;62964:183;;;63001:45;63038:7;63001:36;:45::i;:::-;62964:183;;;63074:4;63068:10;;:2;:10;;;63064:83;;63095:40;63123:2;63127:7;63095:27;:40::i;:::-;63064:83;62964:183;62565:589;;;:::o;27242:326::-;27302:4;27559:1;27537:7;:19;;;:23;27530:30;;27242:326;;;:::o;8326:149::-;8389:7;8420:1;8416;:5;:51;;8447:20;8462:1;8465;8447:14;:20::i;:::-;8416:51;;;8424:20;8439:1;8442;8424:14;:20::i;:::-;8416:51;8409:58;;8326:149;;;;:::o;52606:319::-;52735:18;52741:2;52745:7;52735:5;:18::i;:::-;52786:53;52817:1;52821:2;52825:7;52834:4;52786:22;:53::i;:::-;52764:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;52606:319;;;:::o;59596:275::-;59740:45;59767:4;59773:2;59777:7;59740:26;:45::i;:::-;59807:8;:6;:8::i;:::-;59806:9;59798:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59596:275;;;:::o;63877:164::-;63981:10;:17;;;;63954:15;:24;63970:7;63954:24;;;;;;;;;;;:44;;;;64009:10;64025:7;64009:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63877:164;:::o;64668:988::-;64934:22;64984:1;64959:22;64976:4;64959:16;:22::i;:::-;:26;;;;:::i;:::-;64934:51;;64996:18;65017:17;:26;65035:7;65017:26;;;;;;;;;;;;64996:47;;65164:14;65150:10;:28;65146:328;;65195:19;65217:12;:18;65230:4;65217:18;;;;;;;;;;;;;;;:34;65236:14;65217:34;;;;;;;;;;;;65195:56;;65301:11;65268:12;:18;65281:4;65268:18;;;;;;;;;;;;;;;:30;65287:10;65268:30;;;;;;;;;;;:44;;;;65418:10;65385:17;:30;65403:11;65385:30;;;;;;;;;;;:43;;;;65180:294;65146:328;65570:17;:26;65588:7;65570:26;;;;;;;;;;;65563:33;;;65614:12;:18;65627:4;65614:18;;;;;;;;;;;;;;;:34;65633:14;65614:34;;;;;;;;;;;65607:41;;;64749:907;;64668:988;;:::o;65951:1079::-;66204:22;66249:1;66229:10;:17;;;;:21;;;;:::i;:::-;66204:46;;66261:18;66282:15;:24;66298:7;66282:24;;;;;;;;;;;;66261:45;;66633:19;66655:10;66666:14;66655:26;;;;;;;;:::i;:::-;;;;;;;;;;66633:48;;66719:11;66694:10;66705;66694:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;66830:10;66799:15;:28;66815:11;66799:28;;;;;;;;;;;:41;;;;66971:15;:24;66987:7;66971:24;;;;;;;;;;;66964:31;;;67006:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66022:1008;;;65951:1079;:::o;63455:221::-;63540:14;63557:20;63574:2;63557:16;:20::i;:::-;63540:37;;63615:7;63588:12;:16;63601:2;63588:16;;;;;;;;;;;;;;;:24;63605:6;63588:24;;;;;;;;;;;:34;;;;63662:6;63633:17;:26;63651:7;63633:26;;;;;;;;;;;:35;;;;63529:147;63455:221;;:::o;8483:268::-;8551:13;8658:1;8652:4;8645:15;8687:1;8681:4;8674:15;8728:4;8722;8712:21;8703:30;;8483:268;;;;:::o;53261:439::-;53355:1;53341:16;;:2;:16;;;;53333:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53414:16;53422:7;53414;:16::i;:::-;53413:17;53405:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53476:45;53505:1;53509:2;53513:7;53476:20;:45::i;:::-;53551:1;53534:9;:13;53544:2;53534:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;53582:2;53563:7;:16;53571:7;53563:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53627:7;53623:2;53602:33;;53619:1;53602:33;;;;;;;;;;;;53648:44;53676:1;53680:2;53684:7;53648:19;:44::i;:::-;53261:439;;:::o;58275:126::-;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3069:340::-;3125:5;3174:3;3167:4;3159:6;3155:17;3151:27;3141:122;;3182:79;;:::i;:::-;3141:122;3299:6;3286:20;3324:79;3399:3;3391:6;3384:4;3376:6;3372:17;3324:79;:::i;:::-;3315:88;;3131:278;3069:340;;;;:::o;3415:139::-;3461:5;3499:6;3486:20;3477:29;;3515:33;3542:5;3515:33;:::i;:::-;3415:139;;;;:::o;3560:329::-;3619:6;3668:2;3656:9;3647:7;3643:23;3639:32;3636:119;;;3674:79;;:::i;:::-;3636:119;3794:1;3819:53;3864:7;3855:6;3844:9;3840:22;3819:53;:::i;:::-;3809:63;;3765:117;3560:329;;;;:::o;3895:474::-;3963:6;3971;4020:2;4008:9;3999:7;3995:23;3991:32;3988:119;;;4026:79;;:::i;:::-;3988:119;4146:1;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4117:117;4273:2;4299:53;4344:7;4335:6;4324:9;4320:22;4299:53;:::i;:::-;4289:63;;4244:118;3895:474;;;;;:::o;4375:619::-;4452:6;4460;4468;4517:2;4505:9;4496:7;4492:23;4488:32;4485:119;;;4523:79;;:::i;:::-;4485:119;4643:1;4668:53;4713:7;4704:6;4693:9;4689:22;4668:53;:::i;:::-;4658:63;;4614:117;4770:2;4796:53;4841:7;4832:6;4821:9;4817:22;4796:53;:::i;:::-;4786:63;;4741:118;4898:2;4924:53;4969:7;4960:6;4949:9;4945:22;4924:53;:::i;:::-;4914:63;;4869:118;4375:619;;;;;:::o;5000:943::-;5095:6;5103;5111;5119;5168:3;5156:9;5147:7;5143:23;5139:33;5136:120;;;5175:79;;:::i;:::-;5136:120;5295:1;5320:53;5365:7;5356:6;5345:9;5341:22;5320:53;:::i;:::-;5310:63;;5266:117;5422:2;5448:53;5493:7;5484:6;5473:9;5469:22;5448:53;:::i;:::-;5438:63;;5393:118;5550:2;5576:53;5621:7;5612:6;5601:9;5597:22;5576:53;:::i;:::-;5566:63;;5521:118;5706:2;5695:9;5691:18;5678:32;5737:18;5729:6;5726:30;5723:117;;;5759:79;;:::i;:::-;5723:117;5864:62;5918:7;5909:6;5898:9;5894:22;5864:62;:::i;:::-;5854:72;;5649:287;5000:943;;;;;;;:::o;5949:468::-;6014:6;6022;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:53;6267:7;6258:6;6247:9;6243:22;6222:53;:::i;:::-;6212:63;;6168:117;6324:2;6350:50;6392:7;6383:6;6372:9;6368:22;6350:50;:::i;:::-;6340:60;;6295:115;5949:468;;;;;:::o;6423:474::-;6491:6;6499;6548:2;6536:9;6527:7;6523:23;6519:32;6516:119;;;6554:79;;:::i;:::-;6516:119;6674:1;6699:53;6744:7;6735:6;6724:9;6720:22;6699:53;:::i;:::-;6689:63;;6645:117;6801:2;6827:53;6872:7;6863:6;6852:9;6848:22;6827:53;:::i;:::-;6817:63;;6772:118;6423:474;;;;;:::o;6903:684::-;6996:6;7004;7053:2;7041:9;7032:7;7028:23;7024:32;7021:119;;;7059:79;;:::i;:::-;7021:119;7207:1;7196:9;7192:17;7179:31;7237:18;7229:6;7226:30;7223:117;;;7259:79;;:::i;:::-;7223:117;7364:78;7434:7;7425:6;7414:9;7410:22;7364:78;:::i;:::-;7354:88;;7150:302;7491:2;7517:53;7562:7;7553:6;7542:9;7538:22;7517:53;:::i;:::-;7507:63;;7462:118;6903:684;;;;;:::o;7593:323::-;7649:6;7698:2;7686:9;7677:7;7673:23;7669:32;7666:119;;;7704:79;;:::i;:::-;7666:119;7824:1;7849:50;7891:7;7882:6;7871:9;7867:22;7849:50;:::i;:::-;7839:60;;7795:114;7593:323;;;;:::o;7922:327::-;7980:6;8029:2;8017:9;8008:7;8004:23;8000:32;7997:119;;;8035:79;;:::i;:::-;7997:119;8155:1;8180:52;8224:7;8215:6;8204:9;8200:22;8180:52;:::i;:::-;8170:62;;8126:116;7922:327;;;;:::o;8255:349::-;8324:6;8373:2;8361:9;8352:7;8348:23;8344:32;8341:119;;;8379:79;;:::i;:::-;8341:119;8499:1;8524:63;8579:7;8570:6;8559:9;8555:22;8524:63;:::i;:::-;8514:73;;8470:127;8255:349;;;;:::o;8610:509::-;8679:6;8728:2;8716:9;8707:7;8703:23;8699:32;8696:119;;;8734:79;;:::i;:::-;8696:119;8882:1;8871:9;8867:17;8854:31;8912:18;8904:6;8901:30;8898:117;;;8934:79;;:::i;:::-;8898:117;9039:63;9094:7;9085:6;9074:9;9070:22;9039:63;:::i;:::-;9029:73;;8825:287;8610:509;;;;:::o;9125:329::-;9184:6;9233:2;9221:9;9212:7;9208:23;9204:32;9201:119;;;9239:79;;:::i;:::-;9201:119;9359:1;9384:53;9429:7;9420:6;9409:9;9405:22;9384:53;:::i;:::-;9374:63;;9330:117;9125:329;;;;:::o;9460:684::-;9553:6;9561;9610:2;9598:9;9589:7;9585:23;9581:32;9578:119;;;9616:79;;:::i;:::-;9578:119;9736:1;9761:53;9806:7;9797:6;9786:9;9782:22;9761:53;:::i;:::-;9751:63;;9707:117;9891:2;9880:9;9876:18;9863:32;9922:18;9914:6;9911:30;9908:117;;;9944:79;;:::i;:::-;9908:117;10049:78;10119:7;10110:6;10099:9;10095:22;10049:78;:::i;:::-;10039:88;;9834:303;9460:684;;;;;:::o;10150:118::-;10237:24;10255:5;10237:24;:::i;:::-;10232:3;10225:37;10150:118;;:::o;10274:157::-;10379:45;10399:24;10417:5;10399:24;:::i;:::-;10379:45;:::i;:::-;10374:3;10367:58;10274:157;;:::o;10437:109::-;10518:21;10533:5;10518:21;:::i;:::-;10513:3;10506:34;10437:109;;:::o;10552:118::-;10639:24;10657:5;10639:24;:::i;:::-;10634:3;10627:37;10552:118;;:::o;10676:360::-;10762:3;10790:38;10822:5;10790:38;:::i;:::-;10844:70;10907:6;10902:3;10844:70;:::i;:::-;10837:77;;10923:52;10968:6;10963:3;10956:4;10949:5;10945:16;10923:52;:::i;:::-;11000:29;11022:6;11000:29;:::i;:::-;10995:3;10991:39;10984:46;;10766:270;10676:360;;;;:::o;11042:364::-;11130:3;11158:39;11191:5;11158:39;:::i;:::-;11213:71;11277:6;11272:3;11213:71;:::i;:::-;11206:78;;11293:52;11338:6;11333:3;11326:4;11319:5;11315:16;11293:52;:::i;:::-;11370:29;11392:6;11370:29;:::i;:::-;11365:3;11361:39;11354:46;;11134:272;11042:364;;;;:::o;11412:377::-;11518:3;11546:39;11579:5;11546:39;:::i;:::-;11601:89;11683:6;11678:3;11601:89;:::i;:::-;11594:96;;11699:52;11744:6;11739:3;11732:4;11725:5;11721:16;11699:52;:::i;:::-;11776:6;11771:3;11767:16;11760:23;;11522:267;11412:377;;;;:::o;11819:845::-;11922:3;11959:5;11953:12;11988:36;12014:9;11988:36;:::i;:::-;12040:89;12122:6;12117:3;12040:89;:::i;:::-;12033:96;;12160:1;12149:9;12145:17;12176:1;12171:137;;;;12322:1;12317:341;;;;12138:520;;12171:137;12255:4;12251:9;12240;12236:25;12231:3;12224:38;12291:6;12286:3;12282:16;12275:23;;12171:137;;12317:341;12384:38;12416:5;12384:38;:::i;:::-;12444:1;12458:154;12472:6;12469:1;12466:13;12458:154;;;12546:7;12540:14;12536:1;12531:3;12527:11;12520:35;12596:1;12587:7;12583:15;12572:26;;12494:4;12491:1;12487:12;12482:17;;12458:154;;;12641:6;12636:3;12632:16;12625:23;;12324:334;;12138:520;;11926:738;;11819:845;;;;:::o;12670:366::-;12812:3;12833:67;12897:2;12892:3;12833:67;:::i;:::-;12826:74;;12909:93;12998:3;12909:93;:::i;:::-;13027:2;13022:3;13018:12;13011:19;;12670:366;;;:::o;13042:::-;13184:3;13205:67;13269:2;13264:3;13205:67;:::i;:::-;13198:74;;13281:93;13370:3;13281:93;:::i;:::-;13399:2;13394:3;13390:12;13383:19;;13042:366;;;:::o;13414:::-;13556:3;13577:67;13641:2;13636:3;13577:67;:::i;:::-;13570:74;;13653:93;13742:3;13653:93;:::i;:::-;13771:2;13766:3;13762:12;13755:19;;13414:366;;;:::o;13786:::-;13928:3;13949:67;14013:2;14008:3;13949:67;:::i;:::-;13942:74;;14025:93;14114:3;14025:93;:::i;:::-;14143:2;14138:3;14134:12;14127:19;;13786:366;;;:::o;14158:::-;14300:3;14321:67;14385:2;14380:3;14321:67;:::i;:::-;14314:74;;14397:93;14486:3;14397:93;:::i;:::-;14515:2;14510:3;14506:12;14499:19;;14158:366;;;:::o;14530:::-;14672:3;14693:67;14757:2;14752:3;14693:67;:::i;:::-;14686:74;;14769:93;14858:3;14769:93;:::i;:::-;14887:2;14882:3;14878:12;14871:19;;14530:366;;;:::o;14902:::-;15044:3;15065:67;15129:2;15124:3;15065:67;:::i;:::-;15058:74;;15141:93;15230:3;15141:93;:::i;:::-;15259:2;15254:3;15250:12;15243:19;;14902:366;;;:::o;15274:::-;15416:3;15437:67;15501:2;15496:3;15437:67;:::i;:::-;15430:74;;15513:93;15602:3;15513:93;:::i;:::-;15631:2;15626:3;15622:12;15615:19;;15274:366;;;:::o;15646:::-;15788:3;15809:67;15873:2;15868:3;15809:67;:::i;:::-;15802:74;;15885:93;15974:3;15885:93;:::i;:::-;16003:2;15998:3;15994:12;15987:19;;15646:366;;;:::o;16018:365::-;16160:3;16181:66;16245:1;16240:3;16181:66;:::i;:::-;16174:73;;16256:93;16345:3;16256:93;:::i;:::-;16374:2;16369:3;16365:12;16358:19;;16018:365;;;:::o;16389:366::-;16531:3;16552:67;16616:2;16611:3;16552:67;:::i;:::-;16545:74;;16628:93;16717:3;16628:93;:::i;:::-;16746:2;16741:3;16737:12;16730:19;;16389:366;;;:::o;16761:::-;16903:3;16924:67;16988:2;16983:3;16924:67;:::i;:::-;16917:74;;17000:93;17089:3;17000:93;:::i;:::-;17118:2;17113:3;17109:12;17102:19;;16761:366;;;:::o;17133:::-;17275:3;17296:67;17360:2;17355:3;17296:67;:::i;:::-;17289:74;;17372:93;17461:3;17372:93;:::i;:::-;17490:2;17485:3;17481:12;17474:19;;17133:366;;;:::o;17505:::-;17647:3;17668:67;17732:2;17727:3;17668:67;:::i;:::-;17661:74;;17744:93;17833:3;17744:93;:::i;:::-;17862:2;17857:3;17853:12;17846:19;;17505:366;;;:::o;17877:::-;18019:3;18040:67;18104:2;18099:3;18040:67;:::i;:::-;18033:74;;18116:93;18205:3;18116:93;:::i;:::-;18234:2;18229:3;18225:12;18218:19;;17877:366;;;:::o;18249:::-;18391:3;18412:67;18476:2;18471:3;18412:67;:::i;:::-;18405:74;;18488:93;18577:3;18488:93;:::i;:::-;18606:2;18601:3;18597:12;18590:19;;18249:366;;;:::o;18621:::-;18763:3;18784:67;18848:2;18843:3;18784:67;:::i;:::-;18777:74;;18860:93;18949:3;18860:93;:::i;:::-;18978:2;18973:3;18969:12;18962:19;;18621:366;;;:::o;18993:::-;19135:3;19156:67;19220:2;19215:3;19156:67;:::i;:::-;19149:74;;19232:93;19321:3;19232:93;:::i;:::-;19350:2;19345:3;19341:12;19334:19;;18993:366;;;:::o;19365:::-;19507:3;19528:67;19592:2;19587:3;19528:67;:::i;:::-;19521:74;;19604:93;19693:3;19604:93;:::i;:::-;19722:2;19717:3;19713:12;19706:19;;19365:366;;;:::o;19737:400::-;19897:3;19918:84;20000:1;19995:3;19918:84;:::i;:::-;19911:91;;20011:93;20100:3;20011:93;:::i;:::-;20129:1;20124:3;20120:11;20113:18;;19737:400;;;:::o;20143:366::-;20285:3;20306:67;20370:2;20365:3;20306:67;:::i;:::-;20299:74;;20382:93;20471:3;20382:93;:::i;:::-;20500:2;20495:3;20491:12;20484:19;;20143:366;;;:::o;20515:::-;20657:3;20678:67;20742:2;20737:3;20678:67;:::i;:::-;20671:74;;20754:93;20843:3;20754:93;:::i;:::-;20872:2;20867:3;20863:12;20856:19;;20515:366;;;:::o;20887:::-;21029:3;21050:67;21114:2;21109:3;21050:67;:::i;:::-;21043:74;;21126:93;21215:3;21126:93;:::i;:::-;21244:2;21239:3;21235:12;21228:19;;20887:366;;;:::o;21259:::-;21401:3;21422:67;21486:2;21481:3;21422:67;:::i;:::-;21415:74;;21498:93;21587:3;21498:93;:::i;:::-;21616:2;21611:3;21607:12;21600:19;;21259:366;;;:::o;21631:398::-;21790:3;21811:83;21892:1;21887:3;21811:83;:::i;:::-;21804:90;;21903:93;21992:3;21903:93;:::i;:::-;22021:1;22016:3;22012:11;22005:18;;21631:398;;;:::o;22035:366::-;22177:3;22198:67;22262:2;22257:3;22198:67;:::i;:::-;22191:74;;22274:93;22363:3;22274:93;:::i;:::-;22392:2;22387:3;22383:12;22376:19;;22035:366;;;:::o;22407:::-;22549:3;22570:67;22634:2;22629:3;22570:67;:::i;:::-;22563:74;;22646:93;22735:3;22646:93;:::i;:::-;22764:2;22759:3;22755:12;22748:19;;22407:366;;;:::o;22779:::-;22921:3;22942:67;23006:2;23001:3;22942:67;:::i;:::-;22935:74;;23018:93;23107:3;23018:93;:::i;:::-;23136:2;23131:3;23127:12;23120:19;;22779:366;;;:::o;23151:::-;23293:3;23314:67;23378:2;23373:3;23314:67;:::i;:::-;23307:74;;23390:93;23479:3;23390:93;:::i;:::-;23508:2;23503:3;23499:12;23492:19;;23151:366;;;:::o;23523:::-;23665:3;23686:67;23750:2;23745:3;23686:67;:::i;:::-;23679:74;;23762:93;23851:3;23762:93;:::i;:::-;23880:2;23875:3;23871:12;23864:19;;23523:366;;;:::o;23895:118::-;23982:24;24000:5;23982:24;:::i;:::-;23977:3;23970:37;23895:118;;:::o;24019:157::-;24124:45;24144:24;24162:5;24144:24;:::i;:::-;24124:45;:::i;:::-;24119:3;24112:58;24019:157;;:::o;24182:256::-;24294:3;24309:75;24380:3;24371:6;24309:75;:::i;:::-;24409:2;24404:3;24400:12;24393:19;;24429:3;24422:10;;24182:256;;;;:::o;24444:435::-;24624:3;24646:95;24737:3;24728:6;24646:95;:::i;:::-;24639:102;;24758:95;24849:3;24840:6;24758:95;:::i;:::-;24751:102;;24870:3;24863:10;;24444:435;;;;;:::o;24885:676::-;25143:3;25165:92;25253:3;25244:6;25165:92;:::i;:::-;25158:99;;25267:75;25338:3;25329:6;25267:75;:::i;:::-;25367:2;25362:3;25358:12;25351:19;;25387:148;25531:3;25387:148;:::i;:::-;25380:155;;25552:3;25545:10;;24885:676;;;;;:::o;25567:379::-;25751:3;25773:147;25916:3;25773:147;:::i;:::-;25766:154;;25937:3;25930:10;;25567:379;;;:::o;25952:222::-;26045:4;26083:2;26072:9;26068:18;26060:26;;26096:71;26164:1;26153:9;26149:17;26140:6;26096:71;:::i;:::-;25952:222;;;;:::o;26180:640::-;26375:4;26413:3;26402:9;26398:19;26390:27;;26427:71;26495:1;26484:9;26480:17;26471:6;26427:71;:::i;:::-;26508:72;26576:2;26565:9;26561:18;26552:6;26508:72;:::i;:::-;26590;26658:2;26647:9;26643:18;26634:6;26590:72;:::i;:::-;26709:9;26703:4;26699:20;26694:2;26683:9;26679:18;26672:48;26737:76;26808:4;26799:6;26737:76;:::i;:::-;26729:84;;26180:640;;;;;;;:::o;26826:210::-;26913:4;26951:2;26940:9;26936:18;26928:26;;26964:65;27026:1;27015:9;27011:17;27002:6;26964:65;:::i;:::-;26826:210;;;;:::o;27042:222::-;27135:4;27173:2;27162:9;27158:18;27150:26;;27186:71;27254:1;27243:9;27239:17;27230:6;27186:71;:::i;:::-;27042:222;;;;:::o;27270:313::-;27383:4;27421:2;27410:9;27406:18;27398:26;;27470:9;27464:4;27460:20;27456:1;27445:9;27441:17;27434:47;27498:78;27571:4;27562:6;27498:78;:::i;:::-;27490:86;;27270:313;;;;:::o;27589:419::-;27755:4;27793:2;27782:9;27778:18;27770:26;;27842:9;27836:4;27832:20;27828:1;27817:9;27813:17;27806:47;27870:131;27996:4;27870:131;:::i;:::-;27862:139;;27589:419;;;:::o;28014:::-;28180:4;28218:2;28207:9;28203:18;28195:26;;28267:9;28261:4;28257:20;28253:1;28242:9;28238:17;28231:47;28295:131;28421:4;28295:131;:::i;:::-;28287:139;;28014:419;;;:::o;28439:::-;28605:4;28643:2;28632:9;28628:18;28620:26;;28692:9;28686:4;28682:20;28678:1;28667:9;28663:17;28656:47;28720:131;28846:4;28720:131;:::i;:::-;28712:139;;28439:419;;;:::o;28864:::-;29030:4;29068:2;29057:9;29053:18;29045:26;;29117:9;29111:4;29107:20;29103:1;29092:9;29088:17;29081:47;29145:131;29271:4;29145:131;:::i;:::-;29137:139;;28864:419;;;:::o;29289:::-;29455:4;29493:2;29482:9;29478:18;29470:26;;29542:9;29536:4;29532:20;29528:1;29517:9;29513:17;29506:47;29570:131;29696:4;29570:131;:::i;:::-;29562:139;;29289:419;;;:::o;29714:::-;29880:4;29918:2;29907:9;29903:18;29895:26;;29967:9;29961:4;29957:20;29953:1;29942:9;29938:17;29931:47;29995:131;30121:4;29995:131;:::i;:::-;29987:139;;29714:419;;;:::o;30139:::-;30305:4;30343:2;30332:9;30328:18;30320:26;;30392:9;30386:4;30382:20;30378:1;30367:9;30363:17;30356:47;30420:131;30546:4;30420:131;:::i;:::-;30412:139;;30139:419;;;:::o;30564:::-;30730:4;30768:2;30757:9;30753:18;30745:26;;30817:9;30811:4;30807:20;30803:1;30792:9;30788:17;30781:47;30845:131;30971:4;30845:131;:::i;:::-;30837:139;;30564:419;;;:::o;30989:::-;31155:4;31193:2;31182:9;31178:18;31170:26;;31242:9;31236:4;31232:20;31228:1;31217:9;31213:17;31206:47;31270:131;31396:4;31270:131;:::i;:::-;31262:139;;30989:419;;;:::o;31414:::-;31580:4;31618:2;31607:9;31603:18;31595:26;;31667:9;31661:4;31657:20;31653:1;31642:9;31638:17;31631:47;31695:131;31821:4;31695:131;:::i;:::-;31687:139;;31414:419;;;:::o;31839:::-;32005:4;32043:2;32032:9;32028:18;32020:26;;32092:9;32086:4;32082:20;32078:1;32067:9;32063:17;32056:47;32120:131;32246:4;32120:131;:::i;:::-;32112:139;;31839:419;;;:::o;32264:::-;32430:4;32468:2;32457:9;32453:18;32445:26;;32517:9;32511:4;32507:20;32503:1;32492:9;32488:17;32481:47;32545:131;32671:4;32545:131;:::i;:::-;32537:139;;32264:419;;;:::o;32689:::-;32855:4;32893:2;32882:9;32878:18;32870:26;;32942:9;32936:4;32932:20;32928:1;32917:9;32913:17;32906:47;32970:131;33096:4;32970:131;:::i;:::-;32962:139;;32689:419;;;:::o;33114:::-;33280:4;33318:2;33307:9;33303:18;33295:26;;33367:9;33361:4;33357:20;33353:1;33342:9;33338:17;33331:47;33395:131;33521:4;33395:131;:::i;:::-;33387:139;;33114:419;;;:::o;33539:::-;33705:4;33743:2;33732:9;33728:18;33720:26;;33792:9;33786:4;33782:20;33778:1;33767:9;33763:17;33756:47;33820:131;33946:4;33820:131;:::i;:::-;33812:139;;33539:419;;;:::o;33964:::-;34130:4;34168:2;34157:9;34153:18;34145:26;;34217:9;34211:4;34207:20;34203:1;34192:9;34188:17;34181:47;34245:131;34371:4;34245:131;:::i;:::-;34237:139;;33964:419;;;:::o;34389:::-;34555:4;34593:2;34582:9;34578:18;34570:26;;34642:9;34636:4;34632:20;34628:1;34617:9;34613:17;34606:47;34670:131;34796:4;34670:131;:::i;:::-;34662:139;;34389:419;;;:::o;34814:::-;34980:4;35018:2;35007:9;35003:18;34995:26;;35067:9;35061:4;35057:20;35053:1;35042:9;35038:17;35031:47;35095:131;35221:4;35095:131;:::i;:::-;35087:139;;34814:419;;;:::o;35239:::-;35405:4;35443:2;35432:9;35428:18;35420:26;;35492:9;35486:4;35482:20;35478:1;35467:9;35463:17;35456:47;35520:131;35646:4;35520:131;:::i;:::-;35512:139;;35239:419;;;:::o;35664:::-;35830:4;35868:2;35857:9;35853:18;35845:26;;35917:9;35911:4;35907:20;35903:1;35892:9;35888:17;35881:47;35945:131;36071:4;35945:131;:::i;:::-;35937:139;;35664:419;;;:::o;36089:::-;36255:4;36293:2;36282:9;36278:18;36270:26;;36342:9;36336:4;36332:20;36328:1;36317:9;36313:17;36306:47;36370:131;36496:4;36370:131;:::i;:::-;36362:139;;36089:419;;;:::o;36514:::-;36680:4;36718:2;36707:9;36703:18;36695:26;;36767:9;36761:4;36757:20;36753:1;36742:9;36738:17;36731:47;36795:131;36921:4;36795:131;:::i;:::-;36787:139;;36514:419;;;:::o;36939:::-;37105:4;37143:2;37132:9;37128:18;37120:26;;37192:9;37186:4;37182:20;37178:1;37167:9;37163:17;37156:47;37220:131;37346:4;37220:131;:::i;:::-;37212:139;;36939:419;;;:::o;37364:::-;37530:4;37568:2;37557:9;37553:18;37545:26;;37617:9;37611:4;37607:20;37603:1;37592:9;37588:17;37581:47;37645:131;37771:4;37645:131;:::i;:::-;37637:139;;37364:419;;;:::o;37789:::-;37955:4;37993:2;37982:9;37978:18;37970:26;;38042:9;38036:4;38032:20;38028:1;38017:9;38013:17;38006:47;38070:131;38196:4;38070:131;:::i;:::-;38062:139;;37789:419;;;:::o;38214:::-;38380:4;38418:2;38407:9;38403:18;38395:26;;38467:9;38461:4;38457:20;38453:1;38442:9;38438:17;38431:47;38495:131;38621:4;38495:131;:::i;:::-;38487:139;;38214:419;;;:::o;38639:::-;38805:4;38843:2;38832:9;38828:18;38820:26;;38892:9;38886:4;38882:20;38878:1;38867:9;38863:17;38856:47;38920:131;39046:4;38920:131;:::i;:::-;38912:139;;38639:419;;;:::o;39064:::-;39230:4;39268:2;39257:9;39253:18;39245:26;;39317:9;39311:4;39307:20;39303:1;39292:9;39288:17;39281:47;39345:131;39471:4;39345:131;:::i;:::-;39337:139;;39064:419;;;:::o;39489:222::-;39582:4;39620:2;39609:9;39605:18;39597:26;;39633:71;39701:1;39690:9;39686:17;39677:6;39633:71;:::i;:::-;39489:222;;;;:::o;39717:129::-;39751:6;39778:20;;:::i;:::-;39768:30;;39807:33;39835:4;39827:6;39807:33;:::i;:::-;39717:129;;;:::o;39852:75::-;39885:6;39918:2;39912:9;39902:19;;39852:75;:::o;39933:311::-;40010:4;40100:18;40092:6;40089:30;40086:56;;;40122:18;;:::i;:::-;40086:56;40172:4;40164:6;40160:17;40152:25;;40232:4;40226;40222:15;40214:23;;39933:311;;;:::o;40250:307::-;40311:4;40401:18;40393:6;40390:30;40387:56;;;40423:18;;:::i;:::-;40387:56;40461:29;40483:6;40461:29;:::i;:::-;40453:37;;40545:4;40539;40535:15;40527:23;;40250:307;;;:::o;40563:308::-;40625:4;40715:18;40707:6;40704:30;40701:56;;;40737:18;;:::i;:::-;40701:56;40775:29;40797:6;40775:29;:::i;:::-;40767:37;;40859:4;40853;40849:15;40841:23;;40563:308;;;:::o;40877:141::-;40926:4;40949:3;40941:11;;40972:3;40969:1;40962:14;41006:4;41003:1;40993:18;40985:26;;40877:141;;;:::o;41024:98::-;41075:6;41109:5;41103:12;41093:22;;41024:98;;;:::o;41128:99::-;41180:6;41214:5;41208:12;41198:22;;41128:99;;;:::o;41233:168::-;41316:11;41350:6;41345:3;41338:19;41390:4;41385:3;41381:14;41366:29;;41233:168;;;;:::o;41407:147::-;41508:11;41545:3;41530:18;;41407:147;;;;:::o;41560:169::-;41644:11;41678:6;41673:3;41666:19;41718:4;41713:3;41709:14;41694:29;;41560:169;;;;:::o;41735:148::-;41837:11;41874:3;41859:18;;41735:148;;;;:::o;41889:305::-;41929:3;41948:20;41966:1;41948:20;:::i;:::-;41943:25;;41982:20;42000:1;41982:20;:::i;:::-;41977:25;;42136:1;42068:66;42064:74;42061:1;42058:81;42055:107;;;42142:18;;:::i;:::-;42055:107;42186:1;42183;42179:9;42172:16;;41889:305;;;;:::o;42200:185::-;42240:1;42257:20;42275:1;42257:20;:::i;:::-;42252:25;;42291:20;42309:1;42291:20;:::i;:::-;42286:25;;42330:1;42320:35;;42335:18;;:::i;:::-;42320:35;42377:1;42374;42370:9;42365:14;;42200:185;;;;:::o;42391:348::-;42431:7;42454:20;42472:1;42454:20;:::i;:::-;42449:25;;42488:20;42506:1;42488:20;:::i;:::-;42483:25;;42676:1;42608:66;42604:74;42601:1;42598:81;42593:1;42586:9;42579:17;42575:105;42572:131;;;42683:18;;:::i;:::-;42572:131;42731:1;42728;42724:9;42713:20;;42391:348;;;;:::o;42745:191::-;42785:4;42805:20;42823:1;42805:20;:::i;:::-;42800:25;;42839:20;42857:1;42839:20;:::i;:::-;42834:25;;42878:1;42875;42872:8;42869:34;;;42883:18;;:::i;:::-;42869:34;42928:1;42925;42921:9;42913:17;;42745:191;;;;:::o;42942:96::-;42979:7;43008:24;43026:5;43008:24;:::i;:::-;42997:35;;42942:96;;;:::o;43044:90::-;43078:7;43121:5;43114:13;43107:21;43096:32;;43044:90;;;:::o;43140:77::-;43177:7;43206:5;43195:16;;43140:77;;;:::o;43223:149::-;43259:7;43299:66;43292:5;43288:78;43277:89;;43223:149;;;:::o;43378:126::-;43415:7;43455:42;43448:5;43444:54;43433:65;;43378:126;;;:::o;43510:77::-;43547:7;43576:5;43565:16;;43510:77;;;:::o;43593:154::-;43677:6;43672:3;43667;43654:30;43739:1;43730:6;43725:3;43721:16;43714:27;43593:154;;;:::o;43753:307::-;43821:1;43831:113;43845:6;43842:1;43839:13;43831:113;;;43930:1;43925:3;43921:11;43915:18;43911:1;43906:3;43902:11;43895:39;43867:2;43864:1;43860:10;43855:15;;43831:113;;;43962:6;43959:1;43956:13;43953:101;;;44042:1;44033:6;44028:3;44024:16;44017:27;43953:101;43802:258;43753:307;;;:::o;44066:320::-;44110:6;44147:1;44141:4;44137:12;44127:22;;44194:1;44188:4;44184:12;44215:18;44205:81;;44271:4;44263:6;44259:17;44249:27;;44205:81;44333:2;44325:6;44322:14;44302:18;44299:38;44296:84;;;44352:18;;:::i;:::-;44296:84;44117:269;44066:320;;;:::o;44392:281::-;44475:27;44497:4;44475:27;:::i;:::-;44467:6;44463:40;44605:6;44593:10;44590:22;44569:18;44557:10;44554:34;44551:62;44548:88;;;44616:18;;:::i;:::-;44548:88;44656:10;44652:2;44645:22;44435:238;44392:281;;:::o;44679:233::-;44718:3;44741:24;44759:5;44741:24;:::i;:::-;44732:33;;44787:66;44780:5;44777:77;44774:103;;;44857:18;;:::i;:::-;44774:103;44904:1;44897:5;44893:13;44886:20;;44679:233;;;:::o;44918:100::-;44957:7;44986:26;45006:5;44986:26;:::i;:::-;44975:37;;44918:100;;;:::o;45024:94::-;45063:7;45092:20;45106:5;45092:20;:::i;:::-;45081:31;;45024:94;;;:::o;45124:79::-;45163:7;45192:5;45181:16;;45124:79;;;:::o;45209:176::-;45241:1;45258:20;45276:1;45258:20;:::i;:::-;45253:25;;45292:20;45310:1;45292:20;:::i;:::-;45287:25;;45331:1;45321:35;;45336:18;;:::i;:::-;45321:35;45377:1;45374;45370:9;45365:14;;45209:176;;;;:::o;45391:180::-;45439:77;45436:1;45429:88;45536:4;45533:1;45526:15;45560:4;45557:1;45550:15;45577:180;45625:77;45622:1;45615:88;45722:4;45719:1;45712:15;45746:4;45743:1;45736:15;45763:180;45811:77;45808:1;45801:88;45908:4;45905:1;45898:15;45932:4;45929:1;45922:15;45949:180;45997:77;45994:1;45987:88;46094:4;46091:1;46084:15;46118:4;46115:1;46108:15;46135:180;46183:77;46180:1;46173:88;46280:4;46277:1;46270:15;46304:4;46301:1;46294:15;46321:180;46369:77;46366:1;46359:88;46466:4;46463:1;46456:15;46490:4;46487:1;46480:15;46507:117;46616:1;46613;46606:12;46630:117;46739:1;46736;46729:12;46753:117;46862:1;46859;46852:12;46876:117;46985:1;46982;46975:12;46999:117;47108:1;47105;47098:12;47122:102;47163:6;47214:2;47210:7;47205:2;47198:5;47194:14;47190:28;47180:38;;47122:102;;;:::o;47230:94::-;47263:8;47311:5;47307:2;47303:14;47282:35;;47230:94;;;:::o;47330:230::-;47470:34;47466:1;47458:6;47454:14;47447:58;47539:13;47534:2;47526:6;47522:15;47515:38;47330:230;:::o;47566:170::-;47706:22;47702:1;47694:6;47690:14;47683:46;47566:170;:::o;47742:230::-;47882:34;47878:1;47870:6;47866:14;47859:58;47951:13;47946:2;47938:6;47934:15;47927:38;47742:230;:::o;47978:237::-;48118:34;48114:1;48106:6;48102:14;48095:58;48187:20;48182:2;48174:6;48170:15;48163:45;47978:237;:::o;48221:225::-;48361:34;48357:1;48349:6;48345:14;48338:58;48430:8;48425:2;48417:6;48413:15;48406:33;48221:225;:::o;48452:224::-;48592:34;48588:1;48580:6;48576:14;48569:58;48661:7;48656:2;48648:6;48644:15;48637:32;48452:224;:::o;48682:178::-;48822:30;48818:1;48810:6;48806:14;48799:54;48682:178;:::o;48866:223::-;49006:34;49002:1;48994:6;48990:14;48983:58;49075:6;49070:2;49062:6;49058:15;49051:31;48866:223;:::o;49095:175::-;49235:27;49231:1;49223:6;49219:14;49212:51;49095:175;:::o;49276:159::-;49416:11;49412:1;49404:6;49400:14;49393:35;49276:159;:::o;49441:169::-;49581:21;49577:1;49569:6;49565:14;49558:45;49441:169;:::o;49616:166::-;49756:18;49752:1;49744:6;49740:14;49733:42;49616:166;:::o;49788:233::-;49928:34;49924:1;49916:6;49912:14;49905:58;49997:16;49992:2;49984:6;49980:15;49973:41;49788:233;:::o;50027:228::-;50167:34;50163:1;50155:6;50151:14;50144:58;50236:11;50231:2;50223:6;50219:15;50212:36;50027:228;:::o;50261:233::-;50401:34;50397:1;50389:6;50385:14;50378:58;50470:16;50465:2;50457:6;50453:15;50446:41;50261:233;:::o;50500:173::-;50640:25;50636:1;50628:6;50624:14;50617:49;50500:173;:::o;50679:249::-;50819:34;50815:1;50807:6;50803:14;50796:58;50888:32;50883:2;50875:6;50871:15;50864:57;50679:249;:::o;50934:182::-;51074:34;51070:1;51062:6;51058:14;51051:58;50934:182;:::o;51122:236::-;51262:34;51258:1;51250:6;51246:14;51239:58;51331:19;51326:2;51318:6;51314:15;51307:44;51122:236;:::o;51364:155::-;51504:7;51500:1;51492:6;51488:14;51481:31;51364:155;:::o;51525:182::-;51665:34;51661:1;51653:6;51649:14;51642:58;51525:182;:::o;51713:234::-;51853:34;51849:1;51841:6;51837:14;51830:58;51922:17;51917:2;51909:6;51905:15;51898:42;51713:234;:::o;51953:174::-;52093:26;52089:1;52081:6;52077:14;52070:50;51953:174;:::o;52133:220::-;52273:34;52269:1;52261:6;52257:14;52250:58;52342:3;52337:2;52329:6;52325:15;52318:28;52133:220;:::o;52359:114::-;;:::o;52479:166::-;52619:18;52615:1;52607:6;52603:14;52596:42;52479:166;:::o;52651:240::-;52791:34;52787:1;52779:6;52775:14;52768:58;52860:23;52855:2;52847:6;52843:15;52836:48;52651:240;:::o;52897:231::-;53037:34;53033:1;53025:6;53021:14;53014:58;53106:14;53101:2;53093:6;53089:15;53082:39;52897:231;:::o;53134:175::-;53274:27;53270:1;53262:6;53258:14;53251:51;53134:175;:::o;53315:233::-;53455:34;53451:1;53443:6;53439:14;53432:58;53524:16;53519:2;53511:6;53507:15;53500:41;53315:233;:::o;53554:122::-;53627:24;53645:5;53627:24;:::i;:::-;53620:5;53617:35;53607:63;;53666:1;53663;53656:12;53607:63;53554:122;:::o;53682:116::-;53752:21;53767:5;53752:21;:::i;:::-;53745:5;53742:32;53732:60;;53788:1;53785;53778:12;53732:60;53682:116;:::o;53804:122::-;53877:24;53895:5;53877:24;:::i;:::-;53870:5;53867:35;53857:63;;53916:1;53913;53906:12;53857:63;53804:122;:::o;53932:120::-;54004:23;54021:5;54004:23;:::i;:::-;53997:5;53994:34;53984:62;;54042:1;54039;54032:12;53984:62;53932:120;:::o;54058:122::-;54131:24;54149:5;54131:24;:::i;:::-;54124:5;54121:35;54111:63;;54170:1;54167;54160:12;54111:63;54058:122;:::o

Swarm Source

ipfs://99e2bf3278b823bfebbdb60fbe8f7adb1ea9b259e7c90d7253390edfeee83e4d
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.