ETH Price: $2,639.60 (+1.89%)

Token

Good Giraffes (GG)
 

Overview

Max Total Supply

415 GG

Holders

82

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 GG
0x7fbaff5ca7e7994bb5a6667fdd57575f64fcc653
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

3,333 Charity-Driven Giraffes on the Ethereum road of good in the Meadowverse. 25% of mint and OpenSea royalties benefit the Giraffe Conservation Foundation.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GoodGiraffes

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-21
*/

// 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/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// 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/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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    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;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

    // ==============================
    //        IERC721Metadata
    // ==============================

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

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 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**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

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

    /**
     * @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, _toString(tokenId))) : '';
    }

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

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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-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 {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(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
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) 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` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: contracts/GoodGiraffes.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.13;






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

    string public baseURI;

    uint256 public giraffePrice = 0.005 ether;
    uint256 public maxPerWalletWL = 2;
    uint256 public maxPerWallet = 10;
    uint256 public maxGiraffes = 3333;

    bool public claimed;
    bool public publicMinting;
    bool public whitelistMinting;

    bytes32 public merkleRoot;

    mapping (address => uint256) public addressBalance;

    /*=============================================
    =                 Constructor                 =
    =============================================*/ 

    constructor() ERC721A("Good Giraffes", "GG") {}

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    /*=============================================
    =               Minting Methods               =
    =============================================*/  

    function mint(uint256 quantity) external payable nonReentrant callerIsUser {
        require(publicMinting,                                                      "GOOD GIRAFFES PUBLIC MINT NOT ACTIVE");
        require(quantity >= 1,                                                      "AT LEAST 1 GOOD GIRAFFE NEEDS TO BE MINTED");
        require(totalSupply() + quantity <= maxGiraffes,                            "MINTING THIS MANY WOULD EXCEED GOOD GIRAFFES SUPPLY");
        require(msg.value >= giraffePrice * quantity,                               "NOT ENOUGH ETH SENT");
        require(addressBalance[msg.sender] + quantity <= maxPerWallet,              "MAX GOOD GIRAFFES MINTED TO WALLET IS 10");
        addressBalance[msg.sender] = addressBalance[msg.sender] + quantity;
        _safeMint(msg.sender, quantity);
    }

    function whitelistMint(uint256 quantity, bytes32[] memory proof) external payable nonReentrant callerIsUser {
        require(!publicMinting,                                                     "GOOD GIRAFFES PUBLIC MINT IS ACTIVE");
        require(whitelistMinting,                                                   "GOOD GIRAFFES WHITELIST MINT NOT ACTIVE");
        require(quantity >= 1,                                                      "AT LEAST 1 GOOD GIRAFFE NEEDS TO BE MINTED");
        require(totalSupply() + quantity <= maxGiraffes,                            "MINTING THIS MANY WOULD EXCEED GOOD GIRAFFES SUPPLY");
        require(addressBalance[msg.sender] + quantity <= maxPerWalletWL,            "MAX GOOD GIRAFFES MINTED TO WALLET IS 2");
        require(isValid(proof, keccak256(abi.encodePacked(msg.sender))),            "NOT ON GOOD GIRAFFES ALLOWLIST");
        addressBalance[msg.sender] = addressBalance[msg.sender] + quantity;
        _safeMint(msg.sender, quantity);
    }

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

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { 
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
        
        return
        bytes(baseURI).length > 0
            ? string(abi.encodePacked(_baseURI(), tokenId.toString(), '.json'))
            : "";
    }
    
    /*=============================================
    =              Only Owner Methods             =
    =============================================*/   

    function claimReserve() external onlyOwner { 
        require(!claimed, "reserve already claimed");
        _safeMint(msg.sender, 33);
        claimed = true;
    }
    
    function setBaseURI(string calldata _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }

    function setMerkleRoot(bytes32 root) external onlyOwner { 
        merkleRoot = root;
    }

    function flipPublicMinting() external onlyOwner { 
        publicMinting = !publicMinting;
    }

    function flipWhitelistMinting() external onlyOwner { 
        whitelistMinting = !whitelistMinting;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giraffePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiraffes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526611c37937e08000600b556002600c55600a600d55610d05600e553480156200002c57600080fd5b506040518060400160405280600d81526020017f476f6f64204769726166666573000000000000000000000000000000000000008152506040518060400160405280600281526020017f47470000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000b1929190620001e4565b508060039080519060200190620000ca929190620001e4565b50620000db6200011160201b60201c565b600081905550505062000103620000f76200011660201b60201c565b6200011e60201b60201c565b6001600981905550620002f8565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f290620002c3565b90600052602060002090601f01602090048101928262000216576000855562000262565b82601f106200023157805160ff191683800117855562000262565b8280016001018555821562000262579182015b828111156200026157825182559160200191906001019062000244565b5b50905062000271919062000275565b5090565b5b808211156200029057600081600090555060010162000276565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002dc57607f821691505b602082108103620002f257620002f162000294565b5b50919050565b61405d80620003086000396000f3fe60806040526004361061020f5760003560e01c80636992d22911610118578063a22cb465116100a0578063d2cab0561161006f578063d2cab05614610746578063e834a83414610762578063e985e9c51461078d578063f030c526146107ca578063f2fde38b146107f55761020f565b8063a22cb4651461067a578063b88d4fde146106a3578063b8a20ed0146106cc578063c87b56dd146107095761020f565b8063715018a6116100e7578063715018a6146105c85780637cb64759146105df5780638da5cb5b1461060857806395d89b4114610633578063a0712d681461065e5761020f565b80636992d2291461050a5780636c0360eb146105355780636eb7c7a61461056057806370a082311461058b5761020f565b80632eb4a7ab1161019b57806342842e0e1161016a57806342842e0e14610425578063453c23101461044e57806353ac010a1461047957806355f804b3146104a45780636352211e146104cd5761020f565b80632eb4a7ab1461038f5780633ccfd60b146103ba5780633ec4de35146103d15780633fe5f0541461040e5761020f565b8063095ea7b3116101e2578063095ea7b3146102d057806318160ddd146102f95780631bb59fcb1461032457806323b872dd1461033b57806325ee97e3146103645761020f565b806301401cb31461021457806301ffc9a71461022b57806306fdde0314610268578063081812fc14610293575b600080fd5b34801561022057600080fd5b5061022961081e565b005b34801561023757600080fd5b50610252600480360381019061024d9190612b47565b6108c6565b60405161025f9190612b8f565b60405180910390f35b34801561027457600080fd5b5061027d610958565b60405161028a9190612c43565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190612c9b565b6109ea565b6040516102c79190612d09565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190612d50565b610a66565b005b34801561030557600080fd5b5061030e610ba7565b60405161031b9190612d9f565b60405180910390f35b34801561033057600080fd5b50610339610bbe565b005b34801561034757600080fd5b50610362600480360381019061035d9190612dba565b610c66565b005b34801561037057600080fd5b50610379610f88565b6040516103869190612d9f565b60405180910390f35b34801561039b57600080fd5b506103a4610f8e565b6040516103b19190612e26565b60405180910390f35b3480156103c657600080fd5b506103cf610f94565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190612e41565b6110bf565b6040516104059190612d9f565b60405180910390f35b34801561041a57600080fd5b506104236110d7565b005b34801561043157600080fd5b5061044c60048036038101906104479190612dba565b6111cb565b005b34801561045a57600080fd5b506104636111eb565b6040516104709190612d9f565b60405180910390f35b34801561048557600080fd5b5061048e6111f1565b60405161049b9190612b8f565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190612ed3565b611204565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190612c9b565b611296565b6040516105019190612d09565b60405180910390f35b34801561051657600080fd5b5061051f6112a8565b60405161052c9190612b8f565b60405180910390f35b34801561054157600080fd5b5061054a6112bb565b6040516105579190612c43565b60405180910390f35b34801561056c57600080fd5b50610575611349565b6040516105829190612d9f565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad9190612e41565b61134f565b6040516105bf9190612d9f565b60405180910390f35b3480156105d457600080fd5b506105dd611407565b005b3480156105eb57600080fd5b5061060660048036038101906106019190612f4c565b61148f565b005b34801561061457600080fd5b5061061d611515565b60405161062a9190612d09565b60405180910390f35b34801561063f57600080fd5b5061064861153f565b6040516106559190612c43565b60405180910390f35b61067860048036038101906106739190612c9b565b6115d1565b005b34801561068657600080fd5b506106a1600480360381019061069c9190612fa5565b6118f8565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613115565b611a6f565b005b3480156106d857600080fd5b506106f360048036038101906106ee919061325b565b611ae2565b6040516107009190612b8f565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190612c9b565b611af9565b60405161073d9190612c43565b60405180910390f35b610760600480360381019061075b91906132b7565b611ba7565b005b34801561076e57600080fd5b50610777611f3e565b6040516107849190612b8f565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613313565b611f51565b6040516107c19190612b8f565b60405180910390f35b3480156107d657600080fd5b506107df611fe5565b6040516107ec9190612d9f565b60405180910390f35b34801561080157600080fd5b5061081c60048036038101906108179190612e41565b611feb565b005b6108266120e2565b73ffffffffffffffffffffffffffffffffffffffff16610844611515565b73ffffffffffffffffffffffffffffffffffffffff161461089a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108919061339f565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109515750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610967906133ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610993906133ee565b80156109e05780601f106109b5576101008083540402835291602001916109e0565b820191906000526020600020905b8154815290600101906020018083116109c357829003601f168201915b5050505050905090565b60006109f5826120ea565b610a2b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7182611296565b90508073ffffffffffffffffffffffffffffffffffffffff16610a92612149565b73ffffffffffffffffffffffffffffffffffffffff1614610af557610abe81610ab9612149565b611f51565b610af4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bb1612151565b6001546000540303905090565b610bc66120e2565b73ffffffffffffffffffffffffffffffffffffffff16610be4611515565b73ffffffffffffffffffffffffffffffffffffffff1614610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c319061339f565b60405180910390fd5b600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b6000610c7182612156565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ce484612222565b91509150610cfa8187610cf5612149565b612244565b610d4657610d0f86610d0a612149565b611f51565b610d45576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610dac576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db98686866001612288565b8015610dc457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e9285610e6e88888761228e565b7c0200000000000000000000000000000000000000000000000000000000176122b6565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f185760006001850190506000600460008381526020019081526020016000205403610f16576000548114610f15578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f8086868660016122e1565b505050505050565b600c5481565b60105481565b610f9c6120e2565b73ffffffffffffffffffffffffffffffffffffffff16610fba611515565b73ffffffffffffffffffffffffffffffffffffffff1614611010576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110079061339f565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161103690613450565b60006040518083038185875af1925050503d8060008114611073576040519150601f19603f3d011682016040523d82523d6000602084013e611078565b606091505b50509050806110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b3906134b1565b60405180910390fd5b50565b60116020528060005260406000206000915090505481565b6110df6120e2565b73ffffffffffffffffffffffffffffffffffffffff166110fd611515565b73ffffffffffffffffffffffffffffffffffffffff1614611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a9061339f565b60405180910390fd5b600f60009054906101000a900460ff16156111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a9061351d565b60405180910390fd5b6111ae3360216122e7565b6001600f60006101000a81548160ff021916908315150217905550565b6111e683838360405180602001604052806000815250611a6f565b505050565b600d5481565b600f60019054906101000a900460ff1681565b61120c6120e2565b73ffffffffffffffffffffffffffffffffffffffff1661122a611515565b73ffffffffffffffffffffffffffffffffffffffff1614611280576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112779061339f565b60405180910390fd5b8181600a9190611291929190612a38565b505050565b60006112a182612156565b9050919050565b600f60029054906101000a900460ff1681565b600a80546112c8906133ee565b80601f01602080910402602001604051908101604052809291908181526020018280546112f4906133ee565b80156113415780601f1061131657610100808354040283529160200191611341565b820191906000526020600020905b81548152906001019060200180831161132457829003601f168201915b505050505081565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113b6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61140f6120e2565b73ffffffffffffffffffffffffffffffffffffffff1661142d611515565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a9061339f565b60405180910390fd5b61148d6000612305565b565b6114976120e2565b73ffffffffffffffffffffffffffffffffffffffff166114b5611515565b73ffffffffffffffffffffffffffffffffffffffff161461150b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115029061339f565b60405180910390fd5b8060108190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461154e906133ee565b80601f016020809104026020016040519081016040528092919081815260200182805461157a906133ee565b80156115c75780601f1061159c576101008083540402835291602001916115c7565b820191906000526020600020905b8154815290600101906020018083116115aa57829003601f168201915b5050505050905090565b600260095403611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90613589565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906135f5565b60405180910390fd5b600f60019054906101000a900460ff166116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290613687565b60405180910390fd5b600181101561171f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171690613719565b60405180910390fd5b600e548161172b610ba7565b6117359190613768565b1115611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90613830565b60405180910390fd5b80600b546117849190613850565b3410156117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd906138f6565b60405180910390fd5b600d5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118149190613768565b1115611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613988565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118a09190613768565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118ed33826122e7565b600160098190555050565b611900612149565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611964576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611971612149565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a1e612149565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a639190612b8f565b60405180910390a35050565b611a7a848484610c66565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611adc57611aa5848484846123cb565b611adb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6000611af1836010548461251b565b905092915050565b6060611b04826120ea565b611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90613a1a565b60405180910390fd5b6000600a8054611b52906133ee565b905011611b6e5760405180602001604052806000815250611ba0565b611b76612532565b611b7f836125c4565b604051602001611b90929190613ac2565b6040516020818303038152906040525b9050919050565b600260095403611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390613589565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c59906135f5565b60405180910390fd5b600f60019054906101000a900460ff1615611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca990613b63565b60405180910390fd5b600f60029054906101000a900460ff16611d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf890613bf5565b60405180910390fd5b6001821015611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c90613719565b60405180910390fd5b600e5482611d51610ba7565b611d5b9190613768565b1115611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9390613830565b60405180910390fd5b600c5482601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dea9190613768565b1115611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290613c87565b60405180910390fd5b611e5b8133604051602001611e409190613cef565b60405160208183030381529060405280519060200120611ae2565b611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9190613d56565b60405180910390fd5b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ee59190613768565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f3233836122e7565b60016009819055505050565b600f60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b611ff36120e2565b73ffffffffffffffffffffffffffffffffffffffff16612011611515565b73ffffffffffffffffffffffffffffffffffffffff1614612067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205e9061339f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd90613de8565b60405180910390fd5b6120df81612305565b50565b600033905090565b6000816120f5612151565b11158015612104575060005482105b8015612142575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612165612151565b116121eb576000548110156121ea5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036121e8575b600081036121de5760046000836001900393508381526020019081526020016000205490506121b4565b809250505061221d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122a5868684612724565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61230182826040518060200160405280600081525061272d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123f1612149565b8786866040518563ffffffff1660e01b81526004016124139493929190613e5d565b6020604051808303816000875af192505050801561244f57506040513d601f19601f8201168201806040525081019061244c9190613ebe565b60015b6124c8573d806000811461247f576040519150601f19603f3d011682016040523d82523d6000602084013e612484565b606091505b5060008151036124c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008261252885846127ca565b1490509392505050565b6060600a8054612541906133ee565b80601f016020809104026020016040519081016040528092919081815260200182805461256d906133ee565b80156125ba5780601f1061258f576101008083540402835291602001916125ba565b820191906000526020600020905b81548152906001019060200180831161259d57829003601f168201915b5050505050905090565b60606000820361260b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061271f565b600082905060005b6000821461263d57808061262690613eeb565b915050600a826126369190613f62565b9150612613565b60008167ffffffffffffffff81111561265957612658612fea565b5b6040519080825280601f01601f19166020018201604052801561268b5781602001600182028036833780820191505090505b5090505b60008514612718576001826126a49190613f93565b9150600a856126b39190613fc7565b60306126bf9190613768565b60f81b8183815181106126d5576126d4613ff8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127119190613f62565b945061268f565b8093505050505b919050565b60009392505050565b612737838361283f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127c557600080549050600083820390505b61277760008683806001019450866123cb565b6127ad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127645781600054146127c257600080fd5b50505b505050565b60008082905060005b84518110156128345760008582815181106127f1576127f0613ff8565b5b602002602001015190508083116128135761280c8382612a11565b9250612820565b61281d8184612a11565b92505b50808061282c90613eeb565b9150506127d3565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128ab576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036128e5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128f26000848385612288565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506129698361295a600086600061228e565b61296385612a28565b176122b6565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061298d57806000819055505050612a0c60008483856122e1565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612a44906133ee565b90600052602060002090601f016020900481019282612a665760008555612aad565b82601f10612a7f57803560ff1916838001178555612aad565b82800160010185558215612aad579182015b82811115612aac578235825591602001919060010190612a91565b5b509050612aba9190612abe565b5090565b5b80821115612ad7576000816000905550600101612abf565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b2481612aef565b8114612b2f57600080fd5b50565b600081359050612b4181612b1b565b92915050565b600060208284031215612b5d57612b5c612ae5565b5b6000612b6b84828501612b32565b91505092915050565b60008115159050919050565b612b8981612b74565b82525050565b6000602082019050612ba46000830184612b80565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612be4578082015181840152602081019050612bc9565b83811115612bf3576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c1582612baa565b612c1f8185612bb5565b9350612c2f818560208601612bc6565b612c3881612bf9565b840191505092915050565b60006020820190508181036000830152612c5d8184612c0a565b905092915050565b6000819050919050565b612c7881612c65565b8114612c8357600080fd5b50565b600081359050612c9581612c6f565b92915050565b600060208284031215612cb157612cb0612ae5565b5b6000612cbf84828501612c86565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cf382612cc8565b9050919050565b612d0381612ce8565b82525050565b6000602082019050612d1e6000830184612cfa565b92915050565b612d2d81612ce8565b8114612d3857600080fd5b50565b600081359050612d4a81612d24565b92915050565b60008060408385031215612d6757612d66612ae5565b5b6000612d7585828601612d3b565b9250506020612d8685828601612c86565b9150509250929050565b612d9981612c65565b82525050565b6000602082019050612db46000830184612d90565b92915050565b600080600060608486031215612dd357612dd2612ae5565b5b6000612de186828701612d3b565b9350506020612df286828701612d3b565b9250506040612e0386828701612c86565b9150509250925092565b6000819050919050565b612e2081612e0d565b82525050565b6000602082019050612e3b6000830184612e17565b92915050565b600060208284031215612e5757612e56612ae5565b5b6000612e6584828501612d3b565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612e9357612e92612e6e565b5b8235905067ffffffffffffffff811115612eb057612eaf612e73565b5b602083019150836001820283011115612ecc57612ecb612e78565b5b9250929050565b60008060208385031215612eea57612ee9612ae5565b5b600083013567ffffffffffffffff811115612f0857612f07612aea565b5b612f1485828601612e7d565b92509250509250929050565b612f2981612e0d565b8114612f3457600080fd5b50565b600081359050612f4681612f20565b92915050565b600060208284031215612f6257612f61612ae5565b5b6000612f7084828501612f37565b91505092915050565b612f8281612b74565b8114612f8d57600080fd5b50565b600081359050612f9f81612f79565b92915050565b60008060408385031215612fbc57612fbb612ae5565b5b6000612fca85828601612d3b565b9250506020612fdb85828601612f90565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61302282612bf9565b810181811067ffffffffffffffff8211171561304157613040612fea565b5b80604052505050565b6000613054612adb565b90506130608282613019565b919050565b600067ffffffffffffffff8211156130805761307f612fea565b5b61308982612bf9565b9050602081019050919050565b82818337600083830152505050565b60006130b86130b384613065565b61304a565b9050828152602081018484840111156130d4576130d3612fe5565b5b6130df848285613096565b509392505050565b600082601f8301126130fc576130fb612e6e565b5b813561310c8482602086016130a5565b91505092915050565b6000806000806080858703121561312f5761312e612ae5565b5b600061313d87828801612d3b565b945050602061314e87828801612d3b565b935050604061315f87828801612c86565b925050606085013567ffffffffffffffff8111156131805761317f612aea565b5b61318c878288016130e7565b91505092959194509250565b600067ffffffffffffffff8211156131b3576131b2612fea565b5b602082029050602081019050919050565b60006131d76131d284613198565b61304a565b905080838252602082019050602084028301858111156131fa576131f9612e78565b5b835b81811015613223578061320f8882612f37565b8452602084019350506020810190506131fc565b5050509392505050565b600082601f83011261324257613241612e6e565b5b81356132528482602086016131c4565b91505092915050565b6000806040838503121561327257613271612ae5565b5b600083013567ffffffffffffffff8111156132905761328f612aea565b5b61329c8582860161322d565b92505060206132ad85828601612f37565b9150509250929050565b600080604083850312156132ce576132cd612ae5565b5b60006132dc85828601612c86565b925050602083013567ffffffffffffffff8111156132fd576132fc612aea565b5b6133098582860161322d565b9150509250929050565b6000806040838503121561332a57613329612ae5565b5b600061333885828601612d3b565b925050602061334985828601612d3b565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613389602083612bb5565b915061339482613353565b602082019050919050565b600060208201905081810360008301526133b88161337c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340657607f821691505b602082108103613419576134186133bf565b5b50919050565b600081905092915050565b50565b600061343a60008361341f565b91506134458261342a565b600082019050919050565b600061345b8261342d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061349b601083612bb5565b91506134a682613465565b602082019050919050565b600060208201905081810360008301526134ca8161348e565b9050919050565b7f7265736572766520616c726561647920636c61696d6564000000000000000000600082015250565b6000613507601783612bb5565b9150613512826134d1565b602082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613573601f83612bb5565b915061357e8261353d565b602082019050919050565b600060208201905081810360008301526135a281613566565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006135df601e83612bb5565b91506135ea826135a9565b602082019050919050565b6000602082019050818103600083015261360e816135d2565b9050919050565b7f474f4f44204749524146464553205055424c4943204d494e54204e4f5420414360008201527f5449564500000000000000000000000000000000000000000000000000000000602082015250565b6000613671602483612bb5565b915061367c82613615565b604082019050919050565b600060208201905081810360008301526136a081613664565b9050919050565b7f4154204c45415354203120474f4f442047495241464645204e4545445320544f60008201527f204245204d494e54454400000000000000000000000000000000000000000000602082015250565b6000613703602a83612bb5565b915061370e826136a7565b604082019050919050565b60006020820190508181036000830152613732816136f6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061377382612c65565b915061377e83612c65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137b3576137b2613739565b5b828201905092915050565b7f4d494e54494e472054484953204d414e5920574f554c4420455843454544204760008201527f4f4f4420474952414646455320535550504c5900000000000000000000000000602082015250565b600061381a603383612bb5565b9150613825826137be565b604082019050919050565b600060208201905081810360008301526138498161380d565b9050919050565b600061385b82612c65565b915061386683612c65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561389f5761389e613739565b5b828202905092915050565b7f4e4f5420454e4f554748204554482053454e5400000000000000000000000000600082015250565b60006138e0601383612bb5565b91506138eb826138aa565b602082019050919050565b6000602082019050818103600083015261390f816138d3565b9050919050565b7f4d415820474f4f44204749524146464553204d494e54454420544f2057414c4c60008201527f4554204953203130000000000000000000000000000000000000000000000000602082015250565b6000613972602883612bb5565b915061397d82613916565b604082019050919050565b600060208201905081810360008301526139a181613965565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a04602f83612bb5565b9150613a0f826139a8565b604082019050919050565b60006020820190508181036000830152613a33816139f7565b9050919050565b600081905092915050565b6000613a5082612baa565b613a5a8185613a3a565b9350613a6a818560208601612bc6565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613aac600583613a3a565b9150613ab782613a76565b600582019050919050565b6000613ace8285613a45565b9150613ada8284613a45565b9150613ae582613a9f565b91508190509392505050565b7f474f4f44204749524146464553205055424c4943204d494e542049532041435460008201527f4956450000000000000000000000000000000000000000000000000000000000602082015250565b6000613b4d602383612bb5565b9150613b5882613af1565b604082019050919050565b60006020820190508181036000830152613b7c81613b40565b9050919050565b7f474f4f442047495241464645532057484954454c495354204d494e54204e4f5460008201527f2041435449564500000000000000000000000000000000000000000000000000602082015250565b6000613bdf602783612bb5565b9150613bea82613b83565b604082019050919050565b60006020820190508181036000830152613c0e81613bd2565b9050919050565b7f4d415820474f4f44204749524146464553204d494e54454420544f2057414c4c60008201527f4554204953203200000000000000000000000000000000000000000000000000602082015250565b6000613c71602783612bb5565b9150613c7c82613c15565b604082019050919050565b60006020820190508181036000830152613ca081613c64565b9050919050565b60008160601b9050919050565b6000613cbf82613ca7565b9050919050565b6000613cd182613cb4565b9050919050565b613ce9613ce482612ce8565b613cc6565b82525050565b6000613cfb8284613cd8565b60148201915081905092915050565b7f4e4f54204f4e20474f4f4420474952414646455320414c4c4f574c4953540000600082015250565b6000613d40601e83612bb5565b9150613d4b82613d0a565b602082019050919050565b60006020820190508181036000830152613d6f81613d33565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dd2602683612bb5565b9150613ddd82613d76565b604082019050919050565b60006020820190508181036000830152613e0181613dc5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613e2f82613e08565b613e398185613e13565b9350613e49818560208601612bc6565b613e5281612bf9565b840191505092915050565b6000608082019050613e726000830187612cfa565b613e7f6020830186612cfa565b613e8c6040830185612d90565b8181036060830152613e9e8184613e24565b905095945050505050565b600081519050613eb881612b1b565b92915050565b600060208284031215613ed457613ed3612ae5565b5b6000613ee284828501613ea9565b91505092915050565b6000613ef682612c65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f2857613f27613739565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f6d82612c65565b9150613f7883612c65565b925082613f8857613f87613f33565b5b828204905092915050565b6000613f9e82612c65565b9150613fa983612c65565b925082821015613fbc57613fbb613739565b5b828203905092915050565b6000613fd282612c65565b9150613fdd83612c65565b925082613fed57613fec613f33565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212206c409418bcc300ef3e37f4e83e10d6748acbfa227e3f0094b720a13d10f7109164736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80636992d22911610118578063a22cb465116100a0578063d2cab0561161006f578063d2cab05614610746578063e834a83414610762578063e985e9c51461078d578063f030c526146107ca578063f2fde38b146107f55761020f565b8063a22cb4651461067a578063b88d4fde146106a3578063b8a20ed0146106cc578063c87b56dd146107095761020f565b8063715018a6116100e7578063715018a6146105c85780637cb64759146105df5780638da5cb5b1461060857806395d89b4114610633578063a0712d681461065e5761020f565b80636992d2291461050a5780636c0360eb146105355780636eb7c7a61461056057806370a082311461058b5761020f565b80632eb4a7ab1161019b57806342842e0e1161016a57806342842e0e14610425578063453c23101461044e57806353ac010a1461047957806355f804b3146104a45780636352211e146104cd5761020f565b80632eb4a7ab1461038f5780633ccfd60b146103ba5780633ec4de35146103d15780633fe5f0541461040e5761020f565b8063095ea7b3116101e2578063095ea7b3146102d057806318160ddd146102f95780631bb59fcb1461032457806323b872dd1461033b57806325ee97e3146103645761020f565b806301401cb31461021457806301ffc9a71461022b57806306fdde0314610268578063081812fc14610293575b600080fd5b34801561022057600080fd5b5061022961081e565b005b34801561023757600080fd5b50610252600480360381019061024d9190612b47565b6108c6565b60405161025f9190612b8f565b60405180910390f35b34801561027457600080fd5b5061027d610958565b60405161028a9190612c43565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190612c9b565b6109ea565b6040516102c79190612d09565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190612d50565b610a66565b005b34801561030557600080fd5b5061030e610ba7565b60405161031b9190612d9f565b60405180910390f35b34801561033057600080fd5b50610339610bbe565b005b34801561034757600080fd5b50610362600480360381019061035d9190612dba565b610c66565b005b34801561037057600080fd5b50610379610f88565b6040516103869190612d9f565b60405180910390f35b34801561039b57600080fd5b506103a4610f8e565b6040516103b19190612e26565b60405180910390f35b3480156103c657600080fd5b506103cf610f94565b005b3480156103dd57600080fd5b506103f860048036038101906103f39190612e41565b6110bf565b6040516104059190612d9f565b60405180910390f35b34801561041a57600080fd5b506104236110d7565b005b34801561043157600080fd5b5061044c60048036038101906104479190612dba565b6111cb565b005b34801561045a57600080fd5b506104636111eb565b6040516104709190612d9f565b60405180910390f35b34801561048557600080fd5b5061048e6111f1565b60405161049b9190612b8f565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190612ed3565b611204565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190612c9b565b611296565b6040516105019190612d09565b60405180910390f35b34801561051657600080fd5b5061051f6112a8565b60405161052c9190612b8f565b60405180910390f35b34801561054157600080fd5b5061054a6112bb565b6040516105579190612c43565b60405180910390f35b34801561056c57600080fd5b50610575611349565b6040516105829190612d9f565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad9190612e41565b61134f565b6040516105bf9190612d9f565b60405180910390f35b3480156105d457600080fd5b506105dd611407565b005b3480156105eb57600080fd5b5061060660048036038101906106019190612f4c565b61148f565b005b34801561061457600080fd5b5061061d611515565b60405161062a9190612d09565b60405180910390f35b34801561063f57600080fd5b5061064861153f565b6040516106559190612c43565b60405180910390f35b61067860048036038101906106739190612c9b565b6115d1565b005b34801561068657600080fd5b506106a1600480360381019061069c9190612fa5565b6118f8565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613115565b611a6f565b005b3480156106d857600080fd5b506106f360048036038101906106ee919061325b565b611ae2565b6040516107009190612b8f565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190612c9b565b611af9565b60405161073d9190612c43565b60405180910390f35b610760600480360381019061075b91906132b7565b611ba7565b005b34801561076e57600080fd5b50610777611f3e565b6040516107849190612b8f565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613313565b611f51565b6040516107c19190612b8f565b60405180910390f35b3480156107d657600080fd5b506107df611fe5565b6040516107ec9190612d9f565b60405180910390f35b34801561080157600080fd5b5061081c60048036038101906108179190612e41565b611feb565b005b6108266120e2565b73ffffffffffffffffffffffffffffffffffffffff16610844611515565b73ffffffffffffffffffffffffffffffffffffffff161461089a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108919061339f565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109515750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610967906133ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610993906133ee565b80156109e05780601f106109b5576101008083540402835291602001916109e0565b820191906000526020600020905b8154815290600101906020018083116109c357829003601f168201915b5050505050905090565b60006109f5826120ea565b610a2b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7182611296565b90508073ffffffffffffffffffffffffffffffffffffffff16610a92612149565b73ffffffffffffffffffffffffffffffffffffffff1614610af557610abe81610ab9612149565b611f51565b610af4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bb1612151565b6001546000540303905090565b610bc66120e2565b73ffffffffffffffffffffffffffffffffffffffff16610be4611515565b73ffffffffffffffffffffffffffffffffffffffff1614610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c319061339f565b60405180910390fd5b600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b6000610c7182612156565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ce484612222565b91509150610cfa8187610cf5612149565b612244565b610d4657610d0f86610d0a612149565b611f51565b610d45576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610dac576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db98686866001612288565b8015610dc457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e9285610e6e88888761228e565b7c0200000000000000000000000000000000000000000000000000000000176122b6565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f185760006001850190506000600460008381526020019081526020016000205403610f16576000548114610f15578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f8086868660016122e1565b505050505050565b600c5481565b60105481565b610f9c6120e2565b73ffffffffffffffffffffffffffffffffffffffff16610fba611515565b73ffffffffffffffffffffffffffffffffffffffff1614611010576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110079061339f565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161103690613450565b60006040518083038185875af1925050503d8060008114611073576040519150601f19603f3d011682016040523d82523d6000602084013e611078565b606091505b50509050806110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b3906134b1565b60405180910390fd5b50565b60116020528060005260406000206000915090505481565b6110df6120e2565b73ffffffffffffffffffffffffffffffffffffffff166110fd611515565b73ffffffffffffffffffffffffffffffffffffffff1614611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a9061339f565b60405180910390fd5b600f60009054906101000a900460ff16156111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a9061351d565b60405180910390fd5b6111ae3360216122e7565b6001600f60006101000a81548160ff021916908315150217905550565b6111e683838360405180602001604052806000815250611a6f565b505050565b600d5481565b600f60019054906101000a900460ff1681565b61120c6120e2565b73ffffffffffffffffffffffffffffffffffffffff1661122a611515565b73ffffffffffffffffffffffffffffffffffffffff1614611280576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112779061339f565b60405180910390fd5b8181600a9190611291929190612a38565b505050565b60006112a182612156565b9050919050565b600f60029054906101000a900460ff1681565b600a80546112c8906133ee565b80601f01602080910402602001604051908101604052809291908181526020018280546112f4906133ee565b80156113415780601f1061131657610100808354040283529160200191611341565b820191906000526020600020905b81548152906001019060200180831161132457829003601f168201915b505050505081565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113b6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61140f6120e2565b73ffffffffffffffffffffffffffffffffffffffff1661142d611515565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a9061339f565b60405180910390fd5b61148d6000612305565b565b6114976120e2565b73ffffffffffffffffffffffffffffffffffffffff166114b5611515565b73ffffffffffffffffffffffffffffffffffffffff161461150b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115029061339f565b60405180910390fd5b8060108190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461154e906133ee565b80601f016020809104026020016040519081016040528092919081815260200182805461157a906133ee565b80156115c75780601f1061159c576101008083540402835291602001916115c7565b820191906000526020600020905b8154815290600101906020018083116115aa57829003601f168201915b5050505050905090565b600260095403611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d90613589565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461168c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611683906135f5565b60405180910390fd5b600f60019054906101000a900460ff166116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290613687565b60405180910390fd5b600181101561171f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171690613719565b60405180910390fd5b600e548161172b610ba7565b6117359190613768565b1115611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90613830565b60405180910390fd5b80600b546117849190613850565b3410156117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bd906138f6565b60405180910390fd5b600d5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118149190613768565b1115611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613988565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118a09190613768565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118ed33826122e7565b600160098190555050565b611900612149565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611964576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611971612149565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a1e612149565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a639190612b8f565b60405180910390a35050565b611a7a848484610c66565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611adc57611aa5848484846123cb565b611adb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6000611af1836010548461251b565b905092915050565b6060611b04826120ea565b611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90613a1a565b60405180910390fd5b6000600a8054611b52906133ee565b905011611b6e5760405180602001604052806000815250611ba0565b611b76612532565b611b7f836125c4565b604051602001611b90929190613ac2565b6040516020818303038152906040525b9050919050565b600260095403611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390613589565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c59906135f5565b60405180910390fd5b600f60019054906101000a900460ff1615611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca990613b63565b60405180910390fd5b600f60029054906101000a900460ff16611d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf890613bf5565b60405180910390fd5b6001821015611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c90613719565b60405180910390fd5b600e5482611d51610ba7565b611d5b9190613768565b1115611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9390613830565b60405180910390fd5b600c5482601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dea9190613768565b1115611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290613c87565b60405180910390fd5b611e5b8133604051602001611e409190613cef565b60405160208183030381529060405280519060200120611ae2565b611e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9190613d56565b60405180910390fd5b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ee59190613768565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f3233836122e7565b60016009819055505050565b600f60009054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b611ff36120e2565b73ffffffffffffffffffffffffffffffffffffffff16612011611515565b73ffffffffffffffffffffffffffffffffffffffff1614612067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205e9061339f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd90613de8565b60405180910390fd5b6120df81612305565b50565b600033905090565b6000816120f5612151565b11158015612104575060005482105b8015612142575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612165612151565b116121eb576000548110156121ea5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036121e8575b600081036121de5760046000836001900393508381526020019081526020016000205490506121b4565b809250505061221d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122a5868684612724565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61230182826040518060200160405280600081525061272d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123f1612149565b8786866040518563ffffffff1660e01b81526004016124139493929190613e5d565b6020604051808303816000875af192505050801561244f57506040513d601f19601f8201168201806040525081019061244c9190613ebe565b60015b6124c8573d806000811461247f576040519150601f19603f3d011682016040523d82523d6000602084013e612484565b606091505b5060008151036124c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008261252885846127ca565b1490509392505050565b6060600a8054612541906133ee565b80601f016020809104026020016040519081016040528092919081815260200182805461256d906133ee565b80156125ba5780601f1061258f576101008083540402835291602001916125ba565b820191906000526020600020905b81548152906001019060200180831161259d57829003601f168201915b5050505050905090565b60606000820361260b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061271f565b600082905060005b6000821461263d57808061262690613eeb565b915050600a826126369190613f62565b9150612613565b60008167ffffffffffffffff81111561265957612658612fea565b5b6040519080825280601f01601f19166020018201604052801561268b5781602001600182028036833780820191505090505b5090505b60008514612718576001826126a49190613f93565b9150600a856126b39190613fc7565b60306126bf9190613768565b60f81b8183815181106126d5576126d4613ff8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127119190613f62565b945061268f565b8093505050505b919050565b60009392505050565b612737838361283f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127c557600080549050600083820390505b61277760008683806001019450866123cb565b6127ad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127645781600054146127c257600080fd5b50505b505050565b60008082905060005b84518110156128345760008582815181106127f1576127f0613ff8565b5b602002602001015190508083116128135761280c8382612a11565b9250612820565b61281d8184612a11565b92505b50808061282c90613eeb565b9150506127d3565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128ab576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036128e5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128f26000848385612288565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506129698361295a600086600061228e565b61296385612a28565b176122b6565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061298d57806000819055505050612a0c60008483856122e1565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612a44906133ee565b90600052602060002090601f016020900481019282612a665760008555612aad565b82601f10612a7f57803560ff1916838001178555612aad565b82800160010185558215612aad579182015b82811115612aac578235825591602001919060010190612a91565b5b509050612aba9190612abe565b5090565b5b80821115612ad7576000816000905550600101612abf565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b2481612aef565b8114612b2f57600080fd5b50565b600081359050612b4181612b1b565b92915050565b600060208284031215612b5d57612b5c612ae5565b5b6000612b6b84828501612b32565b91505092915050565b60008115159050919050565b612b8981612b74565b82525050565b6000602082019050612ba46000830184612b80565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612be4578082015181840152602081019050612bc9565b83811115612bf3576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c1582612baa565b612c1f8185612bb5565b9350612c2f818560208601612bc6565b612c3881612bf9565b840191505092915050565b60006020820190508181036000830152612c5d8184612c0a565b905092915050565b6000819050919050565b612c7881612c65565b8114612c8357600080fd5b50565b600081359050612c9581612c6f565b92915050565b600060208284031215612cb157612cb0612ae5565b5b6000612cbf84828501612c86565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cf382612cc8565b9050919050565b612d0381612ce8565b82525050565b6000602082019050612d1e6000830184612cfa565b92915050565b612d2d81612ce8565b8114612d3857600080fd5b50565b600081359050612d4a81612d24565b92915050565b60008060408385031215612d6757612d66612ae5565b5b6000612d7585828601612d3b565b9250506020612d8685828601612c86565b9150509250929050565b612d9981612c65565b82525050565b6000602082019050612db46000830184612d90565b92915050565b600080600060608486031215612dd357612dd2612ae5565b5b6000612de186828701612d3b565b9350506020612df286828701612d3b565b9250506040612e0386828701612c86565b9150509250925092565b6000819050919050565b612e2081612e0d565b82525050565b6000602082019050612e3b6000830184612e17565b92915050565b600060208284031215612e5757612e56612ae5565b5b6000612e6584828501612d3b565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612e9357612e92612e6e565b5b8235905067ffffffffffffffff811115612eb057612eaf612e73565b5b602083019150836001820283011115612ecc57612ecb612e78565b5b9250929050565b60008060208385031215612eea57612ee9612ae5565b5b600083013567ffffffffffffffff811115612f0857612f07612aea565b5b612f1485828601612e7d565b92509250509250929050565b612f2981612e0d565b8114612f3457600080fd5b50565b600081359050612f4681612f20565b92915050565b600060208284031215612f6257612f61612ae5565b5b6000612f7084828501612f37565b91505092915050565b612f8281612b74565b8114612f8d57600080fd5b50565b600081359050612f9f81612f79565b92915050565b60008060408385031215612fbc57612fbb612ae5565b5b6000612fca85828601612d3b565b9250506020612fdb85828601612f90565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61302282612bf9565b810181811067ffffffffffffffff8211171561304157613040612fea565b5b80604052505050565b6000613054612adb565b90506130608282613019565b919050565b600067ffffffffffffffff8211156130805761307f612fea565b5b61308982612bf9565b9050602081019050919050565b82818337600083830152505050565b60006130b86130b384613065565b61304a565b9050828152602081018484840111156130d4576130d3612fe5565b5b6130df848285613096565b509392505050565b600082601f8301126130fc576130fb612e6e565b5b813561310c8482602086016130a5565b91505092915050565b6000806000806080858703121561312f5761312e612ae5565b5b600061313d87828801612d3b565b945050602061314e87828801612d3b565b935050604061315f87828801612c86565b925050606085013567ffffffffffffffff8111156131805761317f612aea565b5b61318c878288016130e7565b91505092959194509250565b600067ffffffffffffffff8211156131b3576131b2612fea565b5b602082029050602081019050919050565b60006131d76131d284613198565b61304a565b905080838252602082019050602084028301858111156131fa576131f9612e78565b5b835b81811015613223578061320f8882612f37565b8452602084019350506020810190506131fc565b5050509392505050565b600082601f83011261324257613241612e6e565b5b81356132528482602086016131c4565b91505092915050565b6000806040838503121561327257613271612ae5565b5b600083013567ffffffffffffffff8111156132905761328f612aea565b5b61329c8582860161322d565b92505060206132ad85828601612f37565b9150509250929050565b600080604083850312156132ce576132cd612ae5565b5b60006132dc85828601612c86565b925050602083013567ffffffffffffffff8111156132fd576132fc612aea565b5b6133098582860161322d565b9150509250929050565b6000806040838503121561332a57613329612ae5565b5b600061333885828601612d3b565b925050602061334985828601612d3b565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613389602083612bb5565b915061339482613353565b602082019050919050565b600060208201905081810360008301526133b88161337c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340657607f821691505b602082108103613419576134186133bf565b5b50919050565b600081905092915050565b50565b600061343a60008361341f565b91506134458261342a565b600082019050919050565b600061345b8261342d565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061349b601083612bb5565b91506134a682613465565b602082019050919050565b600060208201905081810360008301526134ca8161348e565b9050919050565b7f7265736572766520616c726561647920636c61696d6564000000000000000000600082015250565b6000613507601783612bb5565b9150613512826134d1565b602082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613573601f83612bb5565b915061357e8261353d565b602082019050919050565b600060208201905081810360008301526135a281613566565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006135df601e83612bb5565b91506135ea826135a9565b602082019050919050565b6000602082019050818103600083015261360e816135d2565b9050919050565b7f474f4f44204749524146464553205055424c4943204d494e54204e4f5420414360008201527f5449564500000000000000000000000000000000000000000000000000000000602082015250565b6000613671602483612bb5565b915061367c82613615565b604082019050919050565b600060208201905081810360008301526136a081613664565b9050919050565b7f4154204c45415354203120474f4f442047495241464645204e4545445320544f60008201527f204245204d494e54454400000000000000000000000000000000000000000000602082015250565b6000613703602a83612bb5565b915061370e826136a7565b604082019050919050565b60006020820190508181036000830152613732816136f6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061377382612c65565b915061377e83612c65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137b3576137b2613739565b5b828201905092915050565b7f4d494e54494e472054484953204d414e5920574f554c4420455843454544204760008201527f4f4f4420474952414646455320535550504c5900000000000000000000000000602082015250565b600061381a603383612bb5565b9150613825826137be565b604082019050919050565b600060208201905081810360008301526138498161380d565b9050919050565b600061385b82612c65565b915061386683612c65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561389f5761389e613739565b5b828202905092915050565b7f4e4f5420454e4f554748204554482053454e5400000000000000000000000000600082015250565b60006138e0601383612bb5565b91506138eb826138aa565b602082019050919050565b6000602082019050818103600083015261390f816138d3565b9050919050565b7f4d415820474f4f44204749524146464553204d494e54454420544f2057414c4c60008201527f4554204953203130000000000000000000000000000000000000000000000000602082015250565b6000613972602883612bb5565b915061397d82613916565b604082019050919050565b600060208201905081810360008301526139a181613965565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a04602f83612bb5565b9150613a0f826139a8565b604082019050919050565b60006020820190508181036000830152613a33816139f7565b9050919050565b600081905092915050565b6000613a5082612baa565b613a5a8185613a3a565b9350613a6a818560208601612bc6565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613aac600583613a3a565b9150613ab782613a76565b600582019050919050565b6000613ace8285613a45565b9150613ada8284613a45565b9150613ae582613a9f565b91508190509392505050565b7f474f4f44204749524146464553205055424c4943204d494e542049532041435460008201527f4956450000000000000000000000000000000000000000000000000000000000602082015250565b6000613b4d602383612bb5565b9150613b5882613af1565b604082019050919050565b60006020820190508181036000830152613b7c81613b40565b9050919050565b7f474f4f442047495241464645532057484954454c495354204d494e54204e4f5460008201527f2041435449564500000000000000000000000000000000000000000000000000602082015250565b6000613bdf602783612bb5565b9150613bea82613b83565b604082019050919050565b60006020820190508181036000830152613c0e81613bd2565b9050919050565b7f4d415820474f4f44204749524146464553204d494e54454420544f2057414c4c60008201527f4554204953203200000000000000000000000000000000000000000000000000602082015250565b6000613c71602783612bb5565b9150613c7c82613c15565b604082019050919050565b60006020820190508181036000830152613ca081613c64565b9050919050565b60008160601b9050919050565b6000613cbf82613ca7565b9050919050565b6000613cd182613cb4565b9050919050565b613ce9613ce482612ce8565b613cc6565b82525050565b6000613cfb8284613cd8565b60148201915081905092915050565b7f4e4f54204f4e20474f4f4420474952414646455320414c4c4f574c4953540000600082015250565b6000613d40601e83612bb5565b9150613d4b82613d0a565b602082019050919050565b60006020820190508181036000830152613d6f81613d33565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dd2602683612bb5565b9150613ddd82613d76565b604082019050919050565b60006020820190508181036000830152613e0181613dc5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613e2f82613e08565b613e398185613e13565b9350613e49818560208601612bc6565b613e5281612bf9565b840191505092915050565b6000608082019050613e726000830187612cfa565b613e7f6020830186612cfa565b613e8c6040830185612d90565b8181036060830152613e9e8184613e24565b905095945050505050565b600081519050613eb881612b1b565b92915050565b600060208284031215613ed457613ed3612ae5565b5b6000613ee284828501613ea9565b91505092915050565b6000613ef682612c65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f2857613f27613739565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f6d82612c65565b9150613f7883612c65565b925082613f8857613f87613f33565b5b828204905092915050565b6000613f9e82612c65565b9150613fa983612c65565b925082821015613fbc57613fbb613739565b5b828203905092915050565b6000613fd282612c65565b9150613fdd83612c65565b925082613fed57613fec613f33565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212206c409418bcc300ef3e37f4e83e10d6748acbfa227e3f0094b720a13d10f7109164736f6c634300080d0033

Deployed Bytecode Sourcemap

55830:4445:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59878:98;;;;;;;;;;;;;:::i;:::-;;25583:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31230:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33176:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32724:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24637:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59984:107;;;;;;;;;;;;;:::i;:::-;;42441:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56009:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56225:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60099:173;;;;;;;;;;;;;:::i;:::-;;56259:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59481:168;;;;;;;;;;;;;:::i;:::-;;34066:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56049:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56156:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59661:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31019:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56188:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55931:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55961:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26262:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10174:103;;;;;;;;;;;;;:::i;:::-;;59777:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9523:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31399:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56827:840;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33452:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34322:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58694:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58961:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57675:1011;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56130:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33831:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56088:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10432:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59878:98;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59955:13:::1;;;;;;;;;;;59954:14;59938:13;;:30;;;;;;;;;;;;;;;;;;59878:98::o:0;25583:615::-;25668:4;25983:10;25968:25;;:11;:25;;;;:102;;;;26060:10;26045:25;;:11;:25;;;;25968:102;:179;;;;26137:10;26122:25;;:11;:25;;;;25968:179;25948:199;;25583:615;;;:::o;31230:100::-;31284:13;31317:5;31310:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31230:100;:::o;33176:204::-;33244:7;33269:16;33277:7;33269;:16::i;:::-;33264:64;;33294:34;;;;;;;;;;;;;;33264:64;33348:15;:24;33364:7;33348:24;;;;;;;;;;;;;;;;;;;;;33341:31;;33176:204;;;:::o;32724:386::-;32797:13;32813:16;32821:7;32813;:16::i;:::-;32797:32;;32869:5;32846:28;;:19;:17;:19::i;:::-;:28;;;32842:175;;32894:44;32911:5;32918:19;:17;:19::i;:::-;32894:16;:44::i;:::-;32889:128;;32966:35;;;;;;;;;;;;;;32889:128;32842:175;33056:2;33029:15;:24;33045:7;33029:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33094:7;33090:2;33074:28;;33083:5;33074:28;;;;;;;;;;;;32786:324;32724:386;;:::o;24637:315::-;24690:7;24918:15;:13;:15::i;:::-;24903:12;;24887:13;;:28;:46;24880:53;;24637:315;:::o;59984:107::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60067:16:::1;;;;;;;;;;;60066:17;60047:16;;:36;;;;;;;;;;;;;;;;;;59984:107::o:0;42441:2800::-;42575:27;42605;42624:7;42605:18;:27::i;:::-;42575:57;;42690:4;42649:45;;42665:19;42649:45;;;42645:86;;42703:28;;;;;;;;;;;;;;42645:86;42745:27;42774:23;42801:28;42821:7;42801:19;:28::i;:::-;42744:85;;;;42929:62;42948:15;42965:4;42971:19;:17;:19::i;:::-;42929:18;:62::i;:::-;42924:174;;43011:43;43028:4;43034:19;:17;:19::i;:::-;43011:16;:43::i;:::-;43006:92;;43063:35;;;;;;;;;;;;;;43006:92;42924:174;43129:1;43115:16;;:2;:16;;;43111:52;;43140:23;;;;;;;;;;;;;;43111:52;43176:43;43198:4;43204:2;43208:7;43217:1;43176:21;:43::i;:::-;43312:15;43309:160;;;43452:1;43431:19;43424:30;43309:160;43847:18;:24;43866:4;43847:24;;;;;;;;;;;;;;;;43845:26;;;;;;;;;;;;43916:18;:22;43935:2;43916:22;;;;;;;;;;;;;;;;43914:24;;;;;;;;;;;44238:145;44275:2;44323:45;44338:4;44344:2;44348:19;44323:14;:45::i;:::-;21865:8;44296:72;44238:18;:145::i;:::-;44209:17;:26;44227:7;44209:26;;;;;;;;;;;:174;;;;44553:1;21865:8;44503:19;:46;:51;44499:626;;44575:19;44607:1;44597:7;:11;44575:33;;44764:1;44730:17;:30;44748:11;44730:30;;;;;;;;;;;;:35;44726:384;;44868:13;;44853:11;:28;44849:242;;45048:19;45015:17;:30;45033:11;45015:30;;;;;;;;;;;:52;;;;44849:242;44726:384;44556:569;44499:626;45172:7;45168:2;45153:27;;45162:4;45153:27;;;;;;;;;;;;45191:42;45212:4;45218:2;45222:7;45231:1;45191:20;:42::i;:::-;42564:2677;;;42441:2800;;;:::o;56009:33::-;;;;:::o;56225:25::-;;;;:::o;60099:173::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60150:12:::1;60168:10;:15;;60191:21;60168:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60149:68;;;60236:7;60228:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;60138:134;60099:173::o:0;56259:50::-;;;;;;;;;;;;;;;;;:::o;59481:168::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59545:7:::1;;;;;;;;;;;59544:8;59536:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59591:25;59601:10;59613:2;59591:9;:25::i;:::-;59637:4;59627:7;;:14;;;;;;;;;;;;;;;;;;59481:168::o:0;34066:185::-;34204:39;34221:4;34227:2;34231:7;34204:39;;;;;;;;;;;;:16;:39::i;:::-;34066:185;;;:::o;56049:32::-;;;;:::o;56156:25::-;;;;;;;;;;;;;:::o;59661:108::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59750:11:::1;;59740:7;:21;;;;;;;:::i;:::-;;59661:108:::0;;:::o;31019:144::-;31083:7;31126:27;31145:7;31126:18;:27::i;:::-;31103:52;;31019:144;;;:::o;56188:28::-;;;;;;;;;;;;;:::o;55931:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55961:41::-;;;;:::o;26262:224::-;26326:7;26367:1;26350:19;;:5;:19;;;26346:60;;26378:28;;;;;;;;;;;;;;26346:60;20817:13;26424:18;:25;26443:5;26424:25;;;;;;;;;;;;;;;;:54;26417:61;;26262:224;;;:::o;10174:103::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10239:30:::1;10266:1;10239:18;:30::i;:::-;10174:103::o:0;59777:93::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59858:4:::1;59845:10;:17;;;;59777:93:::0;:::o;9523:87::-;9569:7;9596:6;;;;;;;;;;;9589:13;;9523:87;:::o;31399:104::-;31455:13;31488:7;31481:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31399:104;:::o;56827:840::-;6621:1;7219:7;;:19;7211:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6621:1;7352:7;:18;;;;56591:10:::1;56578:23;;:9;:23;;;56570:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56921:13:::2;;;;;;;;;;;56913:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;57059:1;57047:8;:13;;57039:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;57207:11;;57195:8;57179:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:39;;57171:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;57348:8;57333:12;;:23;;;;:::i;:::-;57320:9;:36;;57312:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;57470:12;;57458:8;57429:14;:26;57444:10;57429:26;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:53;;57421:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;57609:8;57580:14;:26;57595:10;57580:26;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;57551:14;:26;57566:10;57551:26;;;;;;;;;;;;;;;:66;;;;57628:31;57638:10;57650:8;57628:9;:31::i;:::-;6577:1:::0;7531:7;:22;;;;56827:840;:::o;33452:308::-;33563:19;:17;:19::i;:::-;33551:31;;:8;:31;;;33547:61;;33591:17;;;;;;;;;;;;;;33547:61;33673:8;33621:18;:39;33640:19;:17;:19::i;:::-;33621:39;;;;;;;;;;;;;;;:49;33661:8;33621:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;33733:8;33697:55;;33712:19;:17;:19::i;:::-;33697:55;;;33743:8;33697:55;;;;;;:::i;:::-;;;;;;;;33452:308;;:::o;34322:399::-;34489:31;34502:4;34508:2;34512:7;34489:12;:31::i;:::-;34553:1;34535:2;:14;;;:19;34531:183;;34574:56;34605:4;34611:2;34615:7;34624:5;34574:30;:56::i;:::-;34569:145;;34658:40;;;;;;;;;;;;;;34569:145;34531:183;34322:399;;;;:::o;58694:151::-;58770:4;58794:43;58813:5;58820:10;;58832:4;58794:18;:43::i;:::-;58787:50;;58694:151;;;;:::o;58961:344::-;59034:13;59069:16;59077:7;59069;:16::i;:::-;59061:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59197:1;59179:7;59173:21;;;;;:::i;:::-;;;:25;:124;;;;;;;;;;;;;;;;;59238:10;:8;:10::i;:::-;59250:18;:7;:16;:18::i;:::-;59221:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59173:124;59157:140;;58961:344;;;:::o;57675:1011::-;6621:1;7219:7;;:19;7211:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6621:1;7352:7;:18;;;;56591:10:::1;56578:23;;:9;:23;;;56570:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;57803:13:::2;;;;;;;;;;;57802:14;57794:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;57927:16;;;;;;;;;;;57919:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;58068:1;58056:8;:13;;58048:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;58216:11;;58204:8;58188:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:39;;58180:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;58370:14;;58358:8;58329:14;:26;58344:10;58329:26;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:55;;58321:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;58458:55;58466:5;58500:10;58483:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;58473:39;;;;;;58458:7;:55::i;:::-;58450:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;58628:8;58599:14;:26;58614:10;58599:26;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;58570:14;:26;58585:10;58570:26;;;;;;;;;;;;;;;:66;;;;58647:31;58657:10;58669:8;58647:9;:31::i;:::-;6577:1:::0;7531:7;:22;;;;57675:1011;;:::o;56130:19::-;;;;;;;;;;;;;:::o;33831:164::-;33928:4;33952:18;:25;33971:5;33952:25;;;;;;;;;;;;;;;:35;33978:8;33952:35;;;;;;;;;;;;;;;;;;;;;;;;;33945:42;;33831:164;;;;:::o;56088:33::-;;;;:::o;10432:201::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10541:1:::1;10521:22;;:8;:22;;::::0;10513:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10597:28;10616:8;10597:18;:28::i;:::-;10432:201:::0;:::o;8247:98::-;8300:7;8327:10;8320:17;;8247:98;:::o;34976:273::-;35033:4;35089:7;35070:15;:13;:15::i;:::-;:26;;:66;;;;;35123:13;;35113:7;:23;35070:66;:152;;;;;35221:1;21587:8;35174:17;:26;35192:7;35174:26;;;;;;;;;;;;:43;:48;35070:152;35050:172;;34976:273;;;:::o;53537:105::-;53597:7;53624:10;53617:17;;53537:105;:::o;24161:92::-;24217:7;24161:92;:::o;27936:1129::-;28003:7;28023:12;28038:7;28023:22;;28106:4;28087:15;:13;:15::i;:::-;:23;28083:915;;28140:13;;28133:4;:20;28129:869;;;28178:14;28195:17;:23;28213:4;28195:23;;;;;;;;;;;;28178:40;;28311:1;21587:8;28284:6;:23;:28;28280:699;;28803:113;28820:1;28810:6;:11;28803:113;;28863:17;:25;28881:6;;;;;;;28863:25;;;;;;;;;;;;28854:34;;28803:113;;;28949:6;28942:13;;;;;;28280:699;28155:843;28129:869;28083:915;29026:31;;;;;;;;;;;;;;27936:1129;;;;:::o;40777:652::-;40872:27;40901:23;40942:53;40998:15;40942:71;;41184:7;41178:4;41171:21;41219:22;41213:4;41206:36;41295:4;41289;41279:21;41256:44;;41391:19;41385:26;41366:45;;41122:300;40777:652;;;:::o;41542:645::-;41684:11;41846:15;41840:4;41836:26;41828:34;;42005:15;41994:9;41990:31;41977:44;;42152:15;42141:9;42138:30;42131:4;42120:9;42117:19;42114:55;42104:65;;41542:645;;;;;:::o;52370:159::-;;;;;:::o;50682:309::-;50817:7;50837:16;21988:3;50863:19;:40;;50837:67;;21988:3;50930:31;50941:4;50947:2;50951:9;50930:10;:31::i;:::-;50922:40;;:61;;50915:68;;;50682:309;;;;;:::o;30510:447::-;30590:14;30758:15;30751:5;30747:27;30738:36;;30932:5;30918:11;30894:22;30890:40;30887:51;30880:5;30877:62;30867:72;;30510:447;;;;:::o;53188:158::-;;;;;:::o;35333:104::-;35402:27;35412:2;35416:8;35402:27;;;;;;;;;;;;:9;:27::i;:::-;35333:104;;:::o;10793:191::-;10867:16;10886:6;;;;;;;;;;;10867:25;;10912:8;10903:6;;:17;;;;;;;;;;;;;;;;;;10967:8;10936:40;;10957:8;10936:40;;;;;;;;;;;;10856:128;10793:191;:::o;49192:716::-;49355:4;49401:2;49376:45;;;49422:19;:17;:19::i;:::-;49443:4;49449:7;49458:5;49376:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49372:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49676:1;49659:6;:13;:18;49655:235;;49705:40;;;;;;;;;;;;;;49655:235;49848:6;49842:13;49833:6;49829:2;49825:15;49818:38;49372:529;49545:54;;;49535:64;;;:6;:64;;;;49528:71;;;49192:716;;;;;;:::o;3344:190::-;3469:4;3522;3493:25;3506:5;3513:4;3493:12;:25::i;:::-;:33;3486:40;;3344:190;;;;;:::o;58853:100::-;58905:13;58938:7;58931:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58853:100;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;51567:147::-;51704:6;51567:147;;;;;:::o;35853:681::-;35976:19;35982:2;35986:8;35976:5;:19::i;:::-;36055:1;36037:2;:14;;;:19;36033:483;;36077:11;36091:13;;36077:27;;36123:13;36145:8;36139:3;:14;36123:30;;36172:233;36203:62;36242:1;36246:2;36250:7;;;;;;36259:5;36203:30;:62::i;:::-;36198:167;;36301:40;;;;;;;;;;;;;;36198:167;36400:3;36392:5;:11;36172:233;;36487:3;36470:13;;:20;36466:34;;36492:8;;;36466:34;36058:458;;36033:483;35853:681;;;:::o;3895:675::-;3978:7;3998:20;4021:4;3998:27;;4041:9;4036:497;4060:5;:12;4056:1;:16;4036:497;;;4094:20;4117:5;4123:1;4117:8;;;;;;;;:::i;:::-;;;;;;;;4094:31;;4160:12;4144;:28;4140:382;;4287:42;4302:12;4316;4287:14;:42::i;:::-;4272:57;;4140:382;;;4464:42;4479:12;4493;4464:14;:42::i;:::-;4449:57;;4140:382;4079:454;4074:3;;;;;:::i;:::-;;;;4036:497;;;;4550:12;4543:19;;;3895:675;;;;:::o;36807:1529::-;36872:20;36895:13;;36872:36;;36937:1;36923:16;;:2;:16;;;36919:48;;36948:19;;;;;;;;;;;;;;36919:48;36994:1;36982:8;:13;36978:44;;37004:18;;;;;;;;;;;;;;36978:44;37035:61;37065:1;37069:2;37073:12;37087:8;37035:21;:61::i;:::-;37578:1;20954:2;37549:1;:25;;37548:31;37536:8;:44;37510:18;:22;37529:2;37510:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;37857:139;37894:2;37948:33;37971:1;37975:2;37979:1;37948:14;:33::i;:::-;37915:30;37936:8;37915:20;:30::i;:::-;:66;37857:18;:139::i;:::-;37823:17;:31;37841:12;37823:31;;;;;;;;;;;:173;;;;38013:15;38031:12;38013:30;;38058:11;38087:8;38072:12;:23;38058:37;;38110:101;38162:9;;;;;;38158:2;38137:35;;38154:1;38137:35;;;;;;;;;;;;38206:3;38196:7;:13;38110:101;;38243:3;38227:13;:19;;;;37284:974;;38268:60;38297:1;38301:2;38305:12;38319:8;38268:20;:60::i;:::-;36861:1475;36807:1529;;:::o;4578:224::-;4646:13;4709:1;4703:4;4696:15;4738:1;4732:4;4725:15;4779:4;4773;4763:21;4754:30;;4578:224;;;;:::o;32340:322::-;32410:14;32641:1;32631:8;32628:15;32603:23;32599:45;32589:55;;32340:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334: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:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:329::-;6409:6;6458:2;6446:9;6437:7;6433:23;6429:32;6426:119;;;6464:79;;:::i;:::-;6426:119;6584:1;6609:53;6654:7;6645:6;6634:9;6630:22;6609:53;:::i;:::-;6599:63;;6555:117;6350:329;;;;:::o;6685:117::-;6794:1;6791;6784:12;6808:117;6917:1;6914;6907:12;6931:117;7040:1;7037;7030:12;7068:553;7126:8;7136:6;7186:3;7179:4;7171:6;7167:17;7163:27;7153:122;;7194:79;;:::i;:::-;7153:122;7307:6;7294:20;7284:30;;7337:18;7329:6;7326:30;7323:117;;;7359:79;;:::i;:::-;7323:117;7473:4;7465:6;7461:17;7449:29;;7527:3;7519:4;7511:6;7507:17;7497:8;7493:32;7490:41;7487:128;;;7534:79;;:::i;:::-;7487:128;7068:553;;;;;:::o;7627:529::-;7698:6;7706;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7909:1;7898:9;7894:17;7881:31;7939:18;7931:6;7928:30;7925:117;;;7961:79;;:::i;:::-;7925:117;8074:65;8131:7;8122:6;8111:9;8107:22;8074:65;:::i;:::-;8056:83;;;;7852:297;7627:529;;;;;:::o;8162:122::-;8235:24;8253:5;8235:24;:::i;:::-;8228:5;8225:35;8215:63;;8274:1;8271;8264:12;8215:63;8162:122;:::o;8290:139::-;8336:5;8374:6;8361:20;8352:29;;8390:33;8417:5;8390:33;:::i;:::-;8290:139;;;;:::o;8435:329::-;8494:6;8543:2;8531:9;8522:7;8518:23;8514:32;8511:119;;;8549:79;;:::i;:::-;8511:119;8669:1;8694:53;8739:7;8730:6;8719:9;8715:22;8694:53;:::i;:::-;8684:63;;8640:117;8435:329;;;;:::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:117::-;9614:1;9611;9604:12;9628:180;9676:77;9673:1;9666:88;9773:4;9770:1;9763:15;9797:4;9794:1;9787:15;9814:281;9897:27;9919:4;9897:27;:::i;:::-;9889:6;9885:40;10027:6;10015:10;10012:22;9991:18;9979:10;9976:34;9973:62;9970:88;;;10038:18;;:::i;:::-;9970:88;10078:10;10074:2;10067:22;9857:238;9814:281;;:::o;10101:129::-;10135:6;10162:20;;:::i;:::-;10152:30;;10191:33;10219:4;10211:6;10191:33;:::i;:::-;10101:129;;;:::o;10236:307::-;10297:4;10387:18;10379:6;10376:30;10373:56;;;10409:18;;:::i;:::-;10373:56;10447:29;10469:6;10447:29;:::i;:::-;10439:37;;10531:4;10525;10521:15;10513:23;;10236:307;;;:::o;10549:154::-;10633:6;10628:3;10623;10610:30;10695:1;10686:6;10681:3;10677:16;10670:27;10549:154;;;:::o;10709:410::-;10786:5;10811:65;10827:48;10868:6;10827:48;:::i;:::-;10811:65;:::i;:::-;10802:74;;10899:6;10892:5;10885:21;10937:4;10930:5;10926:16;10975:3;10966:6;10961:3;10957:16;10954:25;10951:112;;;10982:79;;:::i;:::-;10951:112;11072:41;11106:6;11101:3;11096;11072:41;:::i;:::-;10792:327;10709:410;;;;;:::o;11138:338::-;11193:5;11242:3;11235:4;11227:6;11223:17;11219:27;11209:122;;11250:79;;:::i;:::-;11209:122;11367:6;11354:20;11392:78;11466:3;11458:6;11451:4;11443:6;11439:17;11392:78;:::i;:::-;11383:87;;11199:277;11138:338;;;;:::o;11482:943::-;11577:6;11585;11593;11601;11650:3;11638:9;11629:7;11625:23;11621:33;11618:120;;;11657:79;;:::i;:::-;11618:120;11777:1;11802:53;11847:7;11838:6;11827:9;11823:22;11802:53;:::i;:::-;11792:63;;11748:117;11904:2;11930:53;11975:7;11966:6;11955:9;11951:22;11930:53;:::i;:::-;11920:63;;11875:118;12032:2;12058:53;12103:7;12094:6;12083:9;12079:22;12058:53;:::i;:::-;12048:63;;12003:118;12188:2;12177:9;12173:18;12160:32;12219:18;12211:6;12208:30;12205:117;;;12241:79;;:::i;:::-;12205:117;12346:62;12400:7;12391:6;12380:9;12376:22;12346:62;:::i;:::-;12336:72;;12131:287;11482:943;;;;;;;:::o;12431:311::-;12508:4;12598:18;12590:6;12587:30;12584:56;;;12620:18;;:::i;:::-;12584:56;12670:4;12662:6;12658:17;12650:25;;12730:4;12724;12720:15;12712:23;;12431:311;;;:::o;12765:710::-;12861:5;12886:81;12902:64;12959:6;12902:64;:::i;:::-;12886:81;:::i;:::-;12877:90;;12987:5;13016:6;13009:5;13002:21;13050:4;13043:5;13039:16;13032:23;;13103:4;13095:6;13091:17;13083:6;13079:30;13132:3;13124:6;13121:15;13118:122;;;13151:79;;:::i;:::-;13118:122;13266:6;13249:220;13283:6;13278:3;13275:15;13249:220;;;13358:3;13387:37;13420:3;13408:10;13387:37;:::i;:::-;13382:3;13375:50;13454:4;13449:3;13445:14;13438:21;;13325:144;13309:4;13304:3;13300:14;13293:21;;13249:220;;;13253:21;12867:608;;12765:710;;;;;:::o;13498:370::-;13569:5;13618:3;13611:4;13603:6;13599:17;13595:27;13585:122;;13626:79;;:::i;:::-;13585:122;13743:6;13730:20;13768:94;13858:3;13850:6;13843:4;13835:6;13831:17;13768:94;:::i;:::-;13759:103;;13575:293;13498:370;;;;:::o;13874:684::-;13967:6;13975;14024:2;14012:9;14003:7;13999:23;13995:32;13992:119;;;14030:79;;:::i;:::-;13992:119;14178:1;14167:9;14163:17;14150:31;14208:18;14200:6;14197:30;14194:117;;;14230:79;;:::i;:::-;14194:117;14335:78;14405:7;14396:6;14385:9;14381:22;14335:78;:::i;:::-;14325:88;;14121:302;14462:2;14488:53;14533:7;14524:6;14513:9;14509:22;14488:53;:::i;:::-;14478:63;;14433:118;13874:684;;;;;:::o;14564:::-;14657:6;14665;14714:2;14702:9;14693:7;14689:23;14685:32;14682:119;;;14720:79;;:::i;:::-;14682:119;14840:1;14865:53;14910:7;14901:6;14890:9;14886:22;14865:53;:::i;:::-;14855:63;;14811:117;14995:2;14984:9;14980:18;14967:32;15026:18;15018:6;15015:30;15012:117;;;15048:79;;:::i;:::-;15012:117;15153:78;15223:7;15214:6;15203:9;15199:22;15153:78;:::i;:::-;15143:88;;14938:303;14564:684;;;;;:::o;15254:474::-;15322:6;15330;15379:2;15367:9;15358:7;15354:23;15350:32;15347:119;;;15385:79;;:::i;:::-;15347:119;15505:1;15530:53;15575:7;15566:6;15555:9;15551:22;15530:53;:::i;:::-;15520:63;;15476:117;15632:2;15658:53;15703:7;15694:6;15683:9;15679:22;15658:53;:::i;:::-;15648:63;;15603:118;15254:474;;;;;:::o;15734:182::-;15874:34;15870:1;15862:6;15858:14;15851:58;15734:182;:::o;15922:366::-;16064:3;16085:67;16149:2;16144:3;16085:67;:::i;:::-;16078:74;;16161:93;16250:3;16161:93;:::i;:::-;16279:2;16274:3;16270:12;16263:19;;15922:366;;;:::o;16294:419::-;16460:4;16498:2;16487:9;16483:18;16475:26;;16547:9;16541:4;16537:20;16533:1;16522:9;16518:17;16511:47;16575:131;16701:4;16575:131;:::i;:::-;16567:139;;16294:419;;;:::o;16719:180::-;16767:77;16764:1;16757:88;16864:4;16861:1;16854:15;16888:4;16885:1;16878:15;16905:320;16949:6;16986:1;16980:4;16976:12;16966:22;;17033:1;17027:4;17023:12;17054:18;17044:81;;17110:4;17102:6;17098:17;17088:27;;17044:81;17172:2;17164:6;17161:14;17141:18;17138:38;17135:84;;17191:18;;:::i;:::-;17135:84;16956:269;16905:320;;;:::o;17231:147::-;17332:11;17369:3;17354:18;;17231:147;;;;:::o;17384:114::-;;:::o;17504:398::-;17663:3;17684:83;17765:1;17760:3;17684:83;:::i;:::-;17677:90;;17776:93;17865:3;17776:93;:::i;:::-;17894:1;17889:3;17885:11;17878:18;;17504:398;;;:::o;17908:379::-;18092:3;18114:147;18257:3;18114:147;:::i;:::-;18107:154;;18278:3;18271:10;;17908:379;;;:::o;18293:166::-;18433:18;18429:1;18421:6;18417:14;18410:42;18293:166;:::o;18465:366::-;18607:3;18628:67;18692:2;18687:3;18628:67;:::i;:::-;18621:74;;18704:93;18793:3;18704:93;:::i;:::-;18822:2;18817:3;18813:12;18806:19;;18465:366;;;:::o;18837:419::-;19003:4;19041:2;19030:9;19026:18;19018:26;;19090:9;19084:4;19080:20;19076:1;19065:9;19061:17;19054:47;19118:131;19244:4;19118:131;:::i;:::-;19110:139;;18837:419;;;:::o;19262:173::-;19402:25;19398:1;19390:6;19386:14;19379:49;19262:173;:::o;19441:366::-;19583:3;19604:67;19668:2;19663:3;19604:67;:::i;:::-;19597:74;;19680:93;19769:3;19680:93;:::i;:::-;19798:2;19793:3;19789:12;19782:19;;19441:366;;;:::o;19813:419::-;19979:4;20017:2;20006:9;20002:18;19994:26;;20066:9;20060:4;20056:20;20052:1;20041:9;20037:17;20030:47;20094:131;20220:4;20094:131;:::i;:::-;20086:139;;19813:419;;;:::o;20238:181::-;20378:33;20374:1;20366:6;20362:14;20355:57;20238:181;:::o;20425:366::-;20567:3;20588:67;20652:2;20647:3;20588:67;:::i;:::-;20581:74;;20664:93;20753:3;20664:93;:::i;:::-;20782:2;20777:3;20773:12;20766:19;;20425:366;;;:::o;20797:419::-;20963:4;21001:2;20990:9;20986:18;20978:26;;21050:9;21044:4;21040:20;21036:1;21025:9;21021:17;21014:47;21078:131;21204:4;21078:131;:::i;:::-;21070:139;;20797:419;;;:::o;21222:180::-;21362:32;21358:1;21350:6;21346:14;21339:56;21222:180;:::o;21408:366::-;21550:3;21571:67;21635:2;21630:3;21571:67;:::i;:::-;21564:74;;21647:93;21736:3;21647:93;:::i;:::-;21765:2;21760:3;21756:12;21749:19;;21408:366;;;:::o;21780:419::-;21946:4;21984:2;21973:9;21969:18;21961:26;;22033:9;22027:4;22023:20;22019:1;22008:9;22004:17;21997:47;22061:131;22187:4;22061:131;:::i;:::-;22053:139;;21780:419;;;:::o;22205:223::-;22345:34;22341:1;22333:6;22329:14;22322:58;22414:6;22409:2;22401:6;22397:15;22390:31;22205:223;:::o;22434:366::-;22576:3;22597:67;22661:2;22656:3;22597:67;:::i;:::-;22590:74;;22673:93;22762:3;22673:93;:::i;:::-;22791:2;22786:3;22782:12;22775:19;;22434:366;;;:::o;22806:419::-;22972:4;23010:2;22999:9;22995:18;22987:26;;23059:9;23053:4;23049:20;23045:1;23034:9;23030:17;23023:47;23087:131;23213:4;23087:131;:::i;:::-;23079:139;;22806:419;;;:::o;23231:229::-;23371:34;23367:1;23359:6;23355:14;23348:58;23440:12;23435:2;23427:6;23423:15;23416:37;23231:229;:::o;23466:366::-;23608:3;23629:67;23693:2;23688:3;23629:67;:::i;:::-;23622:74;;23705:93;23794:3;23705:93;:::i;:::-;23823:2;23818:3;23814:12;23807:19;;23466:366;;;:::o;23838:419::-;24004:4;24042:2;24031:9;24027:18;24019:26;;24091:9;24085:4;24081:20;24077:1;24066:9;24062:17;24055:47;24119:131;24245:4;24119:131;:::i;:::-;24111:139;;23838:419;;;:::o;24263:180::-;24311:77;24308:1;24301:88;24408:4;24405:1;24398:15;24432:4;24429:1;24422:15;24449:305;24489:3;24508:20;24526:1;24508:20;:::i;:::-;24503:25;;24542:20;24560:1;24542:20;:::i;:::-;24537:25;;24696:1;24628:66;24624:74;24621:1;24618:81;24615:107;;;24702:18;;:::i;:::-;24615:107;24746:1;24743;24739:9;24732:16;;24449:305;;;;:::o;24760:238::-;24900:34;24896:1;24888:6;24884:14;24877:58;24969:21;24964:2;24956:6;24952:15;24945:46;24760:238;:::o;25004:366::-;25146:3;25167:67;25231:2;25226:3;25167:67;:::i;:::-;25160:74;;25243:93;25332:3;25243:93;:::i;:::-;25361:2;25356:3;25352:12;25345:19;;25004:366;;;:::o;25376:419::-;25542:4;25580:2;25569:9;25565:18;25557:26;;25629:9;25623:4;25619:20;25615:1;25604:9;25600:17;25593:47;25657:131;25783:4;25657:131;:::i;:::-;25649:139;;25376:419;;;:::o;25801:348::-;25841:7;25864:20;25882:1;25864:20;:::i;:::-;25859:25;;25898:20;25916:1;25898:20;:::i;:::-;25893:25;;26086:1;26018:66;26014:74;26011:1;26008:81;26003:1;25996:9;25989:17;25985:105;25982:131;;;26093:18;;:::i;:::-;25982:131;26141:1;26138;26134:9;26123:20;;25801:348;;;;:::o;26155:169::-;26295:21;26291:1;26283:6;26279:14;26272:45;26155:169;:::o;26330:366::-;26472:3;26493:67;26557:2;26552:3;26493:67;:::i;:::-;26486:74;;26569:93;26658:3;26569:93;:::i;:::-;26687:2;26682:3;26678:12;26671:19;;26330:366;;;:::o;26702:419::-;26868:4;26906:2;26895:9;26891:18;26883:26;;26955:9;26949:4;26945:20;26941:1;26930:9;26926:17;26919:47;26983:131;27109:4;26983:131;:::i;:::-;26975:139;;26702:419;;;:::o;27127:227::-;27267:34;27263:1;27255:6;27251:14;27244:58;27336:10;27331:2;27323:6;27319:15;27312:35;27127:227;:::o;27360:366::-;27502:3;27523:67;27587:2;27582:3;27523:67;:::i;:::-;27516:74;;27599:93;27688:3;27599:93;:::i;:::-;27717:2;27712:3;27708:12;27701:19;;27360:366;;;:::o;27732:419::-;27898:4;27936:2;27925:9;27921:18;27913:26;;27985:9;27979:4;27975:20;27971:1;27960:9;27956:17;27949:47;28013:131;28139:4;28013:131;:::i;:::-;28005:139;;27732:419;;;:::o;28157:234::-;28297:34;28293:1;28285:6;28281:14;28274:58;28366:17;28361:2;28353:6;28349:15;28342:42;28157:234;:::o;28397:366::-;28539:3;28560:67;28624:2;28619:3;28560:67;:::i;:::-;28553:74;;28636:93;28725:3;28636:93;:::i;:::-;28754:2;28749:3;28745:12;28738:19;;28397:366;;;:::o;28769:419::-;28935:4;28973:2;28962:9;28958:18;28950:26;;29022:9;29016:4;29012:20;29008:1;28997:9;28993:17;28986:47;29050:131;29176:4;29050:131;:::i;:::-;29042:139;;28769:419;;;:::o;29194:148::-;29296:11;29333:3;29318:18;;29194:148;;;;:::o;29348:377::-;29454:3;29482:39;29515:5;29482:39;:::i;:::-;29537:89;29619:6;29614:3;29537:89;:::i;:::-;29530:96;;29635:52;29680:6;29675:3;29668:4;29661:5;29657:16;29635:52;:::i;:::-;29712:6;29707:3;29703:16;29696:23;;29458:267;29348:377;;;;:::o;29731:155::-;29871:7;29867:1;29859:6;29855:14;29848:31;29731:155;:::o;29892:400::-;30052:3;30073:84;30155:1;30150:3;30073:84;:::i;:::-;30066:91;;30166:93;30255:3;30166:93;:::i;:::-;30284:1;30279:3;30275:11;30268:18;;29892:400;;;:::o;30298:701::-;30579:3;30601:95;30692:3;30683:6;30601:95;:::i;:::-;30594:102;;30713:95;30804:3;30795:6;30713:95;:::i;:::-;30706:102;;30825:148;30969:3;30825:148;:::i;:::-;30818:155;;30990:3;30983:10;;30298:701;;;;;:::o;31005:222::-;31145:34;31141:1;31133:6;31129:14;31122:58;31214:5;31209:2;31201:6;31197:15;31190:30;31005:222;:::o;31233:366::-;31375:3;31396:67;31460:2;31455:3;31396:67;:::i;:::-;31389:74;;31472:93;31561:3;31472:93;:::i;:::-;31590:2;31585:3;31581:12;31574:19;;31233:366;;;:::o;31605:419::-;31771:4;31809:2;31798:9;31794:18;31786:26;;31858:9;31852:4;31848:20;31844:1;31833:9;31829:17;31822:47;31886:131;32012:4;31886:131;:::i;:::-;31878:139;;31605:419;;;:::o;32030:226::-;32170:34;32166:1;32158:6;32154:14;32147:58;32239:9;32234:2;32226:6;32222:15;32215:34;32030:226;:::o;32262:366::-;32404:3;32425:67;32489:2;32484:3;32425:67;:::i;:::-;32418:74;;32501:93;32590:3;32501:93;:::i;:::-;32619:2;32614:3;32610:12;32603:19;;32262:366;;;:::o;32634:419::-;32800:4;32838:2;32827:9;32823:18;32815:26;;32887:9;32881:4;32877:20;32873:1;32862:9;32858:17;32851:47;32915:131;33041:4;32915:131;:::i;:::-;32907:139;;32634:419;;;:::o;33059:226::-;33199:34;33195:1;33187:6;33183:14;33176:58;33268:9;33263:2;33255:6;33251:15;33244:34;33059:226;:::o;33291:366::-;33433:3;33454:67;33518:2;33513:3;33454:67;:::i;:::-;33447:74;;33530:93;33619:3;33530:93;:::i;:::-;33648:2;33643:3;33639:12;33632:19;;33291:366;;;:::o;33663:419::-;33829:4;33867:2;33856:9;33852:18;33844:26;;33916:9;33910:4;33906:20;33902:1;33891:9;33887:17;33880:47;33944:131;34070:4;33944:131;:::i;:::-;33936:139;;33663:419;;;:::o;34088:94::-;34121:8;34169:5;34165:2;34161:14;34140:35;;34088:94;;;:::o;34188:::-;34227:7;34256:20;34270:5;34256:20;:::i;:::-;34245:31;;34188:94;;;:::o;34288:100::-;34327:7;34356:26;34376:5;34356:26;:::i;:::-;34345:37;;34288:100;;;:::o;34394:157::-;34499:45;34519:24;34537:5;34519:24;:::i;:::-;34499:45;:::i;:::-;34494:3;34487:58;34394:157;;:::o;34557:256::-;34669:3;34684:75;34755:3;34746:6;34684:75;:::i;:::-;34784:2;34779:3;34775:12;34768:19;;34804:3;34797:10;;34557:256;;;;:::o;34819:180::-;34959:32;34955:1;34947:6;34943:14;34936:56;34819:180;:::o;35005:366::-;35147:3;35168:67;35232:2;35227:3;35168:67;:::i;:::-;35161:74;;35244:93;35333:3;35244:93;:::i;:::-;35362:2;35357:3;35353:12;35346:19;;35005:366;;;:::o;35377:419::-;35543:4;35581:2;35570:9;35566:18;35558:26;;35630:9;35624:4;35620:20;35616:1;35605:9;35601:17;35594:47;35658:131;35784:4;35658:131;:::i;:::-;35650:139;;35377:419;;;:::o;35802:225::-;35942:34;35938:1;35930:6;35926:14;35919:58;36011:8;36006:2;35998:6;35994:15;35987:33;35802:225;:::o;36033:366::-;36175:3;36196:67;36260:2;36255:3;36196:67;:::i;:::-;36189:74;;36272:93;36361:3;36272:93;:::i;:::-;36390:2;36385:3;36381:12;36374:19;;36033:366;;;:::o;36405:419::-;36571:4;36609:2;36598:9;36594:18;36586:26;;36658:9;36652:4;36648:20;36644:1;36633:9;36629:17;36622:47;36686:131;36812:4;36686:131;:::i;:::-;36678:139;;36405:419;;;:::o;36830:98::-;36881:6;36915:5;36909:12;36899:22;;36830:98;;;:::o;36934:168::-;37017:11;37051:6;37046:3;37039:19;37091:4;37086:3;37082:14;37067:29;;36934:168;;;;:::o;37108:360::-;37194:3;37222:38;37254:5;37222:38;:::i;:::-;37276:70;37339:6;37334:3;37276:70;:::i;:::-;37269:77;;37355:52;37400:6;37395:3;37388:4;37381:5;37377:16;37355:52;:::i;:::-;37432:29;37454:6;37432:29;:::i;:::-;37427:3;37423:39;37416:46;;37198:270;37108:360;;;;:::o;37474:640::-;37669:4;37707:3;37696:9;37692:19;37684:27;;37721:71;37789:1;37778:9;37774:17;37765:6;37721:71;:::i;:::-;37802:72;37870:2;37859:9;37855:18;37846:6;37802:72;:::i;:::-;37884;37952:2;37941:9;37937:18;37928:6;37884:72;:::i;:::-;38003:9;37997:4;37993:20;37988:2;37977:9;37973:18;37966:48;38031:76;38102:4;38093:6;38031:76;:::i;:::-;38023:84;;37474:640;;;;;;;:::o;38120:141::-;38176:5;38207:6;38201:13;38192:22;;38223:32;38249:5;38223:32;:::i;:::-;38120:141;;;;:::o;38267:349::-;38336:6;38385:2;38373:9;38364:7;38360:23;38356:32;38353:119;;;38391:79;;:::i;:::-;38353:119;38511:1;38536:63;38591:7;38582:6;38571:9;38567:22;38536:63;:::i;:::-;38526:73;;38482:127;38267:349;;;;:::o;38622:233::-;38661:3;38684:24;38702:5;38684:24;:::i;:::-;38675:33;;38730:66;38723:5;38720:77;38717:103;;38800:18;;:::i;:::-;38717:103;38847:1;38840:5;38836:13;38829:20;;38622:233;;;:::o;38861:180::-;38909:77;38906:1;38899:88;39006:4;39003:1;38996:15;39030:4;39027:1;39020:15;39047:185;39087:1;39104:20;39122:1;39104:20;:::i;:::-;39099:25;;39138:20;39156:1;39138:20;:::i;:::-;39133:25;;39177:1;39167:35;;39182:18;;:::i;:::-;39167:35;39224:1;39221;39217:9;39212:14;;39047:185;;;;:::o;39238:191::-;39278:4;39298:20;39316:1;39298:20;:::i;:::-;39293:25;;39332:20;39350:1;39332:20;:::i;:::-;39327:25;;39371:1;39368;39365:8;39362:34;;;39376:18;;:::i;:::-;39362:34;39421:1;39418;39414:9;39406:17;;39238:191;;;;:::o;39435:176::-;39467:1;39484:20;39502:1;39484:20;:::i;:::-;39479:25;;39518:20;39536:1;39518:20;:::i;:::-;39513:25;;39557:1;39547:35;;39562:18;;:::i;:::-;39547:35;39603:1;39600;39596:9;39591:14;;39435:176;;;;:::o;39617:180::-;39665:77;39662:1;39655:88;39762:4;39759:1;39752:15;39786:4;39783:1;39776:15

Swarm Source

ipfs://6c409418bcc300ef3e37f4e83e10d6748acbfa227e3f0094b720a13d10f71091
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.