ETH Price: $2,672.61 (+1.34%)

Token

KARTAL CLUB (KRTL)
 

Overview

Max Total Supply

502 KRTL

Holders

354

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 KRTL
0xb0c8a6bacd0ebd96372f2676a09640c24885f5c6
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:
KartalCollectible

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-25
*/

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees 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.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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 substraction 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/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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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 `IERC721.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 v4.4.1 (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`, 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 be 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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


// OpenZeppelin Contracts v4.4.1 (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 tokenId);

    /**
     * @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: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**128 - 1 (max value of uint128).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

    // The number of tokens burned.
    uint128 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        _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 {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = uint128(updatedIndex);
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked { 
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/KartalCollectible.sol


pragma solidity >=0.4.22 <0.9.0;








contract KartalCollectible is ERC721A, Ownable, ReentrancyGuard { 
    using Strings for uint256;

    // Maximum supply of NFT's
    uint256 constant public MAX_SUPPLY = 5000;

    // Set the current listing price to 0.2 ether.
    uint256 constant public LISTING_PRICE = 0.2 ether;

    // Merkle Proof hash
    bytes32 public merkleTreeRootHash = 0x7bc87f848fbb6ea0e6609dd97646643d3a04c5d957fd739efaac1f510c822f60;
    
    // Presale
    bool private presaleActive = true;

    // Open sale
    bool private saleOpen = false;

    // NFT Metadata Base URI
    string private baseUri = "https://cdn.kartal-nft.io/";

    constructor() ERC721A("KARTAL CLUB", "KRTL") ReentrancyGuard() {

    }

    function mintTokenFromWeb(uint256 tokenQuantity, bytes32[] calldata merkleProof) nonReentrant() callerIsUser external payable {
        // Check if sale is open
        require(saleOpen, "The sale is not yet open");

        // Check if enough ether was sent
        uint256 totalPrice = SafeMath.mul(tokenQuantity, LISTING_PRICE);
        require(msg.value >= totalPrice, "Ether value sent is not correct");

        // Check if the given token quantity is not null or negative
        require(tokenQuantity > 0, "Token quantity must be greater than 0");

        // Check if this purchase would exceed the max supply
        uint256 supplyAfterMint = SafeMath.add(totalSupply(), tokenQuantity);
        require(supplyAfterMint <= MAX_SUPPLY, "Purchase would exceed max supply");        

        // If presale is active check for whitelist proof
        if (presaleActive) {
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(merkleProof, merkleTreeRootHash, leaf), "Your address is not whitelisted");
        }

        // Mint the tokens
        _safeMint(msg.sender, tokenQuantity);
    }

    // ==== Modifiers ====

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller should be an user");
        _;
    }

    // ==== Only owner methods ====

    function withdraw() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function setPresale(bool _presale) external onlyOwner {
        presaleActive = _presale;
    }

    function setSaleOpen(bool _saleOpen) external onlyOwner {
        saleOpen = _saleOpen;
    }

    function setBaseURI(string calldata _uri) external onlyOwner {
        baseUri = _uri;
    }

    function setMerkleTreeRootHash(bytes32 _hash) external onlyOwner {
        merkleTreeRootHash = _hash;
    }

    // ==== Public methods =====

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

    function getPresaleActive() external view returns (bool) {
        return presaleActive;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"LISTING_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleTreeRootHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintTokenFromWeb","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"setMerkleTreeRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_presale","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_saleOpen","type":"bool"}],"name":"setSaleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527f7bc87f848fbb6ea0e6609dd97646643d3a04c5d957fd739efaac1f510c822f6060001b6009556001600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506040518060400160405280601a81526020017f68747470733a2f2f63646e2e6b617274616c2d6e66742e696f2f000000000000815250600b9080519060200190620000ae92919062000259565b50348015620000bc57600080fd5b506040518060400160405280600b81526020017f4b415254414c20434c55420000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4b52544c0000000000000000000000000000000000000000000000000000000081525081600190805190602001906200014192919062000259565b5080600290805190602001906200015a92919062000259565b5050506200017d620001716200018b60201b60201c565b6200019360201b60201c565b60016008819055506200036e565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002679062000338565b90600052602060002090601f0160209004810192826200028b5760008555620002d7565b82601f10620002a657805160ff1916838001178555620002d7565b82800160010185558215620002d7579182015b82811115620002d6578251825591602001919060010190620002b9565b5b509050620002e69190620002ea565b5090565b5b8082111562000305576000816000905550600101620002eb565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035157607f821691505b6020821081141562000368576200036762000309565b5b50919050565b61403f806200037e6000396000f3fe6080604052600436106101c25760003560e01c806370a08231116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd1461062c578063ce10447414610669578063e985e9c514610685578063f2fde38b146106c2576101c2565b8063a22cb46514610588578063af979f25146105b1578063b88d4fde146105da578063c54e73e314610603576101c2565b80637c914d8d116100d15780637c914d8d146104dc5780637eb51d09146105075780638da5cb5b1461053257806395d89b411461055d576101c2565b806370a082311461045d578063715018a61461049a57806373956761146104b1576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e146103915780634f6ccce7146103ba57806355f804b3146103f75780636352211e14610420576101c2565b80632f745c591461031257806332cb6b0c1461034f5780633ccfd60b1461037a576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c057806323baeac9146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612f04565b6106eb565b6040516101fb9190612f4c565b60405180910390f35b34801561021057600080fd5b50610219610835565b6040516102269190613000565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613058565b6108c7565b60405161026391906130c6565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061310d565b610943565b005b3480156102a157600080fd5b506102aa610a4e565b6040516102b7919061315c565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190613177565b610aa3565b005b3480156102f557600080fd5b50610310600480360381019061030b9190613200565b610ab3565b005b34801561031e57600080fd5b506103396004803603810190610334919061310d565b610b39565b604051610346919061315c565b60405180910390f35b34801561035b57600080fd5b50610364610d40565b604051610371919061315c565b60405180910390f35b34801561038657600080fd5b5061038f610d46565b005b34801561039d57600080fd5b506103b860048036038101906103b39190613177565b610ec7565b005b3480156103c657600080fd5b506103e160048036038101906103dc9190613058565b610ee7565b6040516103ee919061315c565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613292565b611058565b005b34801561042c57600080fd5b5061044760048036038101906104429190613058565b6110ea565b60405161045491906130c6565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f91906132df565b611100565b604051610491919061315c565b60405180910390f35b3480156104a657600080fd5b506104af6111d0565b005b3480156104bd57600080fd5b506104c6611258565b6040516104d3919061315c565b60405180910390f35b3480156104e857600080fd5b506104f1611264565b6040516104fe9190612f4c565b60405180910390f35b34801561051357600080fd5b5061051c61127b565b604051610529919061331b565b60405180910390f35b34801561053e57600080fd5b50610547611281565b60405161055491906130c6565b60405180910390f35b34801561056957600080fd5b506105726112ab565b60405161057f9190613000565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190613362565b61133d565b005b3480156105bd57600080fd5b506105d860048036038101906105d391906133a2565b6114b5565b005b3480156105e657600080fd5b5061060160048036038101906105fc91906134ff565b61154e565b005b34801561060f57600080fd5b5061062a600480360381019061062591906133a2565b6115a1565b005b34801561063857600080fd5b50610653600480360381019061064e9190613058565b61163a565b6040516106609190613000565b60405180910390f35b610683600480360381019061067e91906135d8565b6116d9565b005b34801561069157600080fd5b506106ac60048036038101906106a79190613638565b6119c2565b6040516106b99190612f4c565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e491906132df565b611a56565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061081e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061082e575061082d82611b4e565b5b9050919050565b606060018054610844906136a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610870906136a7565b80156108bd5780601f10610892576101008083540402835291602001916108bd565b820191906000526020600020905b8154815290600101906020018083116108a057829003601f168201915b5050505050905090565b60006108d282611bb8565b610908576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094e826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d5611c20565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a075750610a0581610a00611c20565b6119c2565b155b15610a3e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a49838383611c28565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610aae838383611cda565b505050565b610abb611c20565b73ffffffffffffffffffffffffffffffffffffffff16610ad9611281565b73ffffffffffffffffffffffffffffffffffffffff1614610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613725565b60405180910390fd5b8060098190555050565b6000610b4483611100565b8210610b7c576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610d34576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610c935750610d27565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cd357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d255786841415610d1c578195505050505050610d3a565b83806001019450505b505b8080600101915050610bb6565b50600080fd5b92915050565b61138881565b610d4e611c20565b73ffffffffffffffffffffffffffffffffffffffff16610d6c611281565b73ffffffffffffffffffffffffffffffffffffffff1614610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db990613725565b60405180910390fd5b60026008541415610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613791565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e36906137e2565b60006040518083038185875af1925050503d8060008114610e73576040519150601f19603f3d011682016040523d82523d6000602084013e610e78565b606091505b5050905080610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390613843565b60405180910390fd5b506001600881905550565b610ee28383836040518060200160405280600081525061154e565b505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611020576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161101257858314156110095781945050505050611053565b82806001019350505b508080600101915050610f1f565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611060611c20565b73ffffffffffffffffffffffffffffffffffffffff1661107e611281565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613725565b60405180910390fd5b8181600b91906110e5929190612db2565b505050565b60006110f5826121f7565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611168576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6111d8611c20565b73ffffffffffffffffffffffffffffffffffffffff166111f6611281565b73ffffffffffffffffffffffffffffffffffffffff161461124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390613725565b60405180910390fd5b611256600061249f565b565b6702c68af0bb14000081565b6000600a60009054906101000a900460ff16905090565b60095481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546112ba906136a7565b80601f01602080910402602001604051908101604052809291908181526020018280546112e6906136a7565b80156113335780601f1061130857610100808354040283529160200191611333565b820191906000526020600020905b81548152906001019060200180831161131657829003601f168201915b5050505050905090565b611345611c20565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113aa576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006113b7611c20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611464611c20565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a99190612f4c565b60405180910390a35050565b6114bd611c20565b73ffffffffffffffffffffffffffffffffffffffff166114db611281565b73ffffffffffffffffffffffffffffffffffffffff1614611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613725565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b611559848484611cda565b61156584848484612565565b61159b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6115a9611c20565b73ffffffffffffffffffffffffffffffffffffffff166115c7611281565b73ffffffffffffffffffffffffffffffffffffffff161461161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490613725565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b606061164582611bb8565b61167b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116856126e4565b90506000815114156116a657604051806020016040528060008152506116d1565b806116b084612776565b6040516020016116c19291906138eb565b6040516020818303038152906040525b915050919050565b6002600854141561171f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171690613791565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90613966565b60405180910390fd5b600a60019054906101000a900460ff166117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db906139d2565b60405180910390fd5b60006117f8846702c68af0bb1400006128d7565b90508034101561183d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183490613a3e565b60405180910390fd5b60008411611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790613ad0565b60405180910390fd5b600061189361188d610a4e565b866128ed565b90506113888111156118da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d190613b3c565b60405180910390fd5b600a60009054906101000a900460ff16156119a9576000336040516020016119029190613ba4565b604051602081830303815290604052805190602001209050611968858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060095483612903565b6119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90613c0b565b60405180910390fd5b505b6119b3338661291a565b50506001600881905550505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5e611c20565b73ffffffffffffffffffffffffffffffffffffffff16611a7c611281565b73ffffffffffffffffffffffffffffffffffffffff1614611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac990613725565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3990613c9d565b60405180910390fd5b611b4b8161249f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015611c19575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611ce5826121f7565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611d0c611c20565b73ffffffffffffffffffffffffffffffffffffffff161480611d3f5750611d3e8260000151611d39611c20565b6119c2565b5b80611d845750611d4d611c20565b73ffffffffffffffffffffffffffffffffffffffff16611d6c846108c7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611dbd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e26576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e8d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e9a8585856001612938565b611eaa6000848460000151611c28565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121875760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156121865782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121f0858585600161293e565b5050505050565b6121ff612e38565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612468576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161246657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461234a57809250505061249a565b5b60011561246557818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461246057809250505061249a565b61234b565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006125868473ffffffffffffffffffffffffffffffffffffffff16612944565b156126d7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125af611c20565b8786866040518563ffffffff1660e01b81526004016125d19493929190613d12565b6020604051808303816000875af192505050801561260d57506040513d601f19601f8201168201806040525081019061260a9190613d73565b60015b612687573d806000811461263d576040519150601f19603f3d011682016040523d82523d6000602084013e612642565b606091505b5060008151141561267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126dc565b600190505b949350505050565b6060600b80546126f3906136a7565b80601f016020809104026020016040519081016040528092919081815260200182805461271f906136a7565b801561276c5780601f106127415761010080835404028352916020019161276c565b820191906000526020600020905b81548152906001019060200180831161274f57829003601f168201915b5050505050905090565b606060008214156127be576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128d2565b600082905060005b600082146127f05780806127d990613dcf565b915050600a826127e99190613e47565b91506127c6565b60008167ffffffffffffffff81111561280c5761280b6133d4565b5b6040519080825280601f01601f19166020018201604052801561283e5781602001600182028036833780820191505090505b5090505b600085146128cb576001826128579190613e78565b9150600a856128669190613eac565b60306128729190613edd565b60f81b81838151811061288857612887613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128c49190613e47565b9450612842565b8093505050505b919050565b600081836128e59190613f62565b905092915050565b600081836128fb9190613edd565b905092915050565b6000826129108584612957565b1490509392505050565b612934828260405180602001604052806000815250612a0a565b5050565b50505050565b50505050565b600080823b905060008111915050919050565b60008082905060005b84518110156129ff57600085828151811061297e5761297d613f33565b5b602002602001015190508083116129bf5782816040516020016129a2929190613fdd565b6040516020818303038152906040528051906020012092506129eb565b80836040516020016129d2929190613fdd565b6040516020818303038152906040528051906020012092505b5080806129f790613dcf565b915050612960565b508091505092915050565b612a178383836001612a1c565b505050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612ab7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612af2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612aff6000868387612938565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612d6457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612d185750612d166000888488612565565b155b15612d4f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612c9d565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050612dab600086838761293e565b5050505050565b828054612dbe906136a7565b90600052602060002090601f016020900481019282612de05760008555612e27565b82601f10612df957803560ff1916838001178555612e27565b82800160010185558215612e27579182015b82811115612e26578235825591602001919060010190612e0b565b5b509050612e349190612e7b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e94576000816000905550600101612e7c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ee181612eac565b8114612eec57600080fd5b50565b600081359050612efe81612ed8565b92915050565b600060208284031215612f1a57612f19612ea2565b5b6000612f2884828501612eef565b91505092915050565b60008115159050919050565b612f4681612f31565b82525050565b6000602082019050612f616000830184612f3d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa1578082015181840152602081019050612f86565b83811115612fb0576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fd282612f67565b612fdc8185612f72565b9350612fec818560208601612f83565b612ff581612fb6565b840191505092915050565b6000602082019050818103600083015261301a8184612fc7565b905092915050565b6000819050919050565b61303581613022565b811461304057600080fd5b50565b6000813590506130528161302c565b92915050565b60006020828403121561306e5761306d612ea2565b5b600061307c84828501613043565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130b082613085565b9050919050565b6130c0816130a5565b82525050565b60006020820190506130db60008301846130b7565b92915050565b6130ea816130a5565b81146130f557600080fd5b50565b600081359050613107816130e1565b92915050565b6000806040838503121561312457613123612ea2565b5b6000613132858286016130f8565b925050602061314385828601613043565b9150509250929050565b61315681613022565b82525050565b6000602082019050613171600083018461314d565b92915050565b6000806000606084860312156131905761318f612ea2565b5b600061319e868287016130f8565b93505060206131af868287016130f8565b92505060406131c086828701613043565b9150509250925092565b6000819050919050565b6131dd816131ca565b81146131e857600080fd5b50565b6000813590506131fa816131d4565b92915050565b60006020828403121561321657613215612ea2565b5b6000613224848285016131eb565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132525761325161322d565b5b8235905067ffffffffffffffff81111561326f5761326e613232565b5b60208301915083600182028301111561328b5761328a613237565b5b9250929050565b600080602083850312156132a9576132a8612ea2565b5b600083013567ffffffffffffffff8111156132c7576132c6612ea7565b5b6132d38582860161323c565b92509250509250929050565b6000602082840312156132f5576132f4612ea2565b5b6000613303848285016130f8565b91505092915050565b613315816131ca565b82525050565b6000602082019050613330600083018461330c565b92915050565b61333f81612f31565b811461334a57600080fd5b50565b60008135905061335c81613336565b92915050565b6000806040838503121561337957613378612ea2565b5b6000613387858286016130f8565b92505060206133988582860161334d565b9150509250929050565b6000602082840312156133b8576133b7612ea2565b5b60006133c68482850161334d565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61340c82612fb6565b810181811067ffffffffffffffff8211171561342b5761342a6133d4565b5b80604052505050565b600061343e612e98565b905061344a8282613403565b919050565b600067ffffffffffffffff82111561346a576134696133d4565b5b61347382612fb6565b9050602081019050919050565b82818337600083830152505050565b60006134a261349d8461344f565b613434565b9050828152602081018484840111156134be576134bd6133cf565b5b6134c9848285613480565b509392505050565b600082601f8301126134e6576134e561322d565b5b81356134f684826020860161348f565b91505092915050565b6000806000806080858703121561351957613518612ea2565b5b6000613527878288016130f8565b9450506020613538878288016130f8565b935050604061354987828801613043565b925050606085013567ffffffffffffffff81111561356a57613569612ea7565b5b613576878288016134d1565b91505092959194509250565b60008083601f8401126135985761359761322d565b5b8235905067ffffffffffffffff8111156135b5576135b4613232565b5b6020830191508360208202830111156135d1576135d0613237565b5b9250929050565b6000806000604084860312156135f1576135f0612ea2565b5b60006135ff86828701613043565b935050602084013567ffffffffffffffff8111156136205761361f612ea7565b5b61362c86828701613582565b92509250509250925092565b6000806040838503121561364f5761364e612ea2565b5b600061365d858286016130f8565b925050602061366e858286016130f8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136bf57607f821691505b602082108114156136d3576136d2613678565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061370f602083612f72565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061377b601f83612f72565b915061378682613745565b602082019050919050565b600060208201905081810360008301526137aa8161376e565b9050919050565b600081905092915050565b50565b60006137cc6000836137b1565b91506137d7826137bc565b600082019050919050565b60006137ed826137bf565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061382d601083612f72565b9150613838826137f7565b602082019050919050565b6000602082019050818103600083015261385c81613820565b9050919050565b600081905092915050565b600061387982612f67565b6138838185613863565b9350613893818560208601612f83565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006138d5600583613863565b91506138e08261389f565b600582019050919050565b60006138f7828561386e565b9150613903828461386e565b915061390e826138c8565b91508190509392505050565b7f5468652063616c6c65722073686f756c6420626520616e207573657200000000600082015250565b6000613950601c83612f72565b915061395b8261391a565b602082019050919050565b6000602082019050818103600083015261397f81613943565b9050919050565b7f5468652073616c65206973206e6f7420796574206f70656e0000000000000000600082015250565b60006139bc601883612f72565b91506139c782613986565b602082019050919050565b600060208201905081810360008301526139eb816139af565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000613a28601f83612f72565b9150613a33826139f2565b602082019050919050565b60006020820190508181036000830152613a5781613a1b565b9050919050565b7f546f6b656e207175616e74697479206d7573742062652067726561746572207460008201527f68616e2030000000000000000000000000000000000000000000000000000000602082015250565b6000613aba602583612f72565b9150613ac582613a5e565b604082019050919050565b60006020820190508181036000830152613ae981613aad565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b6000613b26602083612f72565b9150613b3182613af0565b602082019050919050565b60006020820190508181036000830152613b5581613b19565b9050919050565b60008160601b9050919050565b6000613b7482613b5c565b9050919050565b6000613b8682613b69565b9050919050565b613b9e613b99826130a5565b613b7b565b82525050565b6000613bb08284613b8d565b60148201915081905092915050565b7f596f75722061646472657373206973206e6f742077686974656c697374656400600082015250565b6000613bf5601f83612f72565b9150613c0082613bbf565b602082019050919050565b60006020820190508181036000830152613c2481613be8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c87602683612f72565b9150613c9282613c2b565b604082019050919050565b60006020820190508181036000830152613cb681613c7a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ce482613cbd565b613cee8185613cc8565b9350613cfe818560208601612f83565b613d0781612fb6565b840191505092915050565b6000608082019050613d2760008301876130b7565b613d3460208301866130b7565b613d41604083018561314d565b8181036060830152613d538184613cd9565b905095945050505050565b600081519050613d6d81612ed8565b92915050565b600060208284031215613d8957613d88612ea2565b5b6000613d9784828501613d5e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dda82613022565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e0d57613e0c613da0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e5282613022565b9150613e5d83613022565b925082613e6d57613e6c613e18565b5b828204905092915050565b6000613e8382613022565b9150613e8e83613022565b925082821015613ea157613ea0613da0565b5b828203905092915050565b6000613eb782613022565b9150613ec283613022565b925082613ed257613ed1613e18565b5b828206905092915050565b6000613ee882613022565b9150613ef383613022565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f2857613f27613da0565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f6d82613022565b9150613f7883613022565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fb157613fb0613da0565b5b828202905092915050565b6000819050919050565b613fd7613fd2826131ca565b613fbc565b82525050565b6000613fe98285613fc6565b602082019150613ff98284613fc6565b602082019150819050939250505056fea264697066735822122014819f8d7962b526e6423dbcc2196ff3d29c2247c0d6ea34c5087c9a4ea3ac9864736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806370a08231116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd1461062c578063ce10447414610669578063e985e9c514610685578063f2fde38b146106c2576101c2565b8063a22cb46514610588578063af979f25146105b1578063b88d4fde146105da578063c54e73e314610603576101c2565b80637c914d8d116100d15780637c914d8d146104dc5780637eb51d09146105075780638da5cb5b1461053257806395d89b411461055d576101c2565b806370a082311461045d578063715018a61461049a57806373956761146104b1576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e146103915780634f6ccce7146103ba57806355f804b3146103f75780636352211e14610420576101c2565b80632f745c591461031257806332cb6b0c1461034f5780633ccfd60b1461037a576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c057806323baeac9146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612f04565b6106eb565b6040516101fb9190612f4c565b60405180910390f35b34801561021057600080fd5b50610219610835565b6040516102269190613000565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613058565b6108c7565b60405161026391906130c6565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061310d565b610943565b005b3480156102a157600080fd5b506102aa610a4e565b6040516102b7919061315c565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190613177565b610aa3565b005b3480156102f557600080fd5b50610310600480360381019061030b9190613200565b610ab3565b005b34801561031e57600080fd5b506103396004803603810190610334919061310d565b610b39565b604051610346919061315c565b60405180910390f35b34801561035b57600080fd5b50610364610d40565b604051610371919061315c565b60405180910390f35b34801561038657600080fd5b5061038f610d46565b005b34801561039d57600080fd5b506103b860048036038101906103b39190613177565b610ec7565b005b3480156103c657600080fd5b506103e160048036038101906103dc9190613058565b610ee7565b6040516103ee919061315c565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613292565b611058565b005b34801561042c57600080fd5b5061044760048036038101906104429190613058565b6110ea565b60405161045491906130c6565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f91906132df565b611100565b604051610491919061315c565b60405180910390f35b3480156104a657600080fd5b506104af6111d0565b005b3480156104bd57600080fd5b506104c6611258565b6040516104d3919061315c565b60405180910390f35b3480156104e857600080fd5b506104f1611264565b6040516104fe9190612f4c565b60405180910390f35b34801561051357600080fd5b5061051c61127b565b604051610529919061331b565b60405180910390f35b34801561053e57600080fd5b50610547611281565b60405161055491906130c6565b60405180910390f35b34801561056957600080fd5b506105726112ab565b60405161057f9190613000565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190613362565b61133d565b005b3480156105bd57600080fd5b506105d860048036038101906105d391906133a2565b6114b5565b005b3480156105e657600080fd5b5061060160048036038101906105fc91906134ff565b61154e565b005b34801561060f57600080fd5b5061062a600480360381019061062591906133a2565b6115a1565b005b34801561063857600080fd5b50610653600480360381019061064e9190613058565b61163a565b6040516106609190613000565b60405180910390f35b610683600480360381019061067e91906135d8565b6116d9565b005b34801561069157600080fd5b506106ac60048036038101906106a79190613638565b6119c2565b6040516106b99190612f4c565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e491906132df565b611a56565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061081e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061082e575061082d82611b4e565b5b9050919050565b606060018054610844906136a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610870906136a7565b80156108bd5780601f10610892576101008083540402835291602001916108bd565b820191906000526020600020905b8154815290600101906020018083116108a057829003601f168201915b5050505050905090565b60006108d282611bb8565b610908576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094e826110ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d5611c20565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a075750610a0581610a00611c20565b6119c2565b155b15610a3e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a49838383611c28565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610aae838383611cda565b505050565b610abb611c20565b73ffffffffffffffffffffffffffffffffffffffff16610ad9611281565b73ffffffffffffffffffffffffffffffffffffffff1614610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613725565b60405180910390fd5b8060098190555050565b6000610b4483611100565b8210610b7c576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610d34576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610c935750610d27565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cd357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d255786841415610d1c578195505050505050610d3a565b83806001019450505b505b8080600101915050610bb6565b50600080fd5b92915050565b61138881565b610d4e611c20565b73ffffffffffffffffffffffffffffffffffffffff16610d6c611281565b73ffffffffffffffffffffffffffffffffffffffff1614610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db990613725565b60405180910390fd5b60026008541415610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613791565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e36906137e2565b60006040518083038185875af1925050503d8060008114610e73576040519150601f19603f3d011682016040523d82523d6000602084013e610e78565b606091505b5050905080610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390613843565b60405180910390fd5b506001600881905550565b610ee28383836040518060200160405280600081525061154e565b505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611020576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161101257858314156110095781945050505050611053565b82806001019350505b508080600101915050610f1f565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611060611c20565b73ffffffffffffffffffffffffffffffffffffffff1661107e611281565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613725565b60405180910390fd5b8181600b91906110e5929190612db2565b505050565b60006110f5826121f7565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611168576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6111d8611c20565b73ffffffffffffffffffffffffffffffffffffffff166111f6611281565b73ffffffffffffffffffffffffffffffffffffffff161461124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390613725565b60405180910390fd5b611256600061249f565b565b6702c68af0bb14000081565b6000600a60009054906101000a900460ff16905090565b60095481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546112ba906136a7565b80601f01602080910402602001604051908101604052809291908181526020018280546112e6906136a7565b80156113335780601f1061130857610100808354040283529160200191611333565b820191906000526020600020905b81548152906001019060200180831161131657829003601f168201915b5050505050905090565b611345611c20565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113aa576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006113b7611c20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611464611c20565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114a99190612f4c565b60405180910390a35050565b6114bd611c20565b73ffffffffffffffffffffffffffffffffffffffff166114db611281565b73ffffffffffffffffffffffffffffffffffffffff1614611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613725565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b611559848484611cda565b61156584848484612565565b61159b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6115a9611c20565b73ffffffffffffffffffffffffffffffffffffffff166115c7611281565b73ffffffffffffffffffffffffffffffffffffffff161461161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490613725565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b606061164582611bb8565b61167b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116856126e4565b90506000815114156116a657604051806020016040528060008152506116d1565b806116b084612776565b6040516020016116c19291906138eb565b6040516020818303038152906040525b915050919050565b6002600854141561171f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171690613791565b60405180910390fd5b60026008819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90613966565b60405180910390fd5b600a60019054906101000a900460ff166117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db906139d2565b60405180910390fd5b60006117f8846702c68af0bb1400006128d7565b90508034101561183d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183490613a3e565b60405180910390fd5b60008411611880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187790613ad0565b60405180910390fd5b600061189361188d610a4e565b866128ed565b90506113888111156118da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d190613b3c565b60405180910390fd5b600a60009054906101000a900460ff16156119a9576000336040516020016119029190613ba4565b604051602081830303815290604052805190602001209050611968858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060095483612903565b6119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90613c0b565b60405180910390fd5b505b6119b3338661291a565b50506001600881905550505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5e611c20565b73ffffffffffffffffffffffffffffffffffffffff16611a7c611281565b73ffffffffffffffffffffffffffffffffffffffff1614611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac990613725565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3990613c9d565b60405180910390fd5b611b4b8161249f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015611c19575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611ce5826121f7565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611d0c611c20565b73ffffffffffffffffffffffffffffffffffffffff161480611d3f5750611d3e8260000151611d39611c20565b6119c2565b5b80611d845750611d4d611c20565b73ffffffffffffffffffffffffffffffffffffffff16611d6c846108c7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611dbd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e26576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e8d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e9a8585856001612938565b611eaa6000848460000151611c28565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121875760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156121865782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121f0858585600161293e565b5050505050565b6121ff612e38565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612468576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161246657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461234a57809250505061249a565b5b60011561246557818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461246057809250505061249a565b61234b565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006125868473ffffffffffffffffffffffffffffffffffffffff16612944565b156126d7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125af611c20565b8786866040518563ffffffff1660e01b81526004016125d19493929190613d12565b6020604051808303816000875af192505050801561260d57506040513d601f19601f8201168201806040525081019061260a9190613d73565b60015b612687573d806000811461263d576040519150601f19603f3d011682016040523d82523d6000602084013e612642565b606091505b5060008151141561267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126dc565b600190505b949350505050565b6060600b80546126f3906136a7565b80601f016020809104026020016040519081016040528092919081815260200182805461271f906136a7565b801561276c5780601f106127415761010080835404028352916020019161276c565b820191906000526020600020905b81548152906001019060200180831161274f57829003601f168201915b5050505050905090565b606060008214156127be576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128d2565b600082905060005b600082146127f05780806127d990613dcf565b915050600a826127e99190613e47565b91506127c6565b60008167ffffffffffffffff81111561280c5761280b6133d4565b5b6040519080825280601f01601f19166020018201604052801561283e5781602001600182028036833780820191505090505b5090505b600085146128cb576001826128579190613e78565b9150600a856128669190613eac565b60306128729190613edd565b60f81b81838151811061288857612887613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128c49190613e47565b9450612842565b8093505050505b919050565b600081836128e59190613f62565b905092915050565b600081836128fb9190613edd565b905092915050565b6000826129108584612957565b1490509392505050565b612934828260405180602001604052806000815250612a0a565b5050565b50505050565b50505050565b600080823b905060008111915050919050565b60008082905060005b84518110156129ff57600085828151811061297e5761297d613f33565b5b602002602001015190508083116129bf5782816040516020016129a2929190613fdd565b6040516020818303038152906040528051906020012092506129eb565b80836040516020016129d2929190613fdd565b6040516020818303038152906040528051906020012092505b5080806129f790613dcf565b915050612960565b508091505092915050565b612a178383836001612a1c565b505050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612ab7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612af2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612aff6000868387612938565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612d6457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612d185750612d166000888488612565565b155b15612d4f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612c9d565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050612dab600086838761293e565b5050505050565b828054612dbe906136a7565b90600052602060002090601f016020900481019282612de05760008555612e27565b82601f10612df957803560ff1916838001178555612e27565b82800160010185558215612e27579182015b82811115612e26578235825591602001919060010190612e0b565b5b509050612e349190612e7b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e94576000816000905550600101612e7c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ee181612eac565b8114612eec57600080fd5b50565b600081359050612efe81612ed8565b92915050565b600060208284031215612f1a57612f19612ea2565b5b6000612f2884828501612eef565b91505092915050565b60008115159050919050565b612f4681612f31565b82525050565b6000602082019050612f616000830184612f3d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa1578082015181840152602081019050612f86565b83811115612fb0576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fd282612f67565b612fdc8185612f72565b9350612fec818560208601612f83565b612ff581612fb6565b840191505092915050565b6000602082019050818103600083015261301a8184612fc7565b905092915050565b6000819050919050565b61303581613022565b811461304057600080fd5b50565b6000813590506130528161302c565b92915050565b60006020828403121561306e5761306d612ea2565b5b600061307c84828501613043565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130b082613085565b9050919050565b6130c0816130a5565b82525050565b60006020820190506130db60008301846130b7565b92915050565b6130ea816130a5565b81146130f557600080fd5b50565b600081359050613107816130e1565b92915050565b6000806040838503121561312457613123612ea2565b5b6000613132858286016130f8565b925050602061314385828601613043565b9150509250929050565b61315681613022565b82525050565b6000602082019050613171600083018461314d565b92915050565b6000806000606084860312156131905761318f612ea2565b5b600061319e868287016130f8565b93505060206131af868287016130f8565b92505060406131c086828701613043565b9150509250925092565b6000819050919050565b6131dd816131ca565b81146131e857600080fd5b50565b6000813590506131fa816131d4565b92915050565b60006020828403121561321657613215612ea2565b5b6000613224848285016131eb565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126132525761325161322d565b5b8235905067ffffffffffffffff81111561326f5761326e613232565b5b60208301915083600182028301111561328b5761328a613237565b5b9250929050565b600080602083850312156132a9576132a8612ea2565b5b600083013567ffffffffffffffff8111156132c7576132c6612ea7565b5b6132d38582860161323c565b92509250509250929050565b6000602082840312156132f5576132f4612ea2565b5b6000613303848285016130f8565b91505092915050565b613315816131ca565b82525050565b6000602082019050613330600083018461330c565b92915050565b61333f81612f31565b811461334a57600080fd5b50565b60008135905061335c81613336565b92915050565b6000806040838503121561337957613378612ea2565b5b6000613387858286016130f8565b92505060206133988582860161334d565b9150509250929050565b6000602082840312156133b8576133b7612ea2565b5b60006133c68482850161334d565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61340c82612fb6565b810181811067ffffffffffffffff8211171561342b5761342a6133d4565b5b80604052505050565b600061343e612e98565b905061344a8282613403565b919050565b600067ffffffffffffffff82111561346a576134696133d4565b5b61347382612fb6565b9050602081019050919050565b82818337600083830152505050565b60006134a261349d8461344f565b613434565b9050828152602081018484840111156134be576134bd6133cf565b5b6134c9848285613480565b509392505050565b600082601f8301126134e6576134e561322d565b5b81356134f684826020860161348f565b91505092915050565b6000806000806080858703121561351957613518612ea2565b5b6000613527878288016130f8565b9450506020613538878288016130f8565b935050604061354987828801613043565b925050606085013567ffffffffffffffff81111561356a57613569612ea7565b5b613576878288016134d1565b91505092959194509250565b60008083601f8401126135985761359761322d565b5b8235905067ffffffffffffffff8111156135b5576135b4613232565b5b6020830191508360208202830111156135d1576135d0613237565b5b9250929050565b6000806000604084860312156135f1576135f0612ea2565b5b60006135ff86828701613043565b935050602084013567ffffffffffffffff8111156136205761361f612ea7565b5b61362c86828701613582565b92509250509250925092565b6000806040838503121561364f5761364e612ea2565b5b600061365d858286016130f8565b925050602061366e858286016130f8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136bf57607f821691505b602082108114156136d3576136d2613678565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061370f602083612f72565b915061371a826136d9565b602082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061377b601f83612f72565b915061378682613745565b602082019050919050565b600060208201905081810360008301526137aa8161376e565b9050919050565b600081905092915050565b50565b60006137cc6000836137b1565b91506137d7826137bc565b600082019050919050565b60006137ed826137bf565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061382d601083612f72565b9150613838826137f7565b602082019050919050565b6000602082019050818103600083015261385c81613820565b9050919050565b600081905092915050565b600061387982612f67565b6138838185613863565b9350613893818560208601612f83565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006138d5600583613863565b91506138e08261389f565b600582019050919050565b60006138f7828561386e565b9150613903828461386e565b915061390e826138c8565b91508190509392505050565b7f5468652063616c6c65722073686f756c6420626520616e207573657200000000600082015250565b6000613950601c83612f72565b915061395b8261391a565b602082019050919050565b6000602082019050818103600083015261397f81613943565b9050919050565b7f5468652073616c65206973206e6f7420796574206f70656e0000000000000000600082015250565b60006139bc601883612f72565b91506139c782613986565b602082019050919050565b600060208201905081810360008301526139eb816139af565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000613a28601f83612f72565b9150613a33826139f2565b602082019050919050565b60006020820190508181036000830152613a5781613a1b565b9050919050565b7f546f6b656e207175616e74697479206d7573742062652067726561746572207460008201527f68616e2030000000000000000000000000000000000000000000000000000000602082015250565b6000613aba602583612f72565b9150613ac582613a5e565b604082019050919050565b60006020820190508181036000830152613ae981613aad565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b6000613b26602083612f72565b9150613b3182613af0565b602082019050919050565b60006020820190508181036000830152613b5581613b19565b9050919050565b60008160601b9050919050565b6000613b7482613b5c565b9050919050565b6000613b8682613b69565b9050919050565b613b9e613b99826130a5565b613b7b565b82525050565b6000613bb08284613b8d565b60148201915081905092915050565b7f596f75722061646472657373206973206e6f742077686974656c697374656400600082015250565b6000613bf5601f83612f72565b9150613c0082613bbf565b602082019050919050565b60006020820190508181036000830152613c2481613be8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c87602683612f72565b9150613c9282613c2b565b604082019050919050565b60006020820190508181036000830152613cb681613c7a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ce482613cbd565b613cee8185613cc8565b9350613cfe818560208601612f83565b613d0781612fb6565b840191505092915050565b6000608082019050613d2760008301876130b7565b613d3460208301866130b7565b613d41604083018561314d565b8181036060830152613d538184613cd9565b905095945050505050565b600081519050613d6d81612ed8565b92915050565b600060208284031215613d8957613d88612ea2565b5b6000613d9784828501613d5e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dda82613022565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e0d57613e0c613da0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e5282613022565b9150613e5d83613022565b925082613e6d57613e6c613e18565b5b828204905092915050565b6000613e8382613022565b9150613e8e83613022565b925082821015613ea157613ea0613da0565b5b828203905092915050565b6000613eb782613022565b9150613ec283613022565b925082613ed257613ed1613e18565b5b828206905092915050565b6000613ee882613022565b9150613ef383613022565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f2857613f27613da0565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f6d82613022565b9150613f7883613022565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fb157613fb0613da0565b5b828202905092915050565b6000819050919050565b613fd7613fd2826131ca565b613fbc565b82525050565b6000613fe98285613fc6565b602082019150613ff98284613fc6565b602082019150819050939250505056fea264697066735822122014819f8d7962b526e6423dbcc2196ff3d29c2247c0d6ea34c5087c9a4ea3ac9864736f6c634300080b0033

Deployed Bytecode Sourcemap

59427:3365:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42869:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45479:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46982:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46545:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40106:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47839:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62033:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41692:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59565:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61529:186;;;;;;;;;;;;;:::i;:::-;;48080:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40679:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61931:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45288:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43305:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18149:103;;;;;;;;;;;;;:::i;:::-;;59667:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62295:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59751:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17498:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45648:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47258:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61828:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48336:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61723:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62462:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60153:1172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47608:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18407:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42869:372;42971:4;43023:25;43008:40;;;:11;:40;;;;:105;;;;43080:33;43065:48;;;:11;:48;;;;43008:105;:172;;;;43145:35;43130:50;;;:11;:50;;;;43008:172;:225;;;;43197:36;43221:11;43197:23;:36::i;:::-;43008:225;42988:245;;42869:372;;;:::o;45479:100::-;45533:13;45566:5;45559:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45479:100;:::o;46982:204::-;47050:7;47075:16;47083:7;47075;:16::i;:::-;47070:64;;47100:34;;;;;;;;;;;;;;47070:64;47154:15;:24;47170:7;47154:24;;;;;;;;;;;;;;;;;;;;;47147:31;;46982:204;;;:::o;46545:371::-;46618:13;46634:24;46650:7;46634:15;:24::i;:::-;46618:40;;46679:5;46673:11;;:2;:11;;;46669:48;;;46693:24;;;;;;;;;;;;;;46669:48;46750:5;46734:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;46760:37;46777:5;46784:12;:10;:12::i;:::-;46760:16;:37::i;:::-;46759:38;46734:63;46730:138;;;46821:35;;;;;;;;;;;;;;46730:138;46880:28;46889:2;46893:7;46902:5;46880:8;:28::i;:::-;46607:309;46545:371;;:::o;40106:280::-;40159:7;40351:12;;;;;;;;;;;40335:13;;;;;;;;;;:28;40328:35;;;;40106:280;:::o;47839:170::-;47973:28;47983:4;47989:2;47993:7;47973:9;:28::i;:::-;47839:170;;;:::o;62033:110::-;17729:12;:10;:12::i;:::-;17718:23;;:7;:5;:7::i;:::-;:23;;;17710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62130:5:::1;62109:18;:26;;;;62033:110:::0;:::o;41692:1105::-;41781:7;41814:16;41824:5;41814:9;:16::i;:::-;41805:5;:25;41801:61;;41839:23;;;;;;;;;;;;;;41801:61;41873:22;41898:13;;;;;;;;;;;41873:38;;;;41922:19;41952:25;42153:9;42148:557;42168:14;42164:1;:18;42148:557;;;42208:31;42242:11;:14;42254:1;42242:14;;;;;;;;;;;42208:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42279:9;:16;;;42275:73;;;42320:8;;;42275:73;42396:1;42370:28;;:9;:14;;;:28;;;42366:111;;42443:9;:14;;;42423:34;;42366:111;42520:5;42499:26;;:17;:26;;;42495:195;;;42569:5;42554:11;:20;42550:85;;;42610:1;42603:8;;;;;;;;;42550:85;42657:13;;;;;;;42495:195;42189:516;42148:557;42184:3;;;;;;;42148:557;;;;42781:8;;;41692:1105;;;;;:::o;59565:41::-;59602:4;59565:41;:::o;61529:186::-;17729:12;:10;:12::i;:::-;17718:23;;:7;:5;:7::i;:::-;:23;;;17710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12472:1:::1;13070:7;;:19;;13062:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12472:1;13203:7;:18;;;;61593:12:::2;61611:10;:15;;61634:21;61611:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61592:68;;;61679:7;61671:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;61581:134;12428:1:::1;13382:7;:22;;;;61529:186::o:0;48080:185::-;48218:39;48235:4;48241:2;48245:7;48218:39;;;;;;;;;;;;:16;:39::i;:::-;48080:185;;;:::o;40679:713::-;40746:7;40766:22;40791:13;;;;;;;;;;40766:38;;;;40815:19;41010:9;41005:328;41025:14;41021:1;:18;41005:328;;;41065:31;41099:11;:14;41111:1;41099:14;;;;;;;;;;;41065:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41137:9;:16;;;41132:186;;41197:5;41182:11;:20;41178:85;;;41238:1;41231:8;;;;;;;;41178:85;41285:13;;;;;;;41132:186;41046:287;41041:3;;;;;;;41005:328;;;;41361:23;;;;;;;;;;;;;;40679:713;;;;:::o;61931:94::-;17729:12;:10;:12::i;:::-;17718:23;;:7;:5;:7::i;:::-;:23;;;17710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62013:4:::1;;62003:7;:14;;;;;;;:::i;:::-;;61931:94:::0;;:::o;45288:124::-;45352:7;45379:20;45391:7;45379:11;:20::i;:::-;:25;;;45372:32;;45288:124;;;:::o;43305:206::-;43369:7;43410:1;43393:19;;:5;:19;;;43389:60;;;43421:28;;;;;;;;;;;;;;43389:60;43475:12;:19;43488:5;43475:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;43467:36;;43460:43;;43305:206;;;:::o;18149:103::-;17729:12;:10;:12::i;:::-;17718:23;;:7;:5;:7::i;:::-;:23;;;17710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18214:30:::1;18241:1;18214:18;:30::i;:::-;18149:103::o:0;59667:49::-;59707:9;59667:49;:::o;62295:96::-;62346:4;62370:13;;;;;;;;;;;62363:20;;62295:96;:::o;59751:102::-;;;;:::o;17498:87::-;17544:7;17571:6;;;;;;;;;;;17564:13;;17498:87;:::o;45648:104::-;45704:13;45737:7;45730:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45648:104;:::o;47258:279::-;47361:12;:10;:12::i;:::-;47349:24;;:8;:24;;;47345:54;;;47382:17;;;;;;;;;;;;;;47345:54;47457:8;47412:18;:32;47431:12;:10;:12::i;:::-;47412:32;;;;;;;;;;;;;;;:42;47445:8;47412:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;47510:8;47481:48;;47496:12;:10;:12::i;:::-;47481:48;;;47520:8;47481:48;;;;;;:::i;:::-;;;;;;;;47258:279;;:::o;61828:95::-;17729:12;:10;:12::i;:::-;17718:23;;:7;:5;:7::i;:::-;:23;;;17710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61906:9:::1;61895:8;;:20;;;;;;;;;;;;;;;;;;61828:95:::0;:::o;48336:342::-;48503:28;48513:4;48519:2;48523:7;48503:9;:28::i;:::-;48547:48;48570:4;48576:2;48580:7;48589:5;48547:22;:48::i;:::-;48542:129;;48619:40;;;;;;;;;;;;;;48542:129;48336:342;;;;:::o;61723:97::-;17729:12;:10;:12::i;:::-;17718:23;;:7;:5;:7::i;:::-;:23;;;17710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61804:8:::1;61788:13;;:24;;;;;;;;;;;;;;;;;;61723:97:::0;:::o;62462:327::-;62535:13;62566:16;62574:7;62566;:16::i;:::-;62561:59;;62591:29;;;;;;;;;;;;;;62561:59;62633:21;62657:10;:8;:10::i;:::-;62633:34;;62710:1;62691:7;62685:21;:26;;:96;;;;;;;;;;;;;;;;;62738:7;62747:18;:7;:16;:18::i;:::-;62721:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62685:96;62678:103;;;62462:327;;;:::o;60153:1172::-;12472:1;13070:7;;:19;;13062:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12472:1;13203:7;:18;;;;61419:10:::1;61406:23;;:9;:23;;;61398:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;60332:8:::2;;;;;;;;;;;60324:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;60425:18;60446:42;60459:13;59707:9;60446:12;:42::i;:::-;60425:63;;60520:10;60507:9;:23;;60499:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60673:1;60657:13;:17;60649:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60792:23;60818:42;60831:13;:11;:13::i;:::-;60846;60818:12;:42::i;:::-;60792:68;;59602:4;60879:15;:29;;60871:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;61029:13;;;;;;;;;;;61025:216;;;61059:12;61101:10;61084:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;61074:39;;;;;;61059:54;;61136:57;61155:11;;61136:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61168:18;;61188:4;61136:18;:57::i;:::-;61128:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;61044:197;61025:216;61281:36;61291:10;61303:13;61281:9;:36::i;:::-;60279:1046;;12428:1:::0;13382:7;:22;;;;60153:1172;;;:::o;47608:164::-;47705:4;47729:18;:25;47748:5;47729:25;;;;;;;;;;;;;;;:35;47755:8;47729:35;;;;;;;;;;;;;;;;;;;;;;;;;47722:42;;47608:164;;;;:::o;18407:201::-;17729:12;:10;:12::i;:::-;17718:23;;:7;:5;:7::i;:::-;:23;;;17710:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18516:1:::1;18496:22;;:8;:22;;;;18488:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18572:28;18591:8;18572:18;:28::i;:::-;18407:201:::0;:::o;29930:157::-;30015:4;30054:25;30039:40;;;:11;:40;;;;30032:47;;29930:157;;;:::o;48933:144::-;48990:4;49024:13;;;;;;;;;;;49014:23;;:7;:23;:55;;;;;49042:11;:20;49054:7;49042:20;;;;;;;;;;;:27;;;;;;;;;;;;49041:28;49014:55;49007:62;;48933:144;;;:::o;16222:98::-;16275:7;16302:10;16295:17;;16222:98;:::o;56149:196::-;56291:2;56264:15;:24;56280:7;56264:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56329:7;56325:2;56309:28;;56318:5;56309:28;;;;;;;;;;;;56149:196;;;:::o;51650:2112::-;51765:35;51803:20;51815:7;51803:11;:20::i;:::-;51765:58;;51836:22;51878:13;:18;;;51862:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;51913:50;51930:13;:18;;;51950:12;:10;:12::i;:::-;51913:16;:50::i;:::-;51862:101;:154;;;;52004:12;:10;:12::i;:::-;51980:36;;:20;51992:7;51980:11;:20::i;:::-;:36;;;51862:154;51836:181;;52035:17;52030:66;;52061:35;;;;;;;;;;;;;;52030:66;52133:4;52111:26;;:13;:18;;;:26;;;52107:67;;52146:28;;;;;;;;;;;;;;52107:67;52203:1;52189:16;;:2;:16;;;52185:52;;;52214:23;;;;;;;;;;;;;;52185:52;52250:43;52272:4;52278:2;52282:7;52291:1;52250:21;:43::i;:::-;52358:49;52375:1;52379:7;52388:13;:18;;;52358:8;:49::i;:::-;52733:1;52703:12;:18;52716:4;52703:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52777:1;52749:12;:16;52762:2;52749:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52823:2;52795:11;:20;52807:7;52795:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;52885:15;52840:11;:20;52852:7;52840:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;53153:19;53185:1;53175:7;:11;53153:33;;53246:1;53205:43;;:11;:24;53217:11;53205:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;53201:445;;;53430:13;;;;;;;;;;53416:27;;:11;:27;53412:219;;;53500:13;:18;;;53468:11;:24;53480:11;53468:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;53583:13;:28;;;53541:11;:24;53553:11;53541:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;53412:219;53201:445;52678:979;53693:7;53689:2;53674:27;;53683:4;53674:27;;;;;;;;;;;;53712:42;53733:4;53739:2;53743:7;53752:1;53712:20;:42::i;:::-;51754:2008;;51650:2112;;;:::o;44143:1083::-;44204:21;;:::i;:::-;44238:12;44253:7;44238:22;;44309:13;;;;;;;;;;44302:20;;:4;:20;44298:861;;;44343:31;44377:11;:17;44389:4;44377:17;;;;;;;;;;;44343:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44418:9;:16;;;44413:731;;44489:1;44463:28;;:9;:14;;;:28;;;44459:101;;44527:9;44520:16;;;;;;44459:101;44864:261;44871:4;44864:261;;;44904:6;;;;;;;;44949:11;:17;44961:4;44949:17;;;;;;;;;;;44937:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45023:1;44997:28;;:9;:14;;;:28;;;44993:109;;45065:9;45058:16;;;;;;44993:109;44864:261;;;44413:731;44324:835;44298:861;45187:31;;;;;;;;;;;;;;44143:1083;;;;:::o;18768:191::-;18842:16;18861:6;;;;;;;;;;;18842:25;;18887:8;18878:6;;:17;;;;;;;;;;;;;;;;;;18942:8;18911:40;;18932:8;18911:40;;;;;;;;;;;;18831:128;18768:191;:::o;56910:790::-;57065:4;57086:15;:2;:13;;;:15::i;:::-;57082:611;;;57138:2;57122:36;;;57159:12;:10;:12::i;:::-;57173:4;57179:7;57188:5;57122:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57118:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57385:1;57368:6;:13;:18;57364:259;;;57418:40;;;;;;;;;;;;;;57364:259;57573:6;57567:13;57558:6;57554:2;57550:15;57543:38;57118:520;57255:45;;;57245:55;;;:6;:55;;;;57238:62;;;;;57082:611;57677:4;57670:11;;56910:790;;;;;;;:::o;62187:100::-;62239:13;62272:7;62265:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62187:100;:::o;13784:723::-;13840:13;14070:1;14061:5;:10;14057:53;;;14088:10;;;;;;;;;;;;;;;;;;;;;14057:53;14120:12;14135:5;14120:20;;14151:14;14176:78;14191:1;14183:4;:9;14176:78;;14209:8;;;;;:::i;:::-;;;;14240:2;14232:10;;;;;:::i;:::-;;;14176:78;;;14264:19;14296:6;14286:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14264:39;;14314:154;14330:1;14321:5;:10;14314:154;;14358:1;14348:11;;;;;:::i;:::-;;;14425:2;14417:5;:10;;;;:::i;:::-;14404:2;:24;;;;:::i;:::-;14391:39;;14374:6;14381;14374:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;14454:2;14445:11;;;;;:::i;:::-;;;14314:154;;;14492:6;14478:21;;;;;13784:723;;;;:::o;5768:98::-;5826:7;5857:1;5853;:5;;;;:::i;:::-;5846:12;;5768:98;;;;:::o;5030:::-;5088:7;5119:1;5115;:5;;;;:::i;:::-;5108:12;;5030:98;;;;:::o;908:190::-;1033:4;1086;1057:25;1070:5;1077:4;1057:12;:25::i;:::-;:33;1050:40;;908:190;;;;;:::o;49085:104::-;49154:27;49164:2;49168:8;49154:27;;;;;;;;;;;;:9;:27::i;:::-;49085:104;;:::o;58348:159::-;;;;;:::o;59166:158::-;;;;;:::o;19786:387::-;19846:4;20054:12;20121:7;20109:20;20101:28;;20164:1;20157:4;:8;20150:15;;;19786:387;;;:::o;1460:701::-;1543:7;1563:20;1586:4;1563:27;;1606:9;1601:523;1625:5;:12;1621:1;:16;1601:523;;;1659:20;1682:5;1688:1;1682:8;;;;;;;;:::i;:::-;;;;;;;;1659:31;;1725:12;1709;:28;1705:408;;1879:12;1893;1862:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1852:55;;;;;;1837:70;;1705:408;;;2069:12;2083;2052:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2042:55;;;;;;2027:70;;1705:408;1644:480;1639:3;;;;;:::i;:::-;;;;1601:523;;;;2141:12;2134:19;;;1460:701;;;;:::o;49552:163::-;49675:32;49681:2;49685:8;49695:5;49702:4;49675:5;:32::i;:::-;49552:163;;;:::o;49974:1422::-;50113:20;50136:13;;;;;;;;;;;50113:36;;;;50178:1;50164:16;;:2;:16;;;50160:48;;;50189:19;;;;;;;;;;;;;;50160:48;50235:1;50223:8;:13;50219:44;;;50245:18;;;;;;;;;;;;;;50219:44;50276:61;50306:1;50310:2;50314:12;50328:8;50276:21;:61::i;:::-;50650:8;50615:12;:16;50628:2;50615:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50714:8;50674:12;:16;50687:2;50674:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50773:2;50740:11;:25;50752:12;50740:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;50840:15;50790:11;:25;50802:12;50790:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;50873:20;50896:12;50873:35;;50930:9;50925:328;50945:8;50941:1;:12;50925:328;;;51009:12;51005:2;50984:38;;51001:1;50984:38;;;;;;;;;;;;51045:4;:68;;;;;51054:59;51085:1;51089:2;51093:12;51107:5;51054:22;:59::i;:::-;51053:60;51045:68;51041:164;;;51145:40;;;;;;;;;;;;;;51041:164;51223:14;;;;;;;50955:3;;;;;;;50925:328;;;;51293:12;51269:13;;:37;;;;;;;;;;;;;;;;;;50590:728;51328:60;51357:1;51361:2;51365:12;51379:8;51328:20;:60::i;:::-;50102:1294;49974:1422;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:122::-;6071:24;6089:5;6071:24;:::i;:::-;6064:5;6061:35;6051:63;;6110:1;6107;6100:12;6051:63;5998:122;:::o;6126:139::-;6172:5;6210:6;6197:20;6188:29;;6226:33;6253:5;6226:33;:::i;:::-;6126:139;;;;:::o;6271:329::-;6330:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:119;;;6385:79;;:::i;:::-;6347:119;6505:1;6530:53;6575:7;6566:6;6555:9;6551:22;6530:53;:::i;:::-;6520:63;;6476:117;6271:329;;;;:::o;6606:117::-;6715:1;6712;6705:12;6729:117;6838:1;6835;6828:12;6852:117;6961:1;6958;6951:12;6989:553;7047:8;7057:6;7107:3;7100:4;7092:6;7088:17;7084:27;7074:122;;7115:79;;:::i;:::-;7074:122;7228:6;7215:20;7205:30;;7258:18;7250:6;7247:30;7244:117;;;7280:79;;:::i;:::-;7244:117;7394:4;7386:6;7382:17;7370:29;;7448:3;7440:4;7432:6;7428:17;7418:8;7414:32;7411:41;7408:128;;;7455:79;;:::i;:::-;7408:128;6989:553;;;;;:::o;7548:529::-;7619:6;7627;7676:2;7664:9;7655:7;7651:23;7647:32;7644:119;;;7682:79;;:::i;:::-;7644:119;7830:1;7819:9;7815:17;7802:31;7860:18;7852:6;7849:30;7846:117;;;7882:79;;:::i;:::-;7846:117;7995:65;8052:7;8043:6;8032:9;8028:22;7995:65;:::i;:::-;7977:83;;;;7773:297;7548:529;;;;;:::o;8083:329::-;8142:6;8191:2;8179:9;8170:7;8166:23;8162:32;8159:119;;;8197:79;;:::i;:::-;8159:119;8317:1;8342:53;8387:7;8378:6;8367:9;8363:22;8342:53;:::i;:::-;8332:63;;8288:117;8083:329;;;;:::o;8418:118::-;8505:24;8523:5;8505:24;:::i;:::-;8500:3;8493:37;8418:118;;:::o;8542:222::-;8635:4;8673:2;8662:9;8658:18;8650:26;;8686:71;8754:1;8743:9;8739:17;8730:6;8686:71;:::i;:::-;8542:222;;;;:::o;8770:116::-;8840:21;8855:5;8840:21;:::i;:::-;8833:5;8830:32;8820:60;;8876:1;8873;8866:12;8820:60;8770:116;:::o;8892:133::-;8935:5;8973:6;8960:20;8951:29;;8989:30;9013:5;8989:30;:::i;:::-;8892:133;;;;:::o;9031:468::-;9096:6;9104;9153:2;9141:9;9132:7;9128:23;9124:32;9121:119;;;9159:79;;:::i;:::-;9121:119;9279:1;9304:53;9349:7;9340:6;9329:9;9325:22;9304:53;:::i;:::-;9294:63;;9250:117;9406:2;9432:50;9474:7;9465:6;9454:9;9450:22;9432:50;:::i;:::-;9422:60;;9377:115;9031:468;;;;;:::o;9505:323::-;9561:6;9610:2;9598:9;9589:7;9585:23;9581:32;9578:119;;;9616:79;;:::i;:::-;9578:119;9736:1;9761:50;9803:7;9794:6;9783:9;9779:22;9761:50;:::i;:::-;9751:60;;9707:114;9505:323;;;;:::o;9834:117::-;9943:1;9940;9933:12;9957:180;10005:77;10002:1;9995:88;10102:4;10099:1;10092:15;10126:4;10123:1;10116:15;10143:281;10226:27;10248:4;10226:27;:::i;:::-;10218:6;10214:40;10356:6;10344:10;10341:22;10320:18;10308:10;10305:34;10302:62;10299:88;;;10367:18;;:::i;:::-;10299:88;10407:10;10403:2;10396:22;10186:238;10143:281;;:::o;10430:129::-;10464:6;10491:20;;:::i;:::-;10481:30;;10520:33;10548:4;10540:6;10520:33;:::i;:::-;10430:129;;;:::o;10565:307::-;10626:4;10716:18;10708:6;10705:30;10702:56;;;10738:18;;:::i;:::-;10702:56;10776:29;10798:6;10776:29;:::i;:::-;10768:37;;10860:4;10854;10850:15;10842:23;;10565:307;;;:::o;10878:154::-;10962:6;10957:3;10952;10939:30;11024:1;11015:6;11010:3;11006:16;10999:27;10878:154;;;:::o;11038:410::-;11115:5;11140:65;11156:48;11197:6;11156:48;:::i;:::-;11140:65;:::i;:::-;11131:74;;11228:6;11221:5;11214:21;11266:4;11259:5;11255:16;11304:3;11295:6;11290:3;11286:16;11283:25;11280:112;;;11311:79;;:::i;:::-;11280:112;11401:41;11435:6;11430:3;11425;11401:41;:::i;:::-;11121:327;11038:410;;;;;:::o;11467:338::-;11522:5;11571:3;11564:4;11556:6;11552:17;11548:27;11538:122;;11579:79;;:::i;:::-;11538:122;11696:6;11683:20;11721:78;11795:3;11787:6;11780:4;11772:6;11768:17;11721:78;:::i;:::-;11712:87;;11528:277;11467:338;;;;:::o;11811:943::-;11906:6;11914;11922;11930;11979:3;11967:9;11958:7;11954:23;11950:33;11947:120;;;11986:79;;:::i;:::-;11947:120;12106:1;12131:53;12176:7;12167:6;12156:9;12152:22;12131:53;:::i;:::-;12121:63;;12077:117;12233:2;12259:53;12304:7;12295:6;12284:9;12280:22;12259:53;:::i;:::-;12249:63;;12204:118;12361:2;12387:53;12432:7;12423:6;12412:9;12408:22;12387:53;:::i;:::-;12377:63;;12332:118;12517:2;12506:9;12502:18;12489:32;12548:18;12540:6;12537:30;12534:117;;;12570:79;;:::i;:::-;12534:117;12675:62;12729:7;12720:6;12709:9;12705:22;12675:62;:::i;:::-;12665:72;;12460:287;11811:943;;;;;;;:::o;12777:568::-;12850:8;12860:6;12910:3;12903:4;12895:6;12891:17;12887:27;12877:122;;12918:79;;:::i;:::-;12877:122;13031:6;13018:20;13008:30;;13061:18;13053:6;13050:30;13047:117;;;13083:79;;:::i;:::-;13047:117;13197:4;13189:6;13185:17;13173:29;;13251:3;13243:4;13235:6;13231:17;13221:8;13217:32;13214:41;13211:128;;;13258:79;;:::i;:::-;13211:128;12777:568;;;;;:::o;13351:704::-;13446:6;13454;13462;13511:2;13499:9;13490:7;13486:23;13482:32;13479:119;;;13517:79;;:::i;:::-;13479:119;13637:1;13662:53;13707:7;13698:6;13687:9;13683:22;13662:53;:::i;:::-;13652:63;;13608:117;13792:2;13781:9;13777:18;13764:32;13823:18;13815:6;13812:30;13809:117;;;13845:79;;:::i;:::-;13809:117;13958:80;14030:7;14021:6;14010:9;14006:22;13958:80;:::i;:::-;13940:98;;;;13735:313;13351:704;;;;;:::o;14061:474::-;14129:6;14137;14186:2;14174:9;14165:7;14161:23;14157:32;14154:119;;;14192:79;;:::i;:::-;14154:119;14312:1;14337:53;14382:7;14373:6;14362:9;14358:22;14337:53;:::i;:::-;14327:63;;14283:117;14439:2;14465:53;14510:7;14501:6;14490:9;14486:22;14465:53;:::i;:::-;14455:63;;14410:118;14061:474;;;;;:::o;14541:180::-;14589:77;14586:1;14579:88;14686:4;14683:1;14676:15;14710:4;14707:1;14700:15;14727:320;14771:6;14808:1;14802:4;14798:12;14788:22;;14855:1;14849:4;14845:12;14876:18;14866:81;;14932:4;14924:6;14920:17;14910:27;;14866:81;14994:2;14986:6;14983:14;14963:18;14960:38;14957:84;;;15013:18;;:::i;:::-;14957:84;14778:269;14727:320;;;:::o;15053:182::-;15193:34;15189:1;15181:6;15177:14;15170:58;15053:182;:::o;15241:366::-;15383:3;15404:67;15468:2;15463:3;15404:67;:::i;:::-;15397:74;;15480:93;15569:3;15480:93;:::i;:::-;15598:2;15593:3;15589:12;15582:19;;15241:366;;;:::o;15613:419::-;15779:4;15817:2;15806:9;15802:18;15794:26;;15866:9;15860:4;15856:20;15852:1;15841:9;15837:17;15830:47;15894:131;16020:4;15894:131;:::i;:::-;15886:139;;15613:419;;;:::o;16038:181::-;16178:33;16174:1;16166:6;16162:14;16155:57;16038:181;:::o;16225:366::-;16367:3;16388:67;16452:2;16447:3;16388:67;:::i;:::-;16381:74;;16464:93;16553:3;16464:93;:::i;:::-;16582:2;16577:3;16573:12;16566:19;;16225:366;;;:::o;16597:419::-;16763:4;16801:2;16790:9;16786:18;16778:26;;16850:9;16844:4;16840:20;16836:1;16825:9;16821:17;16814:47;16878:131;17004:4;16878:131;:::i;:::-;16870:139;;16597:419;;;:::o;17022:147::-;17123:11;17160:3;17145:18;;17022:147;;;;:::o;17175:114::-;;:::o;17295:398::-;17454:3;17475:83;17556:1;17551:3;17475:83;:::i;:::-;17468:90;;17567:93;17656:3;17567:93;:::i;:::-;17685:1;17680:3;17676:11;17669:18;;17295:398;;;:::o;17699:379::-;17883:3;17905:147;18048:3;17905:147;:::i;:::-;17898:154;;18069:3;18062:10;;17699:379;;;:::o;18084:166::-;18224:18;18220:1;18212:6;18208:14;18201:42;18084:166;:::o;18256:366::-;18398:3;18419:67;18483:2;18478:3;18419:67;:::i;:::-;18412:74;;18495:93;18584:3;18495:93;:::i;:::-;18613:2;18608:3;18604:12;18597:19;;18256:366;;;:::o;18628:419::-;18794:4;18832:2;18821:9;18817:18;18809:26;;18881:9;18875:4;18871:20;18867:1;18856:9;18852:17;18845:47;18909:131;19035:4;18909:131;:::i;:::-;18901:139;;18628:419;;;:::o;19053:148::-;19155:11;19192:3;19177:18;;19053:148;;;;:::o;19207:377::-;19313:3;19341:39;19374:5;19341:39;:::i;:::-;19396:89;19478:6;19473:3;19396:89;:::i;:::-;19389:96;;19494:52;19539:6;19534:3;19527:4;19520:5;19516:16;19494:52;:::i;:::-;19571:6;19566:3;19562:16;19555:23;;19317:267;19207:377;;;;:::o;19590:155::-;19730:7;19726:1;19718:6;19714:14;19707:31;19590:155;:::o;19751:400::-;19911:3;19932:84;20014:1;20009:3;19932:84;:::i;:::-;19925:91;;20025:93;20114:3;20025:93;:::i;:::-;20143:1;20138:3;20134:11;20127:18;;19751:400;;;:::o;20157:701::-;20438:3;20460:95;20551:3;20542:6;20460:95;:::i;:::-;20453:102;;20572:95;20663:3;20654:6;20572:95;:::i;:::-;20565:102;;20684:148;20828:3;20684:148;:::i;:::-;20677:155;;20849:3;20842:10;;20157:701;;;;;:::o;20864:178::-;21004:30;21000:1;20992:6;20988:14;20981:54;20864:178;:::o;21048:366::-;21190:3;21211:67;21275:2;21270:3;21211:67;:::i;:::-;21204:74;;21287:93;21376:3;21287:93;:::i;:::-;21405:2;21400:3;21396:12;21389:19;;21048:366;;;:::o;21420:419::-;21586:4;21624:2;21613:9;21609:18;21601:26;;21673:9;21667:4;21663:20;21659:1;21648:9;21644:17;21637:47;21701:131;21827:4;21701:131;:::i;:::-;21693:139;;21420:419;;;:::o;21845:174::-;21985:26;21981:1;21973:6;21969:14;21962:50;21845:174;:::o;22025:366::-;22167:3;22188:67;22252:2;22247:3;22188:67;:::i;:::-;22181:74;;22264:93;22353:3;22264:93;:::i;:::-;22382:2;22377:3;22373:12;22366:19;;22025:366;;;:::o;22397:419::-;22563:4;22601:2;22590:9;22586:18;22578:26;;22650:9;22644:4;22640:20;22636:1;22625:9;22621:17;22614:47;22678:131;22804:4;22678:131;:::i;:::-;22670:139;;22397:419;;;:::o;22822:181::-;22962:33;22958:1;22950:6;22946:14;22939:57;22822:181;:::o;23009:366::-;23151:3;23172:67;23236:2;23231:3;23172:67;:::i;:::-;23165:74;;23248:93;23337:3;23248:93;:::i;:::-;23366:2;23361:3;23357:12;23350:19;;23009:366;;;:::o;23381:419::-;23547:4;23585:2;23574:9;23570:18;23562:26;;23634:9;23628:4;23624:20;23620:1;23609:9;23605:17;23598:47;23662:131;23788:4;23662:131;:::i;:::-;23654:139;;23381:419;;;:::o;23806:224::-;23946:34;23942:1;23934:6;23930:14;23923:58;24015:7;24010:2;24002:6;23998:15;23991:32;23806:224;:::o;24036:366::-;24178:3;24199:67;24263:2;24258:3;24199:67;:::i;:::-;24192:74;;24275:93;24364:3;24275:93;:::i;:::-;24393:2;24388:3;24384:12;24377:19;;24036:366;;;:::o;24408:419::-;24574:4;24612:2;24601:9;24597:18;24589:26;;24661:9;24655:4;24651:20;24647:1;24636:9;24632:17;24625:47;24689:131;24815:4;24689:131;:::i;:::-;24681:139;;24408:419;;;:::o;24833:182::-;24973:34;24969:1;24961:6;24957:14;24950:58;24833:182;:::o;25021:366::-;25163:3;25184:67;25248:2;25243:3;25184:67;:::i;:::-;25177:74;;25260:93;25349:3;25260:93;:::i;:::-;25378:2;25373:3;25369:12;25362:19;;25021:366;;;:::o;25393:419::-;25559:4;25597:2;25586:9;25582:18;25574:26;;25646:9;25640:4;25636:20;25632:1;25621:9;25617:17;25610:47;25674:131;25800:4;25674:131;:::i;:::-;25666:139;;25393:419;;;:::o;25818:94::-;25851:8;25899:5;25895:2;25891:14;25870:35;;25818:94;;;:::o;25918:::-;25957:7;25986:20;26000:5;25986:20;:::i;:::-;25975:31;;25918:94;;;:::o;26018:100::-;26057:7;26086:26;26106:5;26086:26;:::i;:::-;26075:37;;26018:100;;;:::o;26124:157::-;26229:45;26249:24;26267:5;26249:24;:::i;:::-;26229:45;:::i;:::-;26224:3;26217:58;26124:157;;:::o;26287:256::-;26399:3;26414:75;26485:3;26476:6;26414:75;:::i;:::-;26514:2;26509:3;26505:12;26498:19;;26534:3;26527:10;;26287:256;;;;:::o;26549:181::-;26689:33;26685:1;26677:6;26673:14;26666:57;26549:181;:::o;26736:366::-;26878:3;26899:67;26963:2;26958:3;26899:67;:::i;:::-;26892:74;;26975:93;27064:3;26975:93;:::i;:::-;27093:2;27088:3;27084:12;27077:19;;26736:366;;;:::o;27108:419::-;27274:4;27312:2;27301:9;27297:18;27289:26;;27361:9;27355:4;27351:20;27347:1;27336:9;27332:17;27325:47;27389:131;27515:4;27389:131;:::i;:::-;27381:139;;27108:419;;;:::o;27533:225::-;27673:34;27669:1;27661:6;27657:14;27650:58;27742:8;27737:2;27729:6;27725:15;27718:33;27533:225;:::o;27764:366::-;27906:3;27927:67;27991:2;27986:3;27927:67;:::i;:::-;27920:74;;28003:93;28092:3;28003:93;:::i;:::-;28121:2;28116:3;28112:12;28105:19;;27764:366;;;:::o;28136:419::-;28302:4;28340:2;28329:9;28325:18;28317:26;;28389:9;28383:4;28379:20;28375:1;28364:9;28360:17;28353:47;28417:131;28543:4;28417:131;:::i;:::-;28409:139;;28136:419;;;:::o;28561:98::-;28612:6;28646:5;28640:12;28630:22;;28561:98;;;:::o;28665:168::-;28748:11;28782:6;28777:3;28770:19;28822:4;28817:3;28813:14;28798:29;;28665:168;;;;:::o;28839:360::-;28925:3;28953:38;28985:5;28953:38;:::i;:::-;29007:70;29070:6;29065:3;29007:70;:::i;:::-;29000:77;;29086:52;29131:6;29126:3;29119:4;29112:5;29108:16;29086:52;:::i;:::-;29163:29;29185:6;29163:29;:::i;:::-;29158:3;29154:39;29147:46;;28929:270;28839:360;;;;:::o;29205:640::-;29400:4;29438:3;29427:9;29423:19;29415:27;;29452:71;29520:1;29509:9;29505:17;29496:6;29452:71;:::i;:::-;29533:72;29601:2;29590:9;29586:18;29577:6;29533:72;:::i;:::-;29615;29683:2;29672:9;29668:18;29659:6;29615:72;:::i;:::-;29734:9;29728:4;29724:20;29719:2;29708:9;29704:18;29697:48;29762:76;29833:4;29824:6;29762:76;:::i;:::-;29754:84;;29205:640;;;;;;;:::o;29851:141::-;29907:5;29938:6;29932:13;29923:22;;29954:32;29980:5;29954:32;:::i;:::-;29851:141;;;;:::o;29998:349::-;30067:6;30116:2;30104:9;30095:7;30091:23;30087:32;30084:119;;;30122:79;;:::i;:::-;30084:119;30242:1;30267:63;30322:7;30313:6;30302:9;30298:22;30267:63;:::i;:::-;30257:73;;30213:127;29998:349;;;;:::o;30353:180::-;30401:77;30398:1;30391:88;30498:4;30495:1;30488:15;30522:4;30519:1;30512:15;30539:233;30578:3;30601:24;30619:5;30601:24;:::i;:::-;30592:33;;30647:66;30640:5;30637:77;30634:103;;;30717:18;;:::i;:::-;30634:103;30764:1;30757:5;30753:13;30746:20;;30539:233;;;:::o;30778:180::-;30826:77;30823:1;30816:88;30923:4;30920:1;30913:15;30947:4;30944:1;30937:15;30964:185;31004:1;31021:20;31039:1;31021:20;:::i;:::-;31016:25;;31055:20;31073:1;31055:20;:::i;:::-;31050:25;;31094:1;31084:35;;31099:18;;:::i;:::-;31084:35;31141:1;31138;31134:9;31129:14;;30964:185;;;;:::o;31155:191::-;31195:4;31215:20;31233:1;31215:20;:::i;:::-;31210:25;;31249:20;31267:1;31249:20;:::i;:::-;31244:25;;31288:1;31285;31282:8;31279:34;;;31293:18;;:::i;:::-;31279:34;31338:1;31335;31331:9;31323:17;;31155:191;;;;:::o;31352:176::-;31384:1;31401:20;31419:1;31401:20;:::i;:::-;31396:25;;31435:20;31453:1;31435:20;:::i;:::-;31430:25;;31474:1;31464:35;;31479:18;;:::i;:::-;31464:35;31520:1;31517;31513:9;31508:14;;31352:176;;;;:::o;31534:305::-;31574:3;31593:20;31611:1;31593:20;:::i;:::-;31588:25;;31627:20;31645:1;31627:20;:::i;:::-;31622:25;;31781:1;31713:66;31709:74;31706:1;31703:81;31700:107;;;31787:18;;:::i;:::-;31700:107;31831:1;31828;31824:9;31817:16;;31534:305;;;;:::o;31845:180::-;31893:77;31890:1;31883:88;31990:4;31987:1;31980:15;32014:4;32011:1;32004:15;32031:348;32071:7;32094:20;32112:1;32094:20;:::i;:::-;32089:25;;32128:20;32146:1;32128:20;:::i;:::-;32123:25;;32316:1;32248:66;32244:74;32241:1;32238:81;32233:1;32226:9;32219:17;32215:105;32212:131;;;32323:18;;:::i;:::-;32212:131;32371:1;32368;32364:9;32353:20;;32031:348;;;;:::o;32385:79::-;32424:7;32453:5;32442:16;;32385:79;;;:::o;32470:157::-;32575:45;32595:24;32613:5;32595:24;:::i;:::-;32575:45;:::i;:::-;32570:3;32563:58;32470:157;;:::o;32633:397::-;32773:3;32788:75;32859:3;32850:6;32788:75;:::i;:::-;32888:2;32883:3;32879:12;32872:19;;32901:75;32972:3;32963:6;32901:75;:::i;:::-;33001:2;32996:3;32992:12;32985:19;;33021:3;33014:10;;32633:397;;;;;:::o

Swarm Source

ipfs://14819f8d7962b526e6423dbcc2196ff3d29c2247c0d6ea34c5087c9a4ea3ac98
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.