ETH Price: $3,102.46 (+0.48%)

Token

Bad Bunny (BBUN)
 

Overview

Max Total Supply

10,000 BBUN

Holders

439

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 BBUN
0xd4e56eebb6001cd7b56eaedec097d988efcba73b
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BadBunny

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: contracts/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

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

// File: contracts/OperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

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

// File: contracts/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores 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 via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 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`,
     * 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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

    /**
     * @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](https://eips.ethereum.org/EIPS/eip-2309) 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.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // 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 `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID 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 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual 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 virtual {
        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;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    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: [ERC165](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.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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 '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

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

    /**
     * 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 initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(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 `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 virtual {
        uint256 startTokenId = _currentIndex;
        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 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _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 virtual {
        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 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 virtual {
        _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 Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @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) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(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++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        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 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 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;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

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

// File: erc721a/contracts/extensions/IERC721AQueryable.sol


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

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

// File: erc721a/contracts/extensions/ERC721AQueryable.sol


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

pragma solidity ^0.8.4;



/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

// File: contracts/badbunny.sol


pragma solidity ^0.8.13;






contract BadBunny is ERC721AQueryable, DefaultOperatorFilterer, Ownable, Pausable {
    uint256 public MAX_MINTS = 500;
    uint256 public MAX_SUPPLY = 10000;
    uint256 public price = 0.00222 ether;
    
    string public baseURI;

    bool claimActive = false;

    uint256 public mintCounter = 0;
    uint256 public wlMintCounter = 0;
    uint256 public airDropCounter = 0;
    uint256 public claimCounter = 0;

    mapping(uint256 => bool) public BADtracker;
    mapping(uint256 => bool) public BTFDtracker;

    IERC721 public BADDIES;
    IERC721 public BTFD;

    string public extension = ".json";
    
    constructor(address _BADDIES, address _BTFD) ERC721A("Bad Bunny", "BBUN") {
        BADDIES = IERC721(_BADDIES);
        BTFD = IERC721(_BTFD);
        toggleAllMintPause();
    }

    function mint(uint256 quantity) external payable whenNotPaused {
        require(quantity + _numberMinted(msg.sender) <= MAX_MINTS, "mint: Exceeded the limit per wallet");
        require(totalSupply() + quantity <= MAX_SUPPLY, "mint: Not enough tokens left");
        require(msg.value >= (price * quantity), "mint: Not enough ether sent");

        mintCounter += quantity;
        _safeMint(msg.sender, quantity);
    }

    function airDrop(address[] calldata addrs, uint256 quantity) external onlyOwner {
        uint256 len = addrs.length;
        require(totalSupply() + (quantity * len) <= MAX_SUPPLY, "airDrop: Not enough tokens to airdrop");
        airDropCounter += quantity * len;
        for (uint256 i = 0; i < len; i++) {
            _safeMint(addrs[i], quantity);
        }
    }

    /*
        Front end must get IDs of wallet and send a matching length arrays.
        This will ensure a 1:1 free mint.
        'BADtracker(id)' and 'BTFDtracker(id)' to verify if a token has been used in a claim
    */
    function partnerClaim(uint256[] calldata BADids, uint256[] calldata BTFDids) external whenNotPaused {
        require(claimActive == true, "partnerClaim: is not active");
        require(BADids.length == BTFDids.length, "partnerClaim: Id array lengths to not match");
        uint256 len = BADids.length;
        for (uint256 i = 0; i < len; i++) {
            //Check BAD ids
            require(BADDIES.ownerOf(BADids[i]) == msg.sender, "partnerClaim: sender is not owner of ID");
            require(BADtracker[BADids[i]] == false, "partnerClaim: BAD ID has already been used in a claim");
            BADtracker[BADids[i]] = true;

            //Check BTFD Ids
            require(BTFD.ownerOf(BTFDids[i]) == msg.sender, "partnerClaim: sender is not owner of ID");
            require(BTFDtracker[BTFDids[i]] == false, "partnerClaim: BTFD ID has already been used in a claim");
            BTFDtracker[BTFDids[i]] = true;
        }

        claimCounter += len;
        _safeMint(msg.sender, len);
    }


    /* 
        These functions will return true an array of used ids
    */
    function checkBTFDids(uint256[] calldata _ids) external view returns(uint256[] memory usedIDs) {
        usedIDs = new uint256[](_ids.length);
        uint256 x = 0;
        
        for (uint256 i = 0; i < _ids.length; i++) {
            if (BTFDtracker[_ids[i]]) {
                usedIDs[x] = _ids[i];
                x++;
            }
        }
        return usedIDs;
    }

    function checkBADids(uint256[] calldata _ids) external view returns(uint256[] memory usedIDs) {
        usedIDs = new uint256[](_ids.length);
        uint256 x = 0;

        for (uint256 i = 0; i < _ids.length; i++) {
            if (BADtracker[_ids[i]]) {
                usedIDs[x] = _ids[i];
                x++;
            }
        }
        return usedIDs;
    }

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

    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }
    
    function tokenURI(uint256 tokenId) 
        public 
        view 
        override(ERC721A, IERC721A) 
        returns (string memory) 
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), extension)) : '';
    }

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

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

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

    //ADMIN

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function setMaxMint(uint256 _max) external onlyOwner {
        MAX_MINTS = _max;
    }

    function toogleClaimActive(bool state) external onlyOwner {
        claimActive = state;
    }

    function toggleAllMintPause() public onlyOwner {
        paused() ? _unpause() : _pause();
    }

    function setBaseURI(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

    function updateMaxSupply(uint256 _max) external onlyOwner {
        MAX_SUPPLY = _max;
    }

    function withdraw() external onlyOwner {
        require(address(this).balance > 0, "withdraw: contract balance must be greater than 0"); 
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_BADDIES","type":"address"},{"internalType":"address","name":"_BTFD","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BADDIES","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"BADtracker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BTFD","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"BTFDtracker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airDropCounter","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":"payable","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":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"checkBADids","outputs":[{"internalType":"uint256[]","name":"usedIDs","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"checkBTFDids","outputs":[{"internalType":"uint256[]","name":"usedIDs","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"BADids","type":"uint256[]"},{"internalType":"uint256[]","name":"BTFDids","type":"uint256[]"}],"name":"partnerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleAllMintPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"toogleClaimActive","outputs":[],"stateMutability":"nonpayable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526101f4600955612710600a556607e3140766c000600b556000600d60006101000a81548160ff0219169083151502179055506000600e556000600f55600060105560006011556040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506016908051906020019062000097929190620007ee565b50348015620000a557600080fd5b5060405162005abe38038062005abe8339818101604052810190620000cb919062000908565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600981526020017f4261642042756e6e7900000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4242554e00000000000000000000000000000000000000000000000000000000815250816002908051906020019062000166929190620007ee565b5080600390805190602001906200017f929190620007ee565b50620001906200046460201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200038d57801562000253576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200021992919062000960565b600060405180830381600087803b1580156200023457600080fd5b505af115801562000249573d6000803e3d6000fd5b505050506200038c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200030d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002d392919062000960565b600060405180830381600087803b158015620002ee57600080fd5b505af115801562000303573d6000803e3d6000fd5b505050506200038b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200035691906200098d565b600060405180830381600087803b1580156200037157600080fd5b505af115801562000386573d6000803e3d6000fd5b505050505b5b5b5050620003af620003a36200046d60201b60201c565b6200047560201b60201c565b6000600860146101000a81548160ff02191690831515021790555081601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200045c6200053b60201b60201c565b505062000b75565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200054b6200058960201b60201c565b6200055b6200061a60201b60201c565b6200057657620005706200063160201b60201c565b62000587565b62000586620006a660201b60201c565b5b565b620005996200046d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005bf6200071b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000618576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200060f9062000a0b565b60405180910390fd5b565b6000600860149054906101000a900460ff16905090565b620006416200074560201b60201c565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200068d6200046d60201b60201c565b6040516200069c91906200098d565b60405180910390a1565b620006b66200079a60201b60201c565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa620007026200046d60201b60201c565b6040516200071191906200098d565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007556200061a60201b60201c565b1562000798576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200078f9062000a7d565b60405180910390fd5b565b620007aa6200061a60201b60201c565b620007ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007e39062000aef565b60405180910390fd5b565b828054620007fc9062000b40565b90600052602060002090601f0160209004810192826200082057600085556200086c565b82601f106200083b57805160ff19168380011785556200086c565b828001600101855582156200086c579182015b828111156200086b5782518255916020019190600101906200084e565b5b5090506200087b91906200087f565b5090565b5b808211156200089a57600081600090555060010162000880565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d082620008a3565b9050919050565b620008e281620008c3565b8114620008ee57600080fd5b50565b6000815190506200090281620008d7565b92915050565b600080604083850312156200092257620009216200089e565b5b60006200093285828601620008f1565b92505060206200094585828601620008f1565b9150509250929050565b6200095a81620008c3565b82525050565b60006040820190506200097760008301856200094f565b6200098660208301846200094f565b9392505050565b6000602082019050620009a460008301846200094f565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620009f3602083620009aa565b915062000a0082620009bb565b602082019050919050565b6000602082019050818103600083015262000a2681620009e4565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600062000a65601083620009aa565b915062000a728262000a2d565b602082019050919050565b6000602082019050818103600083015262000a988162000a56565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600062000ad7601483620009aa565b915062000ae48262000a9f565b602082019050919050565b6000602082019050818103600083015262000b0a8162000ac8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b5957607f821691505b60208210810362000b6f5762000b6e62000b11565b5b50919050565b614f398062000b856000396000f3fe6080604052600436106102885760003560e01c8063715018a61161015a578063b82180f1116100c1578063d13bb9cd1161007a578063d13bb9cd146109c9578063e985e9c5146109f4578063eb2a8dd714610a31578063f103b43314610a5a578063f2fde38b14610a83578063fd1fc4a014610aac57610288565b8063b82180f1146108a2578063b88d4fde146108df578063c01b3766146108fb578063c23dc68f14610924578063c87b56dd14610961578063cce132d11461099e57610288565b806399a2557a1161011357806399a2557a1461077b578063a035b1fe146107b8578063a0712d68146107e3578063a22cb465146107ff578063a235f9b014610828578063b59bb11b1461086557610288565b8063715018a61461067d57806373be8f92146106945780638462151c146106bf5780638da5cb5b146106fc57806391b7f5ed1461072757806395d89b411461075057610288565b80633ccfd60b116101fe5780635bbb2177116101b75780635bbb2177146105335780635c975abb146105705780636352211e1461059b5780636c0360eb146105d85780636ea35ab11461060357806370a082311461064057610288565b80633ccfd60b1461045857806342842e0e1461046f57806346aa52ce1461048b5780634efa8f17146104b6578063547520fe146104e157806355f804b31461050a57610288565b80631a62dae4116102505780631a62dae41461037957806323b872dd146103a4578063274a32d3146103c05780632a125a5b146103d75780632d5537b01461040257806332cb6b0c1461042d57610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b31461033257806318160ddd1461034e575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906137b0565b610ad5565b6040516102c191906137f8565b60405180910390f35b3480156102d657600080fd5b506102df610b67565b6040516102ec91906138ac565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613904565b610bf9565b6040516103299190613972565b60405180910390f35b61034c600480360381019061034791906139b9565b610c78565b005b34801561035a57600080fd5b50610363610dbc565b6040516103709190613a08565b60405180910390f35b34801561038557600080fd5b5061038e610dd3565b60405161039b9190613a08565b60405180910390f35b6103be60048036038101906103b99190613a23565b610dd9565b005b3480156103cc57600080fd5b506103d5610fbb565b005b3480156103e357600080fd5b506103ec610fe7565b6040516103f99190613ad5565b60405180910390f35b34801561040e57600080fd5b5061041761100d565b60405161042491906138ac565b60405180910390f35b34801561043957600080fd5b5061044261109b565b60405161044f9190613a08565b60405180910390f35b34801561046457600080fd5b5061046d6110a1565b005b61048960048036038101906104849190613a23565b61113b565b005b34801561049757600080fd5b506104a061131d565b6040516104ad9190613a08565b60405180910390f35b3480156104c257600080fd5b506104cb611323565b6040516104d89190613a08565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190613904565b611329565b005b34801561051657600080fd5b50610531600480360381019061052c9190613c25565b61133b565b005b34801561053f57600080fd5b5061055a60048036038101906105559190613cce565b61135d565b6040516105679190613e7e565b60405180910390f35b34801561057c57600080fd5b50610585611420565b60405161059291906137f8565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd9190613904565b611437565b6040516105cf9190613972565b60405180910390f35b3480156105e457600080fd5b506105ed611449565b6040516105fa91906138ac565b60405180910390f35b34801561060f57600080fd5b5061062a60048036038101906106259190613904565b6114d7565b60405161063791906137f8565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190613ea0565b6114f7565b6040516106749190613a08565b60405180910390f35b34801561068957600080fd5b506106926115af565b005b3480156106a057600080fd5b506106a96115c3565b6040516106b69190613a08565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190613ea0565b6115c9565b6040516106f39190613f8b565b60405180910390f35b34801561070857600080fd5b5061071161170c565b60405161071e9190613972565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190613904565b611736565b005b34801561075c57600080fd5b50610765611748565b60405161077291906138ac565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613fad565b6117da565b6040516107af9190613f8b565b60405180910390f35b3480156107c457600080fd5b506107cd6119e6565b6040516107da9190613a08565b60405180910390f35b6107fd60048036038101906107f89190613904565b6119ec565b005b34801561080b57600080fd5b506108266004803603810190610821919061402c565b611b19565b005b34801561083457600080fd5b5061084f600480360381019061084a9190613cce565b611c24565b60405161085c9190613f8b565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613904565b611d25565b60405161089991906137f8565b60405180910390f35b3480156108ae57600080fd5b506108c960048036038101906108c49190613cce565b611d45565b6040516108d69190613f8b565b60405180910390f35b6108f960048036038101906108f4919061410d565b611e46565b005b34801561090757600080fd5b50610922600480360381019061091d9190614190565b61202b565b005b34801561093057600080fd5b5061094b60048036038101906109469190613904565b6124f0565b6040516109589190614266565b60405180910390f35b34801561096d57600080fd5b5061098860048036038101906109839190613904565b61255a565b60405161099591906138ac565b60405180910390f35b3480156109aa57600080fd5b506109b36125fc565b6040516109c09190613a08565b60405180910390f35b3480156109d557600080fd5b506109de612602565b6040516109eb9190613ad5565b60405180910390f35b348015610a0057600080fd5b50610a1b6004803603810190610a169190614281565b612628565b604051610a2891906137f8565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a5391906142c1565b6126bc565b005b348015610a6657600080fd5b50610a816004803603810190610a7c9190613904565b6126e1565b005b348015610a8f57600080fd5b50610aaa6004803603810190610aa59190613ea0565b6126f3565b005b348015610ab857600080fd5b50610ad36004803603810190610ace9190614344565b612776565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b605750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b76906143d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba2906143d3565b8015610bef5780601f10610bc457610100808354040283529160200191610bef565b820191906000526020600020905b815481529060010190602001808311610bd257829003601f168201915b5050505050905090565b6000610c0482612862565b610c3a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8382611437565b90508073ffffffffffffffffffffffffffffffffffffffff16610ca46128c1565b73ffffffffffffffffffffffffffffffffffffffff1614610d0757610cd081610ccb6128c1565b612628565b610d06576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610dc66128c9565b6001546000540303905090565b600f5481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fa9573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e4b57610e468484846128d2565b610fb5565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e94929190614404565b602060405180830381865afa158015610eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed59190614442565b8015610f6757506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f25929190614404565b602060405180830381865afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f669190614442565b5b610fa857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f9f9190613972565b60405180910390fd5b5b610fb48484846128d2565b5b50505050565b610fc3612bf4565b610fcb611420565b610fdc57610fd7612c72565b610fe5565b610fe4612cd5565b5b565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6016805461101a906143d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611046906143d3565b80156110935780601f1061106857610100808354040283529160200191611093565b820191906000526020600020905b81548152906001019060200180831161107657829003601f168201915b505050505081565b600a5481565b6110a9612bf4565b600047116110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e3906144e1565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611137573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561130b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111ad576111a8848484612d38565b611317565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111f6929190614404565b602060405180830381865afa158015611213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112379190614442565b80156112c957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611287929190614404565b602060405180830381865afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190614442565b5b61130a57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016113019190613972565b60405180910390fd5b5b611316848484612d38565b5b50505050565b600e5481565b60115481565b611331612bf4565b8060098190555050565b611343612bf4565b80600c9080519060200190611359929190613652565b5050565b6060600083839050905060008167ffffffffffffffff81111561138357611382613afa565b5b6040519080825280602002602001820160405280156113bc57816020015b6113a96136d8565b8152602001906001900390816113a15790505b50905060005b828114611414576113eb8686838181106113df576113de614501565b5b905060200201356124f0565b8282815181106113fe576113fd614501565b5b60200260200101819052508060010190506113c2565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b600061144282612d58565b9050919050565b600c8054611456906143d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611482906143d3565b80156114cf5780601f106114a4576101008083540402835291602001916114cf565b820191906000526020600020905b8154815290600101906020018083116114b257829003601f168201915b505050505081565b60136020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361155e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115b7612bf4565b6115c16000612e24565b565b60105481565b606060008060006115d9856114f7565b905060008167ffffffffffffffff8111156115f7576115f6613afa565b5b6040519080825280602002602001820160405280156116255781602001602082028036833780820191505090505b5090506116306136d8565b600061163a6128c9565b90505b8386146116fe5761164d81612eea565b915081604001516116f357600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461169857816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036116f257808387806001019850815181106116e5576116e4614501565b5b6020026020010181815250505b5b80600101905061163d565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61173e612bf4565b80600b8190555050565b606060038054611757906143d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611783906143d3565b80156117d05780601f106117a5576101008083540402835291602001916117d0565b820191906000526020600020905b8154815290600101906020018083116117b357829003601f168201915b5050505050905090565b6060818310611815576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611820612f15565b905061182a6128c9565b85101561183c576118396128c9565b94505b80841115611848578093505b6000611853876114f7565b905084861015611876576000868603905081811015611870578091505b5061187b565b600090505b60008167ffffffffffffffff81111561189757611896613afa565b5b6040519080825280602002602001820160405280156118c55781602001602082028036833780820191505090505b509050600082036118dc57809450505050506119df565b60006118e7886124f0565b9050600081604001516118fc57816000015190505b60008990505b8881141580156119125750848714155b156119d15761192081612eea565b925082604001516119c657600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461196b57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119c557808488806001019950815181106119b8576119b7614501565b5b6020026020010181815250505b5b806001019050611902565b508583528296505050505050505b9392505050565b600b5481565b6119f4612f1e565b600954611a0033612f68565b82611a0b919061455f565b1115611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614627565b60405180910390fd5b600a5481611a58610dbc565b611a62919061455f565b1115611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90614693565b60405180910390fd5b80600b54611ab191906146b3565b341015611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90614759565b60405180910390fd5b80600e6000828254611b05919061455f565b92505081905550611b163382612fbf565b50565b8060076000611b266128c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bd36128c1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c1891906137f8565b60405180910390a35050565b60608282905067ffffffffffffffff811115611c4357611c42613afa565b5b604051908082528060200260200182016040528015611c715781602001602082028036833780820191505090505b5090506000805b84849050811015611d1d5760126000868684818110611c9a57611c99614501565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615611d0a57848482818110611cd557611cd4614501565b5b90506020020135838381518110611cef57611cee614501565b5b6020026020010181815250508180611d0690614779565b9250505b8080611d1590614779565b915050611c78565b505092915050565b60126020528060005260406000206000915054906101000a900460ff1681565b60608282905067ffffffffffffffff811115611d6457611d63613afa565b5b604051908082528060200260200182016040528015611d925781602001602082028036833780820191505090505b5090506000805b84849050811015611e3e5760136000868684818110611dbb57611dba614501565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615611e2b57848482818110611df657611df5614501565b5b90506020020135838381518110611e1057611e0f614501565b5b6020026020010181815250508180611e2790614779565b9250505b8080611e3690614779565b915050611d99565b505092915050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612017573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eb957611eb485858585612fdd565b612024565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f02929190614404565b602060405180830381865afa158015611f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f439190614442565b8015611fd557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611f93929190614404565b602060405180830381865afa158015611fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd49190614442565b5b61201657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161200d9190613972565b60405180910390fd5b5b61202385858585612fdd565b5b5050505050565b612033612f1e565b60011515600d60009054906101000a900460ff16151514612089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120809061480d565b60405180910390fd5b8181905084849050146120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c89061489f565b60405180910390fd5b600084849050905060005b818110156124c5573373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e88888581811061214c5761214b614501565b5b905060200201356040518263ffffffff1660e01b815260040161216f9190613a08565b602060405180830381865afa15801561218c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b091906148d4565b73ffffffffffffffffffffffffffffffffffffffff1614612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd90614973565b60405180910390fd5b600015156012600088888581811061222157612220614501565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16151514612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614a05565b60405180910390fd5b60016012600088888581811061229f5761229e614501565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061233357612332614501565b5b905060200201356040518263ffffffff1660e01b81526004016123569190613a08565b602060405180830381865afa158015612373573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239791906148d4565b73ffffffffffffffffffffffffffffffffffffffff16146123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490614973565b60405180910390fd5b600015156013600086868581811061240857612407614501565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615151461246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490614a97565b60405180910390fd5b60016013600086868581811061248657612485614501565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806124bd90614779565b9150506120dc565b5080601160008282546124d8919061455f565b925050819055506124e93382612fbf565b5050505050565b6124f86136d8565b6125006136d8565b6125086128c9565b83108061251c5750612518612f15565b8310155b1561252a5780915050612555565b61253383612eea565b90508060400151156125485780915050612555565b61255183613050565b9150505b919050565b606061256582612862565b61259b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c80546125aa906143d3565b9050036125c657604051806020016040528060008152506125f5565b600c6125d183613070565b60166040516020016125e593929190614b87565b6040516020818303038152906040525b9050919050565b60095481565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126c4612bf4565b80600d60006101000a81548160ff02191690831515021790555050565b6126e9612bf4565b80600a8190555050565b6126fb612bf4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190614c2a565b60405180910390fd5b61277381612e24565b50565b61277e612bf4565b6000838390509050600a54818361279591906146b3565b61279d610dbc565b6127a7919061455f565b11156127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df90614cbc565b60405180910390fd5b80826127f491906146b3565b60106000828254612805919061455f565b9250508190555060005b8181101561285b5761284885858381811061282d5761282c614501565b5b90506020020160208101906128429190613ea0565b84612fbf565b808061285390614779565b91505061280f565b5050505050565b60008161286d6128c9565b1115801561287c575060005482105b80156128ba575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60006128dd82612d58565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612944576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612950846130c0565b9150915061296681876129616128c1565b6130e7565b6129b25761297b866129766128c1565b612628565b6129b1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a18576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a25868686600161312b565b8015612a3057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612afe85612ada888887613131565b7c020000000000000000000000000000000000000000000000000000000017613159565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612b845760006001850190506000600460008381526020019081526020016000205403612b82576000548114612b81578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bec8686866001613184565b505050505050565b612bfc61318a565b73ffffffffffffffffffffffffffffffffffffffff16612c1a61170c565b73ffffffffffffffffffffffffffffffffffffffff1614612c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6790614d28565b60405180910390fd5b565b612c7a612f1e565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612cbe61318a565b604051612ccb9190613972565b60405180910390a1565b612cdd613192565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d2161318a565b604051612d2e9190613972565b60405180910390a1565b612d5383838360405180602001604052806000815250611e46565b505050565b60008082905080612d676128c9565b11612ded57600054811015612dec5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612dea575b60008103612de0576004600083600190039350838152602001908152602001600020549050612db6565b8092505050612e1f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ef26136d8565b612f0e60046000848152602001908152602001600020546131db565b9050919050565b60008054905090565b612f26611420565b15612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90614d94565b60405180910390fd5b565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612fd9828260405180602001604052806000815250613291565b5050565b612fe8848484610dd9565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461304a576130138484848461332e565b613049576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6130586136d8565b61306961306483612d58565b6131db565b9050919050565b606060a060405101806040526020810391506000825281835b6001156130ab57600184039350600a81066030018453600a8104905080613089575b50828103602084039350808452505050919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861314886868461347e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b61319a611420565b6131d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d090614e00565b60405180910390fd5b565b6131e36136d8565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b61329b8383613487565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461332957600080549050600083820390505b6132db600086838060010194508661332e565b613311576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106132c857816000541461332657600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133546128c1565b8786866040518563ffffffff1660e01b81526004016133769493929190614e75565b6020604051808303816000875af19250505080156133b257506040513d601f19601f820116820180604052508101906133af9190614ed6565b60015b61342b573d80600081146133e2576040519150601f19603f3d011682016040523d82523d6000602084013e6133e7565b606091505b506000815103613423576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b600080549050600082036134c7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134d4600084838561312b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061354b8361353c6000866000613131565b61354585613642565b17613159565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146135ec57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506135b1565b5060008203613627576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061363d6000848385613184565b505050565b60006001821460e11b9050919050565b82805461365e906143d3565b90600052602060002090601f01602090048101928261368057600085556136c7565b82601f1061369957805160ff19168380011785556136c7565b828001600101855582156136c7579182015b828111156136c65782518255916020019190600101906136ab565b5b5090506136d49190613727565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115613740576000816000905550600101613728565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61378d81613758565b811461379857600080fd5b50565b6000813590506137aa81613784565b92915050565b6000602082840312156137c6576137c561374e565b5b60006137d48482850161379b565b91505092915050565b60008115159050919050565b6137f2816137dd565b82525050565b600060208201905061380d60008301846137e9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561384d578082015181840152602081019050613832565b8381111561385c576000848401525b50505050565b6000601f19601f8301169050919050565b600061387e82613813565b613888818561381e565b935061389881856020860161382f565b6138a181613862565b840191505092915050565b600060208201905081810360008301526138c68184613873565b905092915050565b6000819050919050565b6138e1816138ce565b81146138ec57600080fd5b50565b6000813590506138fe816138d8565b92915050565b60006020828403121561391a5761391961374e565b5b6000613928848285016138ef565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061395c82613931565b9050919050565b61396c81613951565b82525050565b60006020820190506139876000830184613963565b92915050565b61399681613951565b81146139a157600080fd5b50565b6000813590506139b38161398d565b92915050565b600080604083850312156139d0576139cf61374e565b5b60006139de858286016139a4565b92505060206139ef858286016138ef565b9150509250929050565b613a02816138ce565b82525050565b6000602082019050613a1d60008301846139f9565b92915050565b600080600060608486031215613a3c57613a3b61374e565b5b6000613a4a868287016139a4565b9350506020613a5b868287016139a4565b9250506040613a6c868287016138ef565b9150509250925092565b6000819050919050565b6000613a9b613a96613a9184613931565b613a76565b613931565b9050919050565b6000613aad82613a80565b9050919050565b6000613abf82613aa2565b9050919050565b613acf81613ab4565b82525050565b6000602082019050613aea6000830184613ac6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b3282613862565b810181811067ffffffffffffffff82111715613b5157613b50613afa565b5b80604052505050565b6000613b64613744565b9050613b708282613b29565b919050565b600067ffffffffffffffff821115613b9057613b8f613afa565b5b613b9982613862565b9050602081019050919050565b82818337600083830152505050565b6000613bc8613bc384613b75565b613b5a565b905082815260208101848484011115613be457613be3613af5565b5b613bef848285613ba6565b509392505050565b600082601f830112613c0c57613c0b613af0565b5b8135613c1c848260208601613bb5565b91505092915050565b600060208284031215613c3b57613c3a61374e565b5b600082013567ffffffffffffffff811115613c5957613c58613753565b5b613c6584828501613bf7565b91505092915050565b600080fd5b600080fd5b60008083601f840112613c8e57613c8d613af0565b5b8235905067ffffffffffffffff811115613cab57613caa613c6e565b5b602083019150836020820283011115613cc757613cc6613c73565b5b9250929050565b60008060208385031215613ce557613ce461374e565b5b600083013567ffffffffffffffff811115613d0357613d02613753565b5b613d0f85828601613c78565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d5081613951565b82525050565b600067ffffffffffffffff82169050919050565b613d7381613d56565b82525050565b613d82816137dd565b82525050565b600062ffffff82169050919050565b613da081613d88565b82525050565b608082016000820151613dbc6000850182613d47565b506020820151613dcf6020850182613d6a565b506040820151613de26040850182613d79565b506060820151613df56060850182613d97565b50505050565b6000613e078383613da6565b60808301905092915050565b6000602082019050919050565b6000613e2b82613d1b565b613e358185613d26565b9350613e4083613d37565b8060005b83811015613e71578151613e588882613dfb565b9750613e6383613e13565b925050600181019050613e44565b5085935050505092915050565b60006020820190508181036000830152613e988184613e20565b905092915050565b600060208284031215613eb657613eb561374e565b5b6000613ec4848285016139a4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f02816138ce565b82525050565b6000613f148383613ef9565b60208301905092915050565b6000602082019050919050565b6000613f3882613ecd565b613f428185613ed8565b9350613f4d83613ee9565b8060005b83811015613f7e578151613f658882613f08565b9750613f7083613f20565b925050600181019050613f51565b5085935050505092915050565b60006020820190508181036000830152613fa58184613f2d565b905092915050565b600080600060608486031215613fc657613fc561374e565b5b6000613fd4868287016139a4565b9350506020613fe5868287016138ef565b9250506040613ff6868287016138ef565b9150509250925092565b614009816137dd565b811461401457600080fd5b50565b60008135905061402681614000565b92915050565b600080604083850312156140435761404261374e565b5b6000614051858286016139a4565b925050602061406285828601614017565b9150509250929050565b600067ffffffffffffffff82111561408757614086613afa565b5b61409082613862565b9050602081019050919050565b60006140b06140ab8461406c565b613b5a565b9050828152602081018484840111156140cc576140cb613af5565b5b6140d7848285613ba6565b509392505050565b600082601f8301126140f4576140f3613af0565b5b813561410484826020860161409d565b91505092915050565b600080600080608085870312156141275761412661374e565b5b6000614135878288016139a4565b9450506020614146878288016139a4565b9350506040614157878288016138ef565b925050606085013567ffffffffffffffff81111561417857614177613753565b5b614184878288016140df565b91505092959194509250565b600080600080604085870312156141aa576141a961374e565b5b600085013567ffffffffffffffff8111156141c8576141c7613753565b5b6141d487828801613c78565b9450945050602085013567ffffffffffffffff8111156141f7576141f6613753565b5b61420387828801613c78565b925092505092959194509250565b6080820160008201516142276000850182613d47565b50602082015161423a6020850182613d6a565b50604082015161424d6040850182613d79565b5060608201516142606060850182613d97565b50505050565b600060808201905061427b6000830184614211565b92915050565b600080604083850312156142985761429761374e565b5b60006142a6858286016139a4565b92505060206142b7858286016139a4565b9150509250929050565b6000602082840312156142d7576142d661374e565b5b60006142e584828501614017565b91505092915050565b60008083601f84011261430457614303613af0565b5b8235905067ffffffffffffffff81111561432157614320613c6e565b5b60208301915083602082028301111561433d5761433c613c73565b5b9250929050565b60008060006040848603121561435d5761435c61374e565b5b600084013567ffffffffffffffff81111561437b5761437a613753565b5b614387868287016142ee565b9350935050602061439a868287016138ef565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143eb57607f821691505b6020821081036143fe576143fd6143a4565b5b50919050565b60006040820190506144196000830185613963565b6144266020830184613963565b9392505050565b60008151905061443c81614000565b92915050565b6000602082840312156144585761445761374e565b5b60006144668482850161442d565b91505092915050565b7f77697468647261773a20636f6e74726163742062616c616e6365206d7573742060008201527f62652067726561746572207468616e2030000000000000000000000000000000602082015250565b60006144cb60318361381e565b91506144d68261446f565b604082019050919050565b600060208201905081810360008301526144fa816144be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061456a826138ce565b9150614575836138ce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145aa576145a9614530565b5b828201905092915050565b7f6d696e743a20457863656564656420746865206c696d6974207065722077616c60008201527f6c65740000000000000000000000000000000000000000000000000000000000602082015250565b600061461160238361381e565b915061461c826145b5565b604082019050919050565b6000602082019050818103600083015261464081614604565b9050919050565b7f6d696e743a204e6f7420656e6f75676820746f6b656e73206c65667400000000600082015250565b600061467d601c8361381e565b915061468882614647565b602082019050919050565b600060208201905081810360008301526146ac81614670565b9050919050565b60006146be826138ce565b91506146c9836138ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561470257614701614530565b5b828202905092915050565b7f6d696e743a204e6f7420656e6f7567682065746865722073656e740000000000600082015250565b6000614743601b8361381e565b915061474e8261470d565b602082019050919050565b6000602082019050818103600083015261477281614736565b9050919050565b6000614784826138ce565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147b6576147b5614530565b5b600182019050919050565b7f706172746e6572436c61696d3a206973206e6f74206163746976650000000000600082015250565b60006147f7601b8361381e565b9150614802826147c1565b602082019050919050565b60006020820190508181036000830152614826816147ea565b9050919050565b7f706172746e6572436c61696d3a204964206172726179206c656e67746873207460008201527f6f206e6f74206d61746368000000000000000000000000000000000000000000602082015250565b6000614889602b8361381e565b91506148948261482d565b604082019050919050565b600060208201905081810360008301526148b88161487c565b9050919050565b6000815190506148ce8161398d565b92915050565b6000602082840312156148ea576148e961374e565b5b60006148f8848285016148bf565b91505092915050565b7f706172746e6572436c61696d3a2073656e646572206973206e6f74206f776e6560008201527f72206f6620494400000000000000000000000000000000000000000000000000602082015250565b600061495d60278361381e565b915061496882614901565b604082019050919050565b6000602082019050818103600083015261498c81614950565b9050919050565b7f706172746e6572436c61696d3a204241442049442068617320616c726561647960008201527f206265656e207573656420696e206120636c61696d0000000000000000000000602082015250565b60006149ef60358361381e565b91506149fa82614993565b604082019050919050565b60006020820190508181036000830152614a1e816149e2565b9050919050565b7f706172746e6572436c61696d3a20425446442049442068617320616c7265616460008201527f79206265656e207573656420696e206120636c61696d00000000000000000000602082015250565b6000614a8160368361381e565b9150614a8c82614a25565b604082019050919050565b60006020820190508181036000830152614ab081614a74565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614ae4816143d3565b614aee8186614ab7565b94506001821660008114614b095760018114614b1a57614b4d565b60ff19831686528186019350614b4d565b614b2385614ac2565b60005b83811015614b4557815481890152600182019150602081019050614b26565b838801955050505b50505092915050565b6000614b6182613813565b614b6b8185614ab7565b9350614b7b81856020860161382f565b80840191505092915050565b6000614b938286614ad7565b9150614b9f8285614b56565b9150614bab8284614ad7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c1460268361381e565b9150614c1f82614bb8565b604082019050919050565b60006020820190508181036000830152614c4381614c07565b9050919050565b7f61697244726f703a204e6f7420656e6f75676820746f6b656e7320746f20616960008201527f7264726f70000000000000000000000000000000000000000000000000000000602082015250565b6000614ca660258361381e565b9150614cb182614c4a565b604082019050919050565b60006020820190508181036000830152614cd581614c99565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d1260208361381e565b9150614d1d82614cdc565b602082019050919050565b60006020820190508181036000830152614d4181614d05565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614d7e60108361381e565b9150614d8982614d48565b602082019050919050565b60006020820190508181036000830152614dad81614d71565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614dea60148361381e565b9150614df582614db4565b602082019050919050565b60006020820190508181036000830152614e1981614ddd565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614e4782614e20565b614e518185614e2b565b9350614e6181856020860161382f565b614e6a81613862565b840191505092915050565b6000608082019050614e8a6000830187613963565b614e976020830186613963565b614ea460408301856139f9565b8181036060830152614eb68184614e3c565b905095945050505050565b600081519050614ed081613784565b92915050565b600060208284031215614eec57614eeb61374e565b5b6000614efa84828501614ec1565b9150509291505056fea2646970667358221220638d27f70ed489d0d1247538932b605aebfc093fcfbebc96331864e9d9bdb3b164736f6c634300080d003300000000000000000000000087212aa99f65611f6d67e0fbad76d06478753704000000000000000000000000e83dd605b70b47c8af86580bdd4fcb987ff36e60

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063715018a61161015a578063b82180f1116100c1578063d13bb9cd1161007a578063d13bb9cd146109c9578063e985e9c5146109f4578063eb2a8dd714610a31578063f103b43314610a5a578063f2fde38b14610a83578063fd1fc4a014610aac57610288565b8063b82180f1146108a2578063b88d4fde146108df578063c01b3766146108fb578063c23dc68f14610924578063c87b56dd14610961578063cce132d11461099e57610288565b806399a2557a1161011357806399a2557a1461077b578063a035b1fe146107b8578063a0712d68146107e3578063a22cb465146107ff578063a235f9b014610828578063b59bb11b1461086557610288565b8063715018a61461067d57806373be8f92146106945780638462151c146106bf5780638da5cb5b146106fc57806391b7f5ed1461072757806395d89b411461075057610288565b80633ccfd60b116101fe5780635bbb2177116101b75780635bbb2177146105335780635c975abb146105705780636352211e1461059b5780636c0360eb146105d85780636ea35ab11461060357806370a082311461064057610288565b80633ccfd60b1461045857806342842e0e1461046f57806346aa52ce1461048b5780634efa8f17146104b6578063547520fe146104e157806355f804b31461050a57610288565b80631a62dae4116102505780631a62dae41461037957806323b872dd146103a4578063274a32d3146103c05780632a125a5b146103d75780632d5537b01461040257806332cb6b0c1461042d57610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b31461033257806318160ddd1461034e575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906137b0565b610ad5565b6040516102c191906137f8565b60405180910390f35b3480156102d657600080fd5b506102df610b67565b6040516102ec91906138ac565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613904565b610bf9565b6040516103299190613972565b60405180910390f35b61034c600480360381019061034791906139b9565b610c78565b005b34801561035a57600080fd5b50610363610dbc565b6040516103709190613a08565b60405180910390f35b34801561038557600080fd5b5061038e610dd3565b60405161039b9190613a08565b60405180910390f35b6103be60048036038101906103b99190613a23565b610dd9565b005b3480156103cc57600080fd5b506103d5610fbb565b005b3480156103e357600080fd5b506103ec610fe7565b6040516103f99190613ad5565b60405180910390f35b34801561040e57600080fd5b5061041761100d565b60405161042491906138ac565b60405180910390f35b34801561043957600080fd5b5061044261109b565b60405161044f9190613a08565b60405180910390f35b34801561046457600080fd5b5061046d6110a1565b005b61048960048036038101906104849190613a23565b61113b565b005b34801561049757600080fd5b506104a061131d565b6040516104ad9190613a08565b60405180910390f35b3480156104c257600080fd5b506104cb611323565b6040516104d89190613a08565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190613904565b611329565b005b34801561051657600080fd5b50610531600480360381019061052c9190613c25565b61133b565b005b34801561053f57600080fd5b5061055a60048036038101906105559190613cce565b61135d565b6040516105679190613e7e565b60405180910390f35b34801561057c57600080fd5b50610585611420565b60405161059291906137f8565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd9190613904565b611437565b6040516105cf9190613972565b60405180910390f35b3480156105e457600080fd5b506105ed611449565b6040516105fa91906138ac565b60405180910390f35b34801561060f57600080fd5b5061062a60048036038101906106259190613904565b6114d7565b60405161063791906137f8565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190613ea0565b6114f7565b6040516106749190613a08565b60405180910390f35b34801561068957600080fd5b506106926115af565b005b3480156106a057600080fd5b506106a96115c3565b6040516106b69190613a08565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190613ea0565b6115c9565b6040516106f39190613f8b565b60405180910390f35b34801561070857600080fd5b5061071161170c565b60405161071e9190613972565b60405180910390f35b34801561073357600080fd5b5061074e60048036038101906107499190613904565b611736565b005b34801561075c57600080fd5b50610765611748565b60405161077291906138ac565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613fad565b6117da565b6040516107af9190613f8b565b60405180910390f35b3480156107c457600080fd5b506107cd6119e6565b6040516107da9190613a08565b60405180910390f35b6107fd60048036038101906107f89190613904565b6119ec565b005b34801561080b57600080fd5b506108266004803603810190610821919061402c565b611b19565b005b34801561083457600080fd5b5061084f600480360381019061084a9190613cce565b611c24565b60405161085c9190613f8b565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613904565b611d25565b60405161089991906137f8565b60405180910390f35b3480156108ae57600080fd5b506108c960048036038101906108c49190613cce565b611d45565b6040516108d69190613f8b565b60405180910390f35b6108f960048036038101906108f4919061410d565b611e46565b005b34801561090757600080fd5b50610922600480360381019061091d9190614190565b61202b565b005b34801561093057600080fd5b5061094b60048036038101906109469190613904565b6124f0565b6040516109589190614266565b60405180910390f35b34801561096d57600080fd5b5061098860048036038101906109839190613904565b61255a565b60405161099591906138ac565b60405180910390f35b3480156109aa57600080fd5b506109b36125fc565b6040516109c09190613a08565b60405180910390f35b3480156109d557600080fd5b506109de612602565b6040516109eb9190613ad5565b60405180910390f35b348015610a0057600080fd5b50610a1b6004803603810190610a169190614281565b612628565b604051610a2891906137f8565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a5391906142c1565b6126bc565b005b348015610a6657600080fd5b50610a816004803603810190610a7c9190613904565b6126e1565b005b348015610a8f57600080fd5b50610aaa6004803603810190610aa59190613ea0565b6126f3565b005b348015610ab857600080fd5b50610ad36004803603810190610ace9190614344565b612776565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b605750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b76906143d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba2906143d3565b8015610bef5780601f10610bc457610100808354040283529160200191610bef565b820191906000526020600020905b815481529060010190602001808311610bd257829003601f168201915b5050505050905090565b6000610c0482612862565b610c3a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8382611437565b90508073ffffffffffffffffffffffffffffffffffffffff16610ca46128c1565b73ffffffffffffffffffffffffffffffffffffffff1614610d0757610cd081610ccb6128c1565b612628565b610d06576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610dc66128c9565b6001546000540303905090565b600f5481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fa9573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e4b57610e468484846128d2565b610fb5565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610e94929190614404565b602060405180830381865afa158015610eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed59190614442565b8015610f6757506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f25929190614404565b602060405180830381865afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f669190614442565b5b610fa857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f9f9190613972565b60405180910390fd5b5b610fb48484846128d2565b5b50505050565b610fc3612bf4565b610fcb611420565b610fdc57610fd7612c72565b610fe5565b610fe4612cd5565b5b565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6016805461101a906143d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611046906143d3565b80156110935780601f1061106857610100808354040283529160200191611093565b820191906000526020600020905b81548152906001019060200180831161107657829003601f168201915b505050505081565b600a5481565b6110a9612bf4565b600047116110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e3906144e1565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611137573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561130b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111ad576111a8848484612d38565b611317565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016111f6929190614404565b602060405180830381865afa158015611213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112379190614442565b80156112c957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611287929190614404565b602060405180830381865afa1580156112a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c89190614442565b5b61130a57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016113019190613972565b60405180910390fd5b5b611316848484612d38565b5b50505050565b600e5481565b60115481565b611331612bf4565b8060098190555050565b611343612bf4565b80600c9080519060200190611359929190613652565b5050565b6060600083839050905060008167ffffffffffffffff81111561138357611382613afa565b5b6040519080825280602002602001820160405280156113bc57816020015b6113a96136d8565b8152602001906001900390816113a15790505b50905060005b828114611414576113eb8686838181106113df576113de614501565b5b905060200201356124f0565b8282815181106113fe576113fd614501565b5b60200260200101819052508060010190506113c2565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b600061144282612d58565b9050919050565b600c8054611456906143d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611482906143d3565b80156114cf5780601f106114a4576101008083540402835291602001916114cf565b820191906000526020600020905b8154815290600101906020018083116114b257829003601f168201915b505050505081565b60136020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361155e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115b7612bf4565b6115c16000612e24565b565b60105481565b606060008060006115d9856114f7565b905060008167ffffffffffffffff8111156115f7576115f6613afa565b5b6040519080825280602002602001820160405280156116255781602001602082028036833780820191505090505b5090506116306136d8565b600061163a6128c9565b90505b8386146116fe5761164d81612eea565b915081604001516116f357600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461169857816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036116f257808387806001019850815181106116e5576116e4614501565b5b6020026020010181815250505b5b80600101905061163d565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61173e612bf4565b80600b8190555050565b606060038054611757906143d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611783906143d3565b80156117d05780601f106117a5576101008083540402835291602001916117d0565b820191906000526020600020905b8154815290600101906020018083116117b357829003601f168201915b5050505050905090565b6060818310611815576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611820612f15565b905061182a6128c9565b85101561183c576118396128c9565b94505b80841115611848578093505b6000611853876114f7565b905084861015611876576000868603905081811015611870578091505b5061187b565b600090505b60008167ffffffffffffffff81111561189757611896613afa565b5b6040519080825280602002602001820160405280156118c55781602001602082028036833780820191505090505b509050600082036118dc57809450505050506119df565b60006118e7886124f0565b9050600081604001516118fc57816000015190505b60008990505b8881141580156119125750848714155b156119d15761192081612eea565b925082604001516119c657600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461196b57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119c557808488806001019950815181106119b8576119b7614501565b5b6020026020010181815250505b5b806001019050611902565b508583528296505050505050505b9392505050565b600b5481565b6119f4612f1e565b600954611a0033612f68565b82611a0b919061455f565b1115611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614627565b60405180910390fd5b600a5481611a58610dbc565b611a62919061455f565b1115611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90614693565b60405180910390fd5b80600b54611ab191906146b3565b341015611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90614759565b60405180910390fd5b80600e6000828254611b05919061455f565b92505081905550611b163382612fbf565b50565b8060076000611b266128c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bd36128c1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c1891906137f8565b60405180910390a35050565b60608282905067ffffffffffffffff811115611c4357611c42613afa565b5b604051908082528060200260200182016040528015611c715781602001602082028036833780820191505090505b5090506000805b84849050811015611d1d5760126000868684818110611c9a57611c99614501565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615611d0a57848482818110611cd557611cd4614501565b5b90506020020135838381518110611cef57611cee614501565b5b6020026020010181815250508180611d0690614779565b9250505b8080611d1590614779565b915050611c78565b505092915050565b60126020528060005260406000206000915054906101000a900460ff1681565b60608282905067ffffffffffffffff811115611d6457611d63613afa565b5b604051908082528060200260200182016040528015611d925781602001602082028036833780820191505090505b5090506000805b84849050811015611e3e5760136000868684818110611dbb57611dba614501565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615611e2b57848482818110611df657611df5614501565b5b90506020020135838381518110611e1057611e0f614501565b5b6020026020010181815250508180611e2790614779565b9250505b8080611e3690614779565b915050611d99565b505092915050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612017573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eb957611eb485858585612fdd565b612024565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f02929190614404565b602060405180830381865afa158015611f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f439190614442565b8015611fd557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611f93929190614404565b602060405180830381865afa158015611fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd49190614442565b5b61201657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161200d9190613972565b60405180910390fd5b5b61202385858585612fdd565b5b5050505050565b612033612f1e565b60011515600d60009054906101000a900460ff16151514612089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120809061480d565b60405180910390fd5b8181905084849050146120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c89061489f565b60405180910390fd5b600084849050905060005b818110156124c5573373ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e88888581811061214c5761214b614501565b5b905060200201356040518263ffffffff1660e01b815260040161216f9190613a08565b602060405180830381865afa15801561218c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b091906148d4565b73ffffffffffffffffffffffffffffffffffffffff1614612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd90614973565b60405180910390fd5b600015156012600088888581811061222157612220614501565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16151514612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614a05565b60405180910390fd5b60016012600088888581811061229f5761229e614501565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061233357612332614501565b5b905060200201356040518263ffffffff1660e01b81526004016123569190613a08565b602060405180830381865afa158015612373573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239791906148d4565b73ffffffffffffffffffffffffffffffffffffffff16146123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490614973565b60405180910390fd5b600015156013600086868581811061240857612407614501565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1615151461246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490614a97565b60405180910390fd5b60016013600086868581811061248657612485614501565b5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080806124bd90614779565b9150506120dc565b5080601160008282546124d8919061455f565b925050819055506124e93382612fbf565b5050505050565b6124f86136d8565b6125006136d8565b6125086128c9565b83108061251c5750612518612f15565b8310155b1561252a5780915050612555565b61253383612eea565b90508060400151156125485780915050612555565b61255183613050565b9150505b919050565b606061256582612862565b61259b576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c80546125aa906143d3565b9050036125c657604051806020016040528060008152506125f5565b600c6125d183613070565b60166040516020016125e593929190614b87565b6040516020818303038152906040525b9050919050565b60095481565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126c4612bf4565b80600d60006101000a81548160ff02191690831515021790555050565b6126e9612bf4565b80600a8190555050565b6126fb612bf4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190614c2a565b60405180910390fd5b61277381612e24565b50565b61277e612bf4565b6000838390509050600a54818361279591906146b3565b61279d610dbc565b6127a7919061455f565b11156127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df90614cbc565b60405180910390fd5b80826127f491906146b3565b60106000828254612805919061455f565b9250508190555060005b8181101561285b5761284885858381811061282d5761282c614501565b5b90506020020160208101906128429190613ea0565b84612fbf565b808061285390614779565b91505061280f565b5050505050565b60008161286d6128c9565b1115801561287c575060005482105b80156128ba575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60006128dd82612d58565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612944576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612950846130c0565b9150915061296681876129616128c1565b6130e7565b6129b25761297b866129766128c1565b612628565b6129b1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a18576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a25868686600161312b565b8015612a3057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612afe85612ada888887613131565b7c020000000000000000000000000000000000000000000000000000000017613159565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612b845760006001850190506000600460008381526020019081526020016000205403612b82576000548114612b81578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bec8686866001613184565b505050505050565b612bfc61318a565b73ffffffffffffffffffffffffffffffffffffffff16612c1a61170c565b73ffffffffffffffffffffffffffffffffffffffff1614612c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6790614d28565b60405180910390fd5b565b612c7a612f1e565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612cbe61318a565b604051612ccb9190613972565b60405180910390a1565b612cdd613192565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d2161318a565b604051612d2e9190613972565b60405180910390a1565b612d5383838360405180602001604052806000815250611e46565b505050565b60008082905080612d676128c9565b11612ded57600054811015612dec5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612dea575b60008103612de0576004600083600190039350838152602001908152602001600020549050612db6565b8092505050612e1f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ef26136d8565b612f0e60046000848152602001908152602001600020546131db565b9050919050565b60008054905090565b612f26611420565b15612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90614d94565b60405180910390fd5b565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612fd9828260405180602001604052806000815250613291565b5050565b612fe8848484610dd9565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461304a576130138484848461332e565b613049576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6130586136d8565b61306961306483612d58565b6131db565b9050919050565b606060a060405101806040526020810391506000825281835b6001156130ab57600184039350600a81066030018453600a8104905080613089575b50828103602084039350808452505050919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861314886868461347e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b61319a611420565b6131d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d090614e00565b60405180910390fd5b565b6131e36136d8565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b61329b8383613487565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461332957600080549050600083820390505b6132db600086838060010194508661332e565b613311576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106132c857816000541461332657600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133546128c1565b8786866040518563ffffffff1660e01b81526004016133769493929190614e75565b6020604051808303816000875af19250505080156133b257506040513d601f19601f820116820180604052508101906133af9190614ed6565b60015b61342b573d80600081146133e2576040519150601f19603f3d011682016040523d82523d6000602084013e6133e7565b606091505b506000815103613423576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b600080549050600082036134c7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134d4600084838561312b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061354b8361353c6000866000613131565b61354585613642565b17613159565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146135ec57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506135b1565b5060008203613627576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061363d6000848385613184565b505050565b60006001821460e11b9050919050565b82805461365e906143d3565b90600052602060002090601f01602090048101928261368057600085556136c7565b82601f1061369957805160ff19168380011785556136c7565b828001600101855582156136c7579182015b828111156136c65782518255916020019190600101906136ab565b5b5090506136d49190613727565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115613740576000816000905550600101613728565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61378d81613758565b811461379857600080fd5b50565b6000813590506137aa81613784565b92915050565b6000602082840312156137c6576137c561374e565b5b60006137d48482850161379b565b91505092915050565b60008115159050919050565b6137f2816137dd565b82525050565b600060208201905061380d60008301846137e9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561384d578082015181840152602081019050613832565b8381111561385c576000848401525b50505050565b6000601f19601f8301169050919050565b600061387e82613813565b613888818561381e565b935061389881856020860161382f565b6138a181613862565b840191505092915050565b600060208201905081810360008301526138c68184613873565b905092915050565b6000819050919050565b6138e1816138ce565b81146138ec57600080fd5b50565b6000813590506138fe816138d8565b92915050565b60006020828403121561391a5761391961374e565b5b6000613928848285016138ef565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061395c82613931565b9050919050565b61396c81613951565b82525050565b60006020820190506139876000830184613963565b92915050565b61399681613951565b81146139a157600080fd5b50565b6000813590506139b38161398d565b92915050565b600080604083850312156139d0576139cf61374e565b5b60006139de858286016139a4565b92505060206139ef858286016138ef565b9150509250929050565b613a02816138ce565b82525050565b6000602082019050613a1d60008301846139f9565b92915050565b600080600060608486031215613a3c57613a3b61374e565b5b6000613a4a868287016139a4565b9350506020613a5b868287016139a4565b9250506040613a6c868287016138ef565b9150509250925092565b6000819050919050565b6000613a9b613a96613a9184613931565b613a76565b613931565b9050919050565b6000613aad82613a80565b9050919050565b6000613abf82613aa2565b9050919050565b613acf81613ab4565b82525050565b6000602082019050613aea6000830184613ac6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b3282613862565b810181811067ffffffffffffffff82111715613b5157613b50613afa565b5b80604052505050565b6000613b64613744565b9050613b708282613b29565b919050565b600067ffffffffffffffff821115613b9057613b8f613afa565b5b613b9982613862565b9050602081019050919050565b82818337600083830152505050565b6000613bc8613bc384613b75565b613b5a565b905082815260208101848484011115613be457613be3613af5565b5b613bef848285613ba6565b509392505050565b600082601f830112613c0c57613c0b613af0565b5b8135613c1c848260208601613bb5565b91505092915050565b600060208284031215613c3b57613c3a61374e565b5b600082013567ffffffffffffffff811115613c5957613c58613753565b5b613c6584828501613bf7565b91505092915050565b600080fd5b600080fd5b60008083601f840112613c8e57613c8d613af0565b5b8235905067ffffffffffffffff811115613cab57613caa613c6e565b5b602083019150836020820283011115613cc757613cc6613c73565b5b9250929050565b60008060208385031215613ce557613ce461374e565b5b600083013567ffffffffffffffff811115613d0357613d02613753565b5b613d0f85828601613c78565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d5081613951565b82525050565b600067ffffffffffffffff82169050919050565b613d7381613d56565b82525050565b613d82816137dd565b82525050565b600062ffffff82169050919050565b613da081613d88565b82525050565b608082016000820151613dbc6000850182613d47565b506020820151613dcf6020850182613d6a565b506040820151613de26040850182613d79565b506060820151613df56060850182613d97565b50505050565b6000613e078383613da6565b60808301905092915050565b6000602082019050919050565b6000613e2b82613d1b565b613e358185613d26565b9350613e4083613d37565b8060005b83811015613e71578151613e588882613dfb565b9750613e6383613e13565b925050600181019050613e44565b5085935050505092915050565b60006020820190508181036000830152613e988184613e20565b905092915050565b600060208284031215613eb657613eb561374e565b5b6000613ec4848285016139a4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f02816138ce565b82525050565b6000613f148383613ef9565b60208301905092915050565b6000602082019050919050565b6000613f3882613ecd565b613f428185613ed8565b9350613f4d83613ee9565b8060005b83811015613f7e578151613f658882613f08565b9750613f7083613f20565b925050600181019050613f51565b5085935050505092915050565b60006020820190508181036000830152613fa58184613f2d565b905092915050565b600080600060608486031215613fc657613fc561374e565b5b6000613fd4868287016139a4565b9350506020613fe5868287016138ef565b9250506040613ff6868287016138ef565b9150509250925092565b614009816137dd565b811461401457600080fd5b50565b60008135905061402681614000565b92915050565b600080604083850312156140435761404261374e565b5b6000614051858286016139a4565b925050602061406285828601614017565b9150509250929050565b600067ffffffffffffffff82111561408757614086613afa565b5b61409082613862565b9050602081019050919050565b60006140b06140ab8461406c565b613b5a565b9050828152602081018484840111156140cc576140cb613af5565b5b6140d7848285613ba6565b509392505050565b600082601f8301126140f4576140f3613af0565b5b813561410484826020860161409d565b91505092915050565b600080600080608085870312156141275761412661374e565b5b6000614135878288016139a4565b9450506020614146878288016139a4565b9350506040614157878288016138ef565b925050606085013567ffffffffffffffff81111561417857614177613753565b5b614184878288016140df565b91505092959194509250565b600080600080604085870312156141aa576141a961374e565b5b600085013567ffffffffffffffff8111156141c8576141c7613753565b5b6141d487828801613c78565b9450945050602085013567ffffffffffffffff8111156141f7576141f6613753565b5b61420387828801613c78565b925092505092959194509250565b6080820160008201516142276000850182613d47565b50602082015161423a6020850182613d6a565b50604082015161424d6040850182613d79565b5060608201516142606060850182613d97565b50505050565b600060808201905061427b6000830184614211565b92915050565b600080604083850312156142985761429761374e565b5b60006142a6858286016139a4565b92505060206142b7858286016139a4565b9150509250929050565b6000602082840312156142d7576142d661374e565b5b60006142e584828501614017565b91505092915050565b60008083601f84011261430457614303613af0565b5b8235905067ffffffffffffffff81111561432157614320613c6e565b5b60208301915083602082028301111561433d5761433c613c73565b5b9250929050565b60008060006040848603121561435d5761435c61374e565b5b600084013567ffffffffffffffff81111561437b5761437a613753565b5b614387868287016142ee565b9350935050602061439a868287016138ef565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143eb57607f821691505b6020821081036143fe576143fd6143a4565b5b50919050565b60006040820190506144196000830185613963565b6144266020830184613963565b9392505050565b60008151905061443c81614000565b92915050565b6000602082840312156144585761445761374e565b5b60006144668482850161442d565b91505092915050565b7f77697468647261773a20636f6e74726163742062616c616e6365206d7573742060008201527f62652067726561746572207468616e2030000000000000000000000000000000602082015250565b60006144cb60318361381e565b91506144d68261446f565b604082019050919050565b600060208201905081810360008301526144fa816144be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061456a826138ce565b9150614575836138ce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145aa576145a9614530565b5b828201905092915050565b7f6d696e743a20457863656564656420746865206c696d6974207065722077616c60008201527f6c65740000000000000000000000000000000000000000000000000000000000602082015250565b600061461160238361381e565b915061461c826145b5565b604082019050919050565b6000602082019050818103600083015261464081614604565b9050919050565b7f6d696e743a204e6f7420656e6f75676820746f6b656e73206c65667400000000600082015250565b600061467d601c8361381e565b915061468882614647565b602082019050919050565b600060208201905081810360008301526146ac81614670565b9050919050565b60006146be826138ce565b91506146c9836138ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561470257614701614530565b5b828202905092915050565b7f6d696e743a204e6f7420656e6f7567682065746865722073656e740000000000600082015250565b6000614743601b8361381e565b915061474e8261470d565b602082019050919050565b6000602082019050818103600083015261477281614736565b9050919050565b6000614784826138ce565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147b6576147b5614530565b5b600182019050919050565b7f706172746e6572436c61696d3a206973206e6f74206163746976650000000000600082015250565b60006147f7601b8361381e565b9150614802826147c1565b602082019050919050565b60006020820190508181036000830152614826816147ea565b9050919050565b7f706172746e6572436c61696d3a204964206172726179206c656e67746873207460008201527f6f206e6f74206d61746368000000000000000000000000000000000000000000602082015250565b6000614889602b8361381e565b91506148948261482d565b604082019050919050565b600060208201905081810360008301526148b88161487c565b9050919050565b6000815190506148ce8161398d565b92915050565b6000602082840312156148ea576148e961374e565b5b60006148f8848285016148bf565b91505092915050565b7f706172746e6572436c61696d3a2073656e646572206973206e6f74206f776e6560008201527f72206f6620494400000000000000000000000000000000000000000000000000602082015250565b600061495d60278361381e565b915061496882614901565b604082019050919050565b6000602082019050818103600083015261498c81614950565b9050919050565b7f706172746e6572436c61696d3a204241442049442068617320616c726561647960008201527f206265656e207573656420696e206120636c61696d0000000000000000000000602082015250565b60006149ef60358361381e565b91506149fa82614993565b604082019050919050565b60006020820190508181036000830152614a1e816149e2565b9050919050565b7f706172746e6572436c61696d3a20425446442049442068617320616c7265616460008201527f79206265656e207573656420696e206120636c61696d00000000000000000000602082015250565b6000614a8160368361381e565b9150614a8c82614a25565b604082019050919050565b60006020820190508181036000830152614ab081614a74565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614ae4816143d3565b614aee8186614ab7565b94506001821660008114614b095760018114614b1a57614b4d565b60ff19831686528186019350614b4d565b614b2385614ac2565b60005b83811015614b4557815481890152600182019150602081019050614b26565b838801955050505b50505092915050565b6000614b6182613813565b614b6b8185614ab7565b9350614b7b81856020860161382f565b80840191505092915050565b6000614b938286614ad7565b9150614b9f8285614b56565b9150614bab8284614ad7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c1460268361381e565b9150614c1f82614bb8565b604082019050919050565b60006020820190508181036000830152614c4381614c07565b9050919050565b7f61697244726f703a204e6f7420656e6f75676820746f6b656e7320746f20616960008201527f7264726f70000000000000000000000000000000000000000000000000000000602082015250565b6000614ca660258361381e565b9150614cb182614c4a565b604082019050919050565b60006020820190508181036000830152614cd581614c99565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d1260208361381e565b9150614d1d82614cdc565b602082019050919050565b60006020820190508181036000830152614d4181614d05565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614d7e60108361381e565b9150614d8982614d48565b602082019050919050565b60006020820190508181036000830152614dad81614d71565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614dea60148361381e565b9150614df582614db4565b602082019050919050565b60006020820190508181036000830152614e1981614ddd565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614e4782614e20565b614e518185614e2b565b9350614e6181856020860161382f565b614e6a81613862565b840191505092915050565b6000608082019050614e8a6000830187613963565b614e976020830186613963565b614ea460408301856139f9565b8181036060830152614eb68184614e3c565b905095945050505050565b600081519050614ed081613784565b92915050565b600060208284031215614eec57614eeb61374e565b5b6000614efa84828501614ec1565b9150509291505056fea2646970667358221220638d27f70ed489d0d1247538932b605aebfc093fcfbebc96331864e9d9bdb3b164736f6c634300080d0033

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

00000000000000000000000087212aa99f65611f6d67e0fbad76d06478753704000000000000000000000000e83dd605b70b47c8af86580bdd4fcb987ff36e60

-----Decoded View---------------
Arg [0] : _BADDIES (address): 0x87212Aa99f65611F6D67E0fBAD76d06478753704
Arg [1] : _BTFD (address): 0xe83DD605b70B47c8aF86580bdD4FCb987FF36e60

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000087212aa99f65611f6d67e0fbad76d06478753704
Arg [1] : 000000000000000000000000e83dd605b70b47c8af86580bdd4fcb987ff36e60


Deployed Bytecode Sourcemap

77159:5964:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35078:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35980:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42471:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41904:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31731:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77474:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81499:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82566:98;;;;;;;;;;;;;:::i;:::-;;77694:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77751:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77285;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82874:244;;;;;;;;;;;;;:::i;:::-;;81738:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77437:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77553:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82366:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82672:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72301:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7201:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37373:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77374:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77642:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32915:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10066:103;;;;;;;;;;;;;:::i;:::-;;77513:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76177:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9418:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82272:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36156:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73217:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77325:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77988:429;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43029:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80551:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77593:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80153:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81985:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79038:1025;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71714:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81152:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77248:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77723:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43420:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82462:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82772:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10324:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78425:375;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35078:639;35163:4;35502:10;35487:25;;:11;:25;;;;:102;;;;35579:10;35564:25;;:11;:25;;;;35487:102;:179;;;;35656:10;35641:25;;:11;:25;;;;35487:179;35467:199;;35078:639;;;:::o;35980:100::-;36034:13;36067:5;36060:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35980:100;:::o;42471:218::-;42547:7;42572:16;42580:7;42572;:16::i;:::-;42567:64;;42597:34;;;;;;;;;;;;;;42567:64;42651:15;:24;42667:7;42651:24;;;;;;;;;;;:30;;;;;;;;;;;;42644:37;;42471:218;;;:::o;41904:408::-;41993:13;42009:16;42017:7;42009;:16::i;:::-;41993:32;;42065:5;42042:28;;:19;:17;:19::i;:::-;:28;;;42038:175;;42090:44;42107:5;42114:19;:17;:19::i;:::-;42090:16;:44::i;:::-;42085:128;;42162:35;;;;;;;;;;;;;;42085:128;42038:175;42258:2;42225:15;:24;42241:7;42225:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;42296:7;42292:2;42276:28;;42285:5;42276:28;;;;;;;;;;;;41982:330;41904:408;;:::o;31731:323::-;31792:7;32020:15;:13;:15::i;:::-;32005:12;;31989:13;;:28;:46;31982:53;;31731:323;:::o;77474:32::-;;;;:::o;81499:231::-;81663:4;3641:1;2455:42;3595:43;;;:47;3591:699;;;3882:10;3874:18;;:4;:18;;;3870:85;;81685:37:::1;81704:4;81710:2;81714:7;81685:18;:37::i;:::-;3933:7:::0;;3870:85;2455:42;4015:40;;;4064:4;4071:10;4015:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2455:42;4111:40;;;4160:4;4167;4111:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4015:157;3969:310;;4252:10;4233:30;;;;;;;;;;;:::i;:::-;;;;;;;;3969:310;3591:699;81685:37:::1;81704:4;81710:2;81714:7;81685:18;:37::i;:::-;81499:231:::0;;;;;:::o;82566:98::-;9304:13;:11;:13::i;:::-;82624:8:::1;:6;:8::i;:::-;:32;;82648:8;:6;:8::i;:::-;82624:32;;;82635:10;:8;:10::i;:::-;82624:32;82566:98::o:0;77694:22::-;;;;;;;;;;;;;:::o;77751:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77285:::-;;;;:::o;82874:244::-;9304:13;:11;:13::i;:::-;82956:1:::1;82932:21;:25;82924:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;83023:15;83041:21;83023:39;;83081:10;83073:28;;:37;83102:7;83073:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;82913:205;82874:244::o:0;81738:239::-;81906:4;3641:1;2455:42;3595:43;;;:47;3591:699;;;3882:10;3874:18;;:4;:18;;;3870:85;;81928:41:::1;81951:4;81957:2;81961:7;81928:22;:41::i;:::-;3933:7:::0;;3870:85;2455:42;4015:40;;;4064:4;4071:10;4015:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2455:42;4111:40;;;4160:4;4167;4111:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4015:157;3969:310;;4252:10;4233:30;;;;;;;;;;;:::i;:::-;;;;;;;;3969:310;3591:699;81928:41:::1;81951:4;81957:2;81961:7;81928:22;:41::i;:::-;81738:239:::0;;;;;:::o;77437:30::-;;;;:::o;77553:31::-;;;;:::o;82366:88::-;9304:13;:11;:13::i;:::-;82442:4:::1;82430:9;:16;;;;82366:88:::0;:::o;82672:92::-;9304:13;:11;:13::i;:::-;82752:4:::1;82742:7;:14;;;;;;;;;;;;:::i;:::-;;82672:92:::0;:::o;72301:528::-;72445:23;72511:22;72536:8;;:15;;72511:40;;72566:34;72624:14;72603:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72566:73;;72659:9;72654:125;72675:14;72670:1;:19;72654:125;;72731:32;72751:8;;72760:1;72751:11;;;;;;;:::i;:::-;;;;;;;;72731:19;:32::i;:::-;72715:10;72726:1;72715:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;72691:3;;;;;72654:125;;;;72800:10;72793:17;;;;72301:528;;;;:::o;7201:86::-;7248:4;7272:7;;;;;;;;;;;7265:14;;7201:86;:::o;37373:152::-;37445:7;37488:27;37507:7;37488:18;:27::i;:::-;37465:52;;37373:152;;;:::o;77374:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77642:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;32915:233::-;32987:7;33028:1;33011:19;;:5;:19;;;33007:60;;33039:28;;;;;;;;;;;;;;33007:60;27074:13;33085:18;:25;33104:5;33085:25;;;;;;;;;;;;;;;;:55;33078:62;;32915:233;;;:::o;10066:103::-;9304:13;:11;:13::i;:::-;10131:30:::1;10158:1;10131:18;:30::i;:::-;10066:103::o:0;77513:33::-;;;;:::o;76177:900::-;76255:16;76309:19;76343:25;76383:22;76408:16;76418:5;76408:9;:16::i;:::-;76383:41;;76439:25;76481:14;76467:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76439:57;;76511:31;;:::i;:::-;76562:9;76574:15;:13;:15::i;:::-;76562:27;;76557:472;76606:14;76591:11;:29;76557:472;;76658:15;76671:1;76658:12;:15::i;:::-;76646:27;;76696:9;:16;;;76737:8;76692:73;76813:1;76787:28;;:9;:14;;;:28;;;76783:111;;76860:9;:14;;;76840:34;;76783:111;76937:5;76916:26;;:17;:26;;;76912:102;;76993:1;76967:8;76976:13;;;;;;76967:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;76912:102;76557:472;76622:3;;;;;76557:472;;;;77050:8;77043:15;;;;;;;76177:900;;;:::o;9418:87::-;9464:7;9491:6;;;;;;;;;;;9484:13;;9418:87;:::o;82272:86::-;9304:13;:11;:13::i;:::-;82344:6:::1;82336:5;:14;;;;82272:86:::0;:::o;36156:104::-;36212:13;36245:7;36238:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36156:104;:::o;73217:2513::-;73360:16;73427:4;73418:5;:13;73414:45;;73440:19;;;;;;;;;;;;;;73414:45;73474:19;73508:17;73528:14;:12;:14::i;:::-;73508:34;;73628:15;:13;:15::i;:::-;73620:5;:23;73616:87;;;73672:15;:13;:15::i;:::-;73664:23;;73616:87;73779:9;73772:4;:16;73768:73;;;73816:9;73809:16;;73768:73;73855:25;73883:16;73893:5;73883:9;:16::i;:::-;73855:44;;74077:4;74069:5;:12;74065:278;;;74102:19;74131:5;74124:4;:12;74102:34;;74173:17;74159:11;:31;74155:111;;;74235:11;74215:31;;74155:111;74083:198;74065:278;;;74326:1;74306:21;;74065:278;74357:25;74399:17;74385:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74357:60;;74457:1;74436:17;:22;74432:78;;74486:8;74479:15;;;;;;;;74432:78;74654:31;74688:26;74708:5;74688:19;:26::i;:::-;74654:60;;74729:25;74974:9;:16;;;74969:92;;75031:9;:14;;;75011:34;;74969:92;75080:9;75092:5;75080:17;;75075:478;75104:4;75099:1;:9;;:45;;;;;75127:17;75112:11;:32;;75099:45;75075:478;;;75182:15;75195:1;75182:12;:15::i;:::-;75170:27;;75220:9;:16;;;75261:8;75216:73;75337:1;75311:28;;:9;:14;;;:28;;;75307:111;;75384:9;:14;;;75364:34;;75307:111;75461:5;75440:26;;:17;:26;;;75436:102;;75517:1;75491:8;75500:13;;;;;;75491:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;75436:102;75075:478;75146:3;;;;;75075:478;;;;75655:11;75645:8;75638:29;75703:8;75696:15;;;;;;;;73217:2513;;;;;;:::o;77325:36::-;;;;:::o;77988:429::-;6806:19;:17;:19::i;:::-;78110:9:::1;;78081:25;78095:10;78081:13;:25::i;:::-;78070:8;:36;;;;:::i;:::-;:49;;78062:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;78206:10;;78194:8;78178:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;78170:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;78290:8;78282:5;;:16;;;;:::i;:::-;78268:9;:31;;78260:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;78359:8;78344:11;;:23;;;;;;;:::i;:::-;;;;;;;;78378:31;78388:10;78400:8;78378:9;:31::i;:::-;77988:429:::0;:::o;43029:234::-;43176:8;43124:18;:39;43143:19;:17;:19::i;:::-;43124:39;;;;;;;;;;;;;;;:49;43164:8;43124:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;43236:8;43200:55;;43215:19;:17;:19::i;:::-;43200:55;;;43246:8;43200:55;;;;;;:::i;:::-;;;;;;;;43029:234;;:::o;80551:380::-;80619:24;80680:4;;:11;;80666:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80656:36;;80703:9;80734;80729:170;80753:4;;:11;;80749:1;:15;80729:170;;;80790:10;:19;80801:4;;80806:1;80801:7;;;;;;;:::i;:::-;;;;;;;;80790:19;;;;;;;;;;;;;;;;;;;;;80786:102;;;80843:4;;80848:1;80843:7;;;;;;;:::i;:::-;;;;;;;;80830;80838:1;80830:10;;;;;;;;:::i;:::-;;;;;;;:20;;;;;80869:3;;;;;:::i;:::-;;;;80786:102;80766:3;;;;;:::i;:::-;;;;80729:170;;;;80909:14;80551:380;;;;:::o;77593:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;80153:390::-;80222:24;80283:4;;:11;;80269:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80259:36;;80306:9;80345;80340:171;80364:4;;:11;;80360:1;:15;80340:171;;;80401:11;:20;80413:4;;80418:1;80413:7;;;;;;;:::i;:::-;;;;;;;;80401:20;;;;;;;;;;;;;;;;;;;;;80397:103;;;80455:4;;80460:1;80455:7;;;;;;;:::i;:::-;;;;;;;;80442;80450:1;80442:10;;;;;;;;:::i;:::-;;;;;;;:20;;;;;80481:3;;;;;:::i;:::-;;;;80397:103;80377:3;;;;;:::i;:::-;;;;80340:171;;;;80521:14;80153:390;;;;:::o;81985:264::-;82172:4;3641:1;2455:42;3595:43;;;:47;3591:699;;;3882:10;3874:18;;:4;:18;;;3870:85;;82194:47:::1;82217:4;82223:2;82227:7;82236:4;82194:22;:47::i;:::-;3933:7:::0;;3870:85;2455:42;4015:40;;;4064:4;4071:10;4015:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2455:42;4111:40;;;4160:4;4167;4111:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4015:157;3969:310;;4252:10;4233:30;;;;;;;;;;;:::i;:::-;;;;;;;;3969:310;3591:699;82194:47:::1;82217:4;82223:2;82227:7;82236:4;82194:22;:47::i;:::-;81985:264:::0;;;;;;:::o;79038:1025::-;6806:19;:17;:19::i;:::-;79172:4:::1;79157:19;;:11;;;;;;;;;;;:19;;;79149:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;79244:7;;:14;;79227:6;;:13;;:31;79219:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;79317:11;79331:6;;:13;;79317:27;;79360:9;79355:632;79379:3;79375:1;:7;79355:632;;;79471:10;79441:40;;:7;;;;;;;;;;;:15;;;79457:6;;79464:1;79457:9;;;;;;;:::i;:::-;;;;;;;;79441:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;79433:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;79573:5;79548:30;;:10;:21;79559:6;;79566:1;79559:9;;;;;;;:::i;:::-;;;;;;;;79548:21;;;;;;;;;;;;;;;;;;;;;:30;;;79540:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;79675:4;79651:10;:21;79662:6;;79669:1;79662:9;;;;;;;:::i;:::-;;;;;;;;79651:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;79762:10;79734:38;;:4;;;;;;;;;;;:12;;;79747:7;;79755:1;79747:10;;;;;;;:::i;:::-;;;;;;;;79734:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;79726:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;79866:5;79839:32;;:11;:23;79851:7;;79859:1;79851:10;;;;;;;:::i;:::-;;;;;;;;79839:23;;;;;;;;;;;;;;;;;;;;;:32;;;79831:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;79971:4;79945:11;:23;79957:7;;79965:1;79957:10;;;;;;;:::i;:::-;;;;;;;;79945:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;79384:3;;;;;:::i;:::-;;;;79355:632;;;;80015:3;79999:12;;:19;;;;;;;:::i;:::-;;;;;;;;80029:26;80039:10;80051:3;80029:9;:26::i;:::-;79138:925;79038:1025:::0;;;;:::o;71714:428::-;71798:21;;:::i;:::-;71832:31;;:::i;:::-;71888:15;:13;:15::i;:::-;71878:7;:25;:54;;;;71918:14;:12;:14::i;:::-;71907:7;:25;;71878:54;71874:103;;;71956:9;71949:16;;;;;71874:103;71999:21;72012:7;71999:12;:21::i;:::-;71987:33;;72035:9;:16;;;72031:65;;;72075:9;72068:16;;;;;72031:65;72113:21;72126:7;72113:12;:21::i;:::-;72106:28;;;71714:428;;;;:::o;81152:339::-;81276:13;81313:16;81321:7;81313;:16::i;:::-;81308:59;;81338:29;;;;;;;;;;;;;;81308:59;81410:1;81391:7;81385:21;;;;;:::i;:::-;;;:26;:98;;;;;;;;;;;;;;;;;81438:7;81447:18;81457:7;81447:9;:18::i;:::-;81467:9;81421:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81385:98;81378:105;;81152:339;;;:::o;77248:30::-;;;;:::o;77723:19::-;;;;;;;;;;;;;:::o;43420:164::-;43517:4;43541:18;:25;43560:5;43541:25;;;;;;;;;;;;;;;:35;43567:8;43541:35;;;;;;;;;;;;;;;;;;;;;;;;;43534:42;;43420:164;;;;:::o;82462:96::-;9304:13;:11;:13::i;:::-;82545:5:::1;82531:11;;:19;;;;;;;;;;;;;;;;;;82462:96:::0;:::o;82772:94::-;9304:13;:11;:13::i;:::-;82854:4:::1;82841:10;:17;;;;82772:94:::0;:::o;10324:201::-;9304:13;:11;:13::i;:::-;10433:1:::1;10413:22;;:8;:22;;::::0;10405:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10489:28;10508:8;10489:18;:28::i;:::-;10324:201:::0;:::o;78425:375::-;9304:13;:11;:13::i;:::-;78516:11:::1;78530:5;;:12;;78516:26;;78597:10;;78589:3;78578:8;:14;;;;:::i;:::-;78561:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:46;;78553:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;78689:3;78678:8;:14;;;;:::i;:::-;78660;;:32;;;;;;;:::i;:::-;;;;;;;;78708:9;78703:90;78727:3;78723:1;:7;78703:90;;;78752:29;78762:5;;78768:1;78762:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;78772;78752:9;:29::i;:::-;78732:3;;;;;:::i;:::-;;;;78703:90;;;;78505:295;78425:375:::0;;;:::o;43842:282::-;43907:4;43963:7;43944:15;:13;:15::i;:::-;:26;;:66;;;;;43997:13;;43987:7;:23;43944:66;:153;;;;;44096:1;27850:8;44048:17;:26;44066:7;44048:26;;;;;;;;;;;;:44;:49;43944:153;43924:173;;43842:282;;;:::o;66150:105::-;66210:7;66237:10;66230:17;;66150:105;:::o;81047:93::-;81104:7;81131:1;81124:8;;81047:93;:::o;46110:2825::-;46252:27;46282;46301:7;46282:18;:27::i;:::-;46252:57;;46367:4;46326:45;;46342:19;46326:45;;;46322:86;;46380:28;;;;;;;;;;;;;;46322:86;46422:27;46451:23;46478:35;46505:7;46478:26;:35::i;:::-;46421:92;;;;46613:68;46638:15;46655:4;46661:19;:17;:19::i;:::-;46613:24;:68::i;:::-;46608:180;;46701:43;46718:4;46724:19;:17;:19::i;:::-;46701:16;:43::i;:::-;46696:92;;46753:35;;;;;;;;;;;;;;46696:92;46608:180;46819:1;46805:16;;:2;:16;;;46801:52;;46830:23;;;;;;;;;;;;;;46801:52;46866:43;46888:4;46894:2;46898:7;46907:1;46866:21;:43::i;:::-;47002:15;46999:160;;;47142:1;47121:19;47114:30;46999:160;47539:18;:24;47558:4;47539:24;;;;;;;;;;;;;;;;47537:26;;;;;;;;;;;;47608:18;:22;47627:2;47608:22;;;;;;;;;;;;;;;;47606:24;;;;;;;;;;;47930:146;47967:2;48016:45;48031:4;48037:2;48041:19;48016:14;:45::i;:::-;28130:8;47988:73;47930:18;:146::i;:::-;47901:17;:26;47919:7;47901:26;;;;;;;;;;;:175;;;;48247:1;28130:8;48196:19;:47;:52;48192:627;;48269:19;48301:1;48291:7;:11;48269:33;;48458:1;48424:17;:30;48442:11;48424:30;;;;;;;;;;;;:35;48420:384;;48562:13;;48547:11;:28;48543:242;;48742:19;48709:17;:30;48727:11;48709:30;;;;;;;;;;;:52;;;;48543:242;48420:384;48250:569;48192:627;48866:7;48862:2;48847:27;;48856:4;48847:27;;;;;;;;;;;;48885:42;48906:4;48912:2;48916:7;48925:1;48885:20;:42::i;:::-;46241:2694;;;46110:2825;;;:::o;9583:132::-;9658:12;:10;:12::i;:::-;9647:23;;:7;:5;:7::i;:::-;:23;;;9639:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9583:132::o;7797:118::-;6806:19;:17;:19::i;:::-;7867:4:::1;7857:7;;:14;;;;;;;;;;;;;;;;;;7887:20;7894:12;:10;:12::i;:::-;7887:20;;;;;;:::i;:::-;;;;;;;;7797:118::o:0;8056:120::-;7065:16;:14;:16::i;:::-;8125:5:::1;8115:7;;:15;;;;;;;;;;;;;;;;;;8146:22;8155:12;:10;:12::i;:::-;8146:22;;;;;;:::i;:::-;;;;;;;;8056:120::o:0;49031:193::-;49177:39;49194:4;49200:2;49204:7;49177:39;;;;;;;;;;;;:16;:39::i;:::-;49031:193;;;:::o;38528:1275::-;38595:7;38615:12;38630:7;38615:22;;38698:4;38679:15;:13;:15::i;:::-;:23;38675:1061;;38732:13;;38725:4;:20;38721:1015;;;38770:14;38787:17;:23;38805:4;38787:23;;;;;;;;;;;;38770:40;;38904:1;27850:8;38876:6;:24;:29;38872:845;;39541:113;39558:1;39548:6;:11;39541:113;;39601:17;:25;39619:6;;;;;;;39601:25;;;;;;;;;;;;39592:34;;39541:113;;;39687:6;39680:13;;;;;;38872:845;38747:989;38721:1015;38675:1061;39764:31;;;;;;;;;;;;;;38528:1275;;;;:::o;10685:191::-;10759:16;10778:6;;;;;;;;;;;10759:25;;10804:8;10795:6;;:17;;;;;;;;;;;;;;;;;;10859:8;10828:40;;10849:8;10828:40;;;;;;;;;;;;10748:128;10685:191;:::o;37976:161::-;38044:21;;:::i;:::-;38085:44;38104:17;:24;38122:5;38104:24;;;;;;;;;;;;38085:18;:44::i;:::-;38078:51;;37976:161;;;:::o;31418:103::-;31473:7;31500:13;;31493:20;;31418:103;:::o;7360:108::-;7431:8;:6;:8::i;:::-;7430:9;7422:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;7360:108::o;33230:178::-;33291:7;27074:13;27212:2;33319:18;:25;33338:5;33319:25;;;;;;;;;;;;;;;;:50;;33318:82;33311:89;;33230:178;;;:::o;59982:112::-;60059:27;60069:2;60073:8;60059:27;;;;;;;;;;;;:9;:27::i;:::-;59982:112;;:::o;49822:407::-;49997:31;50010:4;50016:2;50020:7;49997:12;:31::i;:::-;50061:1;50043:2;:14;;;:19;50039:183;;50082:56;50113:4;50119:2;50123:7;50132:5;50082:30;:56::i;:::-;50077:145;;50166:40;;;;;;;;;;;;;;50077:145;50039:183;49822:407;;;;:::o;37714:166::-;37784:21;;:::i;:::-;37825:47;37844:27;37863:7;37844:18;:27::i;:::-;37825:18;:47::i;:::-;37818:54;;37714:166;;;:::o;66357:1745::-;66422:17;66856:4;66849;66843:11;66839:22;66948:1;66942:4;66935:15;67023:4;67020:1;67016:12;67009:19;;67105:1;67100:3;67093:14;67209:3;67448:5;67430:428;67456:1;67430:428;;;67496:1;67491:3;67487:11;67480:18;;67667:2;67661:4;67657:13;67653:2;67649:22;67644:3;67636:36;67761:2;67755:4;67751:13;67743:21;;67828:4;67430:428;67818:25;67430:428;67434:21;67897:3;67892;67888:13;68012:4;68007:3;68003:14;67996:21;;68077:6;68072:3;68065:19;66461:1634;;;66357:1745;;;:::o;45005:485::-;45107:27;45136:23;45177:38;45218:15;:24;45234:7;45218:24;;;;;;;;;;;45177:65;;45395:18;45372:41;;45452:19;45446:26;45427:45;;45357:126;45005:485;;;:::o;44233:659::-;44382:11;44547:16;44540:5;44536:28;44527:37;;44707:16;44696:9;44692:32;44679:45;;44857:15;44846:9;44843:30;44835:5;44824:9;44821:20;44818:56;44808:66;;44233:659;;;;;:::o;50891:159::-;;;;;:::o;65459:311::-;65594:7;65614:16;28254:3;65640:19;:41;;65614:68;;28254:3;65708:31;65719:4;65725:2;65729:9;65708:10;:31::i;:::-;65700:40;;:62;;65693:69;;;65459:311;;;;;:::o;40351:450::-;40431:14;40599:16;40592:5;40588:28;40579:37;;40776:5;40762:11;40737:23;40733:41;40730:52;40723:5;40720:63;40710:73;;40351:450;;;;:::o;51715:158::-;;;;;:::o;5314:98::-;5367:7;5394:10;5387:17;;5314:98;:::o;7545:108::-;7612:8;:6;:8::i;:::-;7604:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;7545:108::o;39902:366::-;39968:31;;:::i;:::-;40045:6;40012:9;:14;;:41;;;;;;;;;;;27733:3;40098:6;:33;;40064:9;:24;;:68;;;;;;;;;;;40190:1;27850:8;40162:6;:24;:29;;40143:9;:16;;:48;;;;;;;;;;;28254:3;40231:6;:28;;40202:9;:19;;:58;;;;;;;;;;;39902:366;;;:::o;59209:689::-;59340:19;59346:2;59350:8;59340:5;:19::i;:::-;59419:1;59401:2;:14;;;:19;59397:483;;59441:11;59455:13;;59441:27;;59487:13;59509:8;59503:3;:14;59487:30;;59536:233;59567:62;59606:1;59610:2;59614:7;;;;;;59623:5;59567:30;:62::i;:::-;59562:167;;59665:40;;;;;;;;;;;;;;59562:167;59764:3;59756:5;:11;59536:233;;59851:3;59834:13;;:20;59830:34;;59856:8;;;59830:34;59422:458;;59397:483;59209:689;;;:::o;52313:716::-;52476:4;52522:2;52497:45;;;52543:19;:17;:19::i;:::-;52564:4;52570:7;52579:5;52497:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52493:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52797:1;52780:6;:13;:18;52776:235;;52826:40;;;;;;;;;;;;;;52776:235;52969:6;52963:13;52954:6;52950:2;52946:15;52939:38;52493:529;52666:54;;;52656:64;;;:6;:64;;;;52649:71;;;52313:716;;;;;;:::o;65160:147::-;65297:6;65160:147;;;;;:::o;53491:2966::-;53564:20;53587:13;;53564:36;;53627:1;53615:8;:13;53611:44;;53637:18;;;;;;;;;;;;;;53611:44;53668:61;53698:1;53702:2;53706:12;53720:8;53668:21;:61::i;:::-;54212:1;27212:2;54182:1;:26;;54181:32;54169:8;:45;54143:18;:22;54162:2;54143:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;54491:139;54528:2;54582:33;54605:1;54609:2;54613:1;54582:14;:33::i;:::-;54549:30;54570:8;54549:20;:30::i;:::-;:66;54491:18;:139::i;:::-;54457:17;:31;54475:12;54457:31;;;;;;;;;;;:173;;;;54647:16;54678:11;54707:8;54692:12;:23;54678:37;;55228:16;55224:2;55220:25;55208:37;;55600:12;55560:8;55519:1;55457:25;55398:1;55337;55310:335;55971:1;55957:12;55953:20;55911:346;56012:3;56003:7;56000:16;55911:346;;56230:7;56220:8;56217:1;56190:25;56187:1;56184;56179:59;56065:1;56056:7;56052:15;56041:26;;55911:346;;;55915:77;56302:1;56290:8;:13;56286:45;;56312:19;;;;;;;;;;;;;;56286:45;56364:3;56348:13;:19;;;;53917:2462;;56389:60;56418:1;56422:2;56426:12;56440:8;56389:20;:60::i;:::-;53553:2904;53491:2966;;:::o;40903:324::-;40973:14;41206:1;41196:8;41193:15;41167:24;41163:46;41153:56;;40903:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:60::-;5943:3;5964:5;5957:12;;5915:60;;;:::o;5981:142::-;6031:9;6064:53;6082:34;6091:24;6109:5;6091:24;:::i;:::-;6082:34;:::i;:::-;6064:53;:::i;:::-;6051:66;;5981:142;;;:::o;6129:126::-;6179:9;6212:37;6243:5;6212:37;:::i;:::-;6199:50;;6129:126;;;:::o;6261:141::-;6326:9;6359:37;6390:5;6359:37;:::i;:::-;6346:50;;6261:141;;;:::o;6408:161::-;6510:52;6556:5;6510:52;:::i;:::-;6505:3;6498:65;6408:161;;:::o;6575:252::-;6683:4;6721:2;6710:9;6706:18;6698:26;;6734:86;6817:1;6806:9;6802:17;6793:6;6734:86;:::i;:::-;6575:252;;;;:::o;6833:117::-;6942:1;6939;6932:12;6956:117;7065:1;7062;7055:12;7079:180;7127:77;7124:1;7117:88;7224:4;7221:1;7214:15;7248:4;7245:1;7238:15;7265:281;7348:27;7370:4;7348:27;:::i;:::-;7340:6;7336:40;7478:6;7466:10;7463:22;7442:18;7430:10;7427:34;7424:62;7421:88;;;7489:18;;:::i;:::-;7421:88;7529:10;7525:2;7518:22;7308:238;7265:281;;:::o;7552:129::-;7586:6;7613:20;;:::i;:::-;7603:30;;7642:33;7670:4;7662:6;7642:33;:::i;:::-;7552:129;;;:::o;7687:308::-;7749:4;7839:18;7831:6;7828:30;7825:56;;;7861:18;;:::i;:::-;7825:56;7899:29;7921:6;7899:29;:::i;:::-;7891:37;;7983:4;7977;7973:15;7965:23;;7687:308;;;:::o;8001:154::-;8085:6;8080:3;8075;8062:30;8147:1;8138:6;8133:3;8129:16;8122:27;8001:154;;;:::o;8161:412::-;8239:5;8264:66;8280:49;8322:6;8280:49;:::i;:::-;8264:66;:::i;:::-;8255:75;;8353:6;8346:5;8339:21;8391:4;8384:5;8380:16;8429:3;8420:6;8415:3;8411:16;8408:25;8405:112;;;8436:79;;:::i;:::-;8405:112;8526:41;8560:6;8555:3;8550;8526:41;:::i;:::-;8245:328;8161:412;;;;;:::o;8593:340::-;8649:5;8698:3;8691:4;8683:6;8679:17;8675:27;8665:122;;8706:79;;:::i;:::-;8665:122;8823:6;8810:20;8848:79;8923:3;8915:6;8908:4;8900:6;8896:17;8848:79;:::i;:::-;8839:88;;8655:278;8593:340;;;;:::o;8939:509::-;9008:6;9057:2;9045:9;9036:7;9032:23;9028:32;9025:119;;;9063:79;;:::i;:::-;9025:119;9211:1;9200:9;9196:17;9183:31;9241:18;9233:6;9230:30;9227:117;;;9263:79;;:::i;:::-;9227:117;9368:63;9423:7;9414:6;9403:9;9399:22;9368:63;:::i;:::-;9358:73;;9154:287;8939:509;;;;:::o;9454:117::-;9563:1;9560;9553:12;9577:117;9686:1;9683;9676:12;9717:568;9790:8;9800:6;9850:3;9843:4;9835:6;9831:17;9827:27;9817:122;;9858:79;;:::i;:::-;9817:122;9971:6;9958:20;9948:30;;10001:18;9993:6;9990:30;9987:117;;;10023:79;;:::i;:::-;9987:117;10137:4;10129:6;10125:17;10113:29;;10191:3;10183:4;10175:6;10171:17;10161:8;10157:32;10154:41;10151:128;;;10198:79;;:::i;:::-;10151:128;9717:568;;;;;:::o;10291:559::-;10377:6;10385;10434:2;10422:9;10413:7;10409:23;10405:32;10402:119;;;10440:79;;:::i;:::-;10402:119;10588:1;10577:9;10573:17;10560:31;10618:18;10610:6;10607:30;10604:117;;;10640:79;;:::i;:::-;10604:117;10753:80;10825:7;10816:6;10805:9;10801:22;10753:80;:::i;:::-;10735:98;;;;10531:312;10291:559;;;;;:::o;10856:145::-;10954:6;10988:5;10982:12;10972:22;;10856:145;;;:::o;11007:215::-;11137:11;11171:6;11166:3;11159:19;11211:4;11206:3;11202:14;11187:29;;11007:215;;;;:::o;11228:163::-;11326:4;11349:3;11341:11;;11379:4;11374:3;11370:14;11362:22;;11228:163;;;:::o;11397:108::-;11474:24;11492:5;11474:24;:::i;:::-;11469:3;11462:37;11397:108;;:::o;11511:101::-;11547:7;11587:18;11580:5;11576:30;11565:41;;11511:101;;;:::o;11618:105::-;11693:23;11710:5;11693:23;:::i;:::-;11688:3;11681:36;11618:105;;:::o;11729:99::-;11800:21;11815:5;11800:21;:::i;:::-;11795:3;11788:34;11729:99;;:::o;11834:91::-;11870:7;11910:8;11903:5;11899:20;11888:31;;11834:91;;;:::o;11931:105::-;12006:23;12023:5;12006:23;:::i;:::-;12001:3;11994:36;11931:105;;:::o;12114:864::-;12263:4;12258:3;12254:14;12350:4;12343:5;12339:16;12333:23;12369:63;12426:4;12421:3;12417:14;12403:12;12369:63;:::i;:::-;12278:164;12534:4;12527:5;12523:16;12517:23;12553:61;12608:4;12603:3;12599:14;12585:12;12553:61;:::i;:::-;12452:172;12708:4;12701:5;12697:16;12691:23;12727:57;12778:4;12773:3;12769:14;12755:12;12727:57;:::i;:::-;12634:160;12881:4;12874:5;12870:16;12864:23;12900:61;12955:4;12950:3;12946:14;12932:12;12900:61;:::i;:::-;12804:167;12232:746;12114:864;;:::o;12984:303::-;13115:10;13136:108;13240:3;13232:6;13136:108;:::i;:::-;13276:4;13271:3;13267:14;13253:28;;12984:303;;;;:::o;13293:144::-;13394:4;13426;13421:3;13417:14;13409:22;;13293:144;;;:::o;13519:980::-;13700:3;13729:85;13808:5;13729:85;:::i;:::-;13830:117;13940:6;13935:3;13830:117;:::i;:::-;13823:124;;13971:87;14052:5;13971:87;:::i;:::-;14081:7;14112:1;14097:377;14122:6;14119:1;14116:13;14097:377;;;14198:6;14192:13;14225:125;14346:3;14331:13;14225:125;:::i;:::-;14218:132;;14373:91;14457:6;14373:91;:::i;:::-;14363:101;;14157:317;14144:1;14141;14137:9;14132:14;;14097:377;;;14101:14;14490:3;14483:10;;13705:794;;;13519:980;;;;:::o;14505:497::-;14710:4;14748:2;14737:9;14733:18;14725:26;;14797:9;14791:4;14787:20;14783:1;14772:9;14768:17;14761:47;14825:170;14990:4;14981:6;14825:170;:::i;:::-;14817:178;;14505:497;;;;:::o;15008:329::-;15067:6;15116:2;15104:9;15095:7;15091:23;15087:32;15084:119;;;15122:79;;:::i;:::-;15084:119;15242:1;15267:53;15312:7;15303:6;15292:9;15288:22;15267:53;:::i;:::-;15257:63;;15213:117;15008:329;;;;:::o;15343:114::-;15410:6;15444:5;15438:12;15428:22;;15343:114;;;:::o;15463:184::-;15562:11;15596:6;15591:3;15584:19;15636:4;15631:3;15627:14;15612:29;;15463:184;;;;:::o;15653:132::-;15720:4;15743:3;15735:11;;15773:4;15768:3;15764:14;15756:22;;15653:132;;;:::o;15791:108::-;15868:24;15886:5;15868:24;:::i;:::-;15863:3;15856:37;15791:108;;:::o;15905:179::-;15974:10;15995:46;16037:3;16029:6;15995:46;:::i;:::-;16073:4;16068:3;16064:14;16050:28;;15905:179;;;;:::o;16090:113::-;16160:4;16192;16187:3;16183:14;16175:22;;16090:113;;;:::o;16239:732::-;16358:3;16387:54;16435:5;16387:54;:::i;:::-;16457:86;16536:6;16531:3;16457:86;:::i;:::-;16450:93;;16567:56;16617:5;16567:56;:::i;:::-;16646:7;16677:1;16662:284;16687:6;16684:1;16681:13;16662:284;;;16763:6;16757:13;16790:63;16849:3;16834:13;16790:63;:::i;:::-;16783:70;;16876:60;16929:6;16876:60;:::i;:::-;16866:70;;16722:224;16709:1;16706;16702:9;16697:14;;16662:284;;;16666:14;16962:3;16955:10;;16363:608;;;16239:732;;;;:::o;16977:373::-;17120:4;17158:2;17147:9;17143:18;17135:26;;17207:9;17201:4;17197:20;17193:1;17182:9;17178:17;17171:47;17235:108;17338:4;17329:6;17235:108;:::i;:::-;17227:116;;16977:373;;;;:::o;17356:619::-;17433:6;17441;17449;17498:2;17486:9;17477:7;17473:23;17469:32;17466:119;;;17504:79;;:::i;:::-;17466:119;17624:1;17649:53;17694:7;17685:6;17674:9;17670:22;17649:53;:::i;:::-;17639:63;;17595:117;17751:2;17777:53;17822:7;17813:6;17802:9;17798:22;17777:53;:::i;:::-;17767:63;;17722:118;17879:2;17905:53;17950:7;17941:6;17930:9;17926:22;17905:53;:::i;:::-;17895:63;;17850:118;17356:619;;;;;:::o;17981:116::-;18051:21;18066:5;18051:21;:::i;:::-;18044:5;18041:32;18031:60;;18087:1;18084;18077:12;18031:60;17981:116;:::o;18103:133::-;18146:5;18184:6;18171:20;18162:29;;18200:30;18224:5;18200:30;:::i;:::-;18103:133;;;;:::o;18242:468::-;18307:6;18315;18364:2;18352:9;18343:7;18339:23;18335:32;18332:119;;;18370:79;;:::i;:::-;18332:119;18490:1;18515:53;18560:7;18551:6;18540:9;18536:22;18515:53;:::i;:::-;18505:63;;18461:117;18617:2;18643:50;18685:7;18676:6;18665:9;18661:22;18643:50;:::i;:::-;18633:60;;18588:115;18242:468;;;;;:::o;18716:307::-;18777:4;18867:18;18859:6;18856:30;18853:56;;;18889:18;;:::i;:::-;18853:56;18927:29;18949:6;18927:29;:::i;:::-;18919:37;;19011:4;19005;19001:15;18993:23;;18716:307;;;:::o;19029:410::-;19106:5;19131:65;19147:48;19188:6;19147:48;:::i;:::-;19131:65;:::i;:::-;19122:74;;19219:6;19212:5;19205:21;19257:4;19250:5;19246:16;19295:3;19286:6;19281:3;19277:16;19274:25;19271:112;;;19302:79;;:::i;:::-;19271:112;19392:41;19426:6;19421:3;19416;19392:41;:::i;:::-;19112:327;19029:410;;;;;:::o;19458:338::-;19513:5;19562:3;19555:4;19547:6;19543:17;19539:27;19529:122;;19570:79;;:::i;:::-;19529:122;19687:6;19674:20;19712:78;19786:3;19778:6;19771:4;19763:6;19759:17;19712:78;:::i;:::-;19703:87;;19519:277;19458:338;;;;:::o;19802:943::-;19897:6;19905;19913;19921;19970:3;19958:9;19949:7;19945:23;19941:33;19938:120;;;19977:79;;:::i;:::-;19938:120;20097:1;20122:53;20167:7;20158:6;20147:9;20143:22;20122:53;:::i;:::-;20112:63;;20068:117;20224:2;20250:53;20295:7;20286:6;20275:9;20271:22;20250:53;:::i;:::-;20240:63;;20195:118;20352:2;20378:53;20423:7;20414:6;20403:9;20399:22;20378:53;:::i;:::-;20368:63;;20323:118;20508:2;20497:9;20493:18;20480:32;20539:18;20531:6;20528:30;20525:117;;;20561:79;;:::i;:::-;20525:117;20666:62;20720:7;20711:6;20700:9;20696:22;20666:62;:::i;:::-;20656:72;;20451:287;19802:943;;;;;;;:::o;20751:934::-;20873:6;20881;20889;20897;20946:2;20934:9;20925:7;20921:23;20917:32;20914:119;;;20952:79;;:::i;:::-;20914:119;21100:1;21089:9;21085:17;21072:31;21130:18;21122:6;21119:30;21116:117;;;21152:79;;:::i;:::-;21116:117;21265:80;21337:7;21328:6;21317:9;21313:22;21265:80;:::i;:::-;21247:98;;;;21043:312;21422:2;21411:9;21407:18;21394:32;21453:18;21445:6;21442:30;21439:117;;;21475:79;;:::i;:::-;21439:117;21588:80;21660:7;21651:6;21640:9;21636:22;21588:80;:::i;:::-;21570:98;;;;21365:313;20751:934;;;;;;;:::o;21763:874::-;21922:4;21917:3;21913:14;22009:4;22002:5;21998:16;21992:23;22028:63;22085:4;22080:3;22076:14;22062:12;22028:63;:::i;:::-;21937:164;22193:4;22186:5;22182:16;22176:23;22212:61;22267:4;22262:3;22258:14;22244:12;22212:61;:::i;:::-;22111:172;22367:4;22360:5;22356:16;22350:23;22386:57;22437:4;22432:3;22428:14;22414:12;22386:57;:::i;:::-;22293:160;22540:4;22533:5;22529:16;22523:23;22559:61;22614:4;22609:3;22605:14;22591:12;22559:61;:::i;:::-;22463:167;21891:746;21763:874;;:::o;22643:347::-;22798:4;22836:3;22825:9;22821:19;22813:27;;22850:133;22980:1;22969:9;22965:17;22956:6;22850:133;:::i;:::-;22643:347;;;;:::o;22996:474::-;23064:6;23072;23121:2;23109:9;23100:7;23096:23;23092:32;23089:119;;;23127:79;;:::i;:::-;23089:119;23247:1;23272:53;23317:7;23308:6;23297:9;23293:22;23272:53;:::i;:::-;23262:63;;23218:117;23374:2;23400:53;23445:7;23436:6;23425:9;23421:22;23400:53;:::i;:::-;23390:63;;23345:118;22996:474;;;;;:::o;23476:323::-;23532:6;23581:2;23569:9;23560:7;23556:23;23552:32;23549:119;;;23587:79;;:::i;:::-;23549:119;23707:1;23732:50;23774:7;23765:6;23754:9;23750:22;23732:50;:::i;:::-;23722:60;;23678:114;23476:323;;;;:::o;23822:568::-;23895:8;23905:6;23955:3;23948:4;23940:6;23936:17;23932:27;23922:122;;23963:79;;:::i;:::-;23922:122;24076:6;24063:20;24053:30;;24106:18;24098:6;24095:30;24092:117;;;24128:79;;:::i;:::-;24092:117;24242:4;24234:6;24230:17;24218:29;;24296:3;24288:4;24280:6;24276:17;24266:8;24262:32;24259:41;24256:128;;;24303:79;;:::i;:::-;24256:128;23822:568;;;;;:::o;24396:704::-;24491:6;24499;24507;24556:2;24544:9;24535:7;24531:23;24527:32;24524:119;;;24562:79;;:::i;:::-;24524:119;24710:1;24699:9;24695:17;24682:31;24740:18;24732:6;24729:30;24726:117;;;24762:79;;:::i;:::-;24726:117;24875:80;24947:7;24938:6;24927:9;24923:22;24875:80;:::i;:::-;24857:98;;;;24653:312;25004:2;25030:53;25075:7;25066:6;25055:9;25051:22;25030:53;:::i;:::-;25020:63;;24975:118;24396:704;;;;;:::o;25106:180::-;25154:77;25151:1;25144:88;25251:4;25248:1;25241:15;25275:4;25272:1;25265:15;25292:320;25336:6;25373:1;25367:4;25363:12;25353:22;;25420:1;25414:4;25410:12;25441:18;25431:81;;25497:4;25489:6;25485:17;25475:27;;25431:81;25559:2;25551:6;25548:14;25528:18;25525:38;25522:84;;25578:18;;:::i;:::-;25522:84;25343:269;25292:320;;;:::o;25618:332::-;25739:4;25777:2;25766:9;25762:18;25754:26;;25790:71;25858:1;25847:9;25843:17;25834:6;25790:71;:::i;:::-;25871:72;25939:2;25928:9;25924:18;25915:6;25871:72;:::i;:::-;25618:332;;;;;:::o;25956:137::-;26010:5;26041:6;26035:13;26026:22;;26057:30;26081:5;26057:30;:::i;:::-;25956:137;;;;:::o;26099:345::-;26166:6;26215:2;26203:9;26194:7;26190:23;26186:32;26183:119;;;26221:79;;:::i;:::-;26183:119;26341:1;26366:61;26419:7;26410:6;26399:9;26395:22;26366:61;:::i;:::-;26356:71;;26312:125;26099:345;;;;:::o;26450:236::-;26590:34;26586:1;26578:6;26574:14;26567:58;26659:19;26654:2;26646:6;26642:15;26635:44;26450:236;:::o;26692:366::-;26834:3;26855:67;26919:2;26914:3;26855:67;:::i;:::-;26848:74;;26931:93;27020:3;26931:93;:::i;:::-;27049:2;27044:3;27040:12;27033:19;;26692:366;;;:::o;27064:419::-;27230:4;27268:2;27257:9;27253:18;27245:26;;27317:9;27311:4;27307:20;27303:1;27292:9;27288:17;27281:47;27345:131;27471:4;27345:131;:::i;:::-;27337:139;;27064:419;;;:::o;27489:180::-;27537:77;27534:1;27527:88;27634:4;27631:1;27624:15;27658:4;27655:1;27648:15;27675:180;27723:77;27720:1;27713:88;27820:4;27817:1;27810:15;27844:4;27841:1;27834:15;27861:305;27901:3;27920:20;27938:1;27920:20;:::i;:::-;27915:25;;27954:20;27972:1;27954:20;:::i;:::-;27949:25;;28108:1;28040:66;28036:74;28033:1;28030:81;28027:107;;;28114:18;;:::i;:::-;28027:107;28158:1;28155;28151:9;28144:16;;27861:305;;;;:::o;28172:222::-;28312:34;28308:1;28300:6;28296:14;28289:58;28381:5;28376:2;28368:6;28364:15;28357:30;28172:222;:::o;28400:366::-;28542:3;28563:67;28627:2;28622:3;28563:67;:::i;:::-;28556:74;;28639:93;28728:3;28639:93;:::i;:::-;28757:2;28752:3;28748:12;28741:19;;28400:366;;;:::o;28772:419::-;28938:4;28976:2;28965:9;28961:18;28953:26;;29025:9;29019:4;29015:20;29011:1;29000:9;28996:17;28989:47;29053:131;29179:4;29053:131;:::i;:::-;29045:139;;28772:419;;;:::o;29197:178::-;29337:30;29333:1;29325:6;29321:14;29314:54;29197:178;:::o;29381:366::-;29523:3;29544:67;29608:2;29603:3;29544:67;:::i;:::-;29537:74;;29620:93;29709:3;29620:93;:::i;:::-;29738:2;29733:3;29729:12;29722:19;;29381:366;;;:::o;29753:419::-;29919:4;29957:2;29946:9;29942:18;29934:26;;30006:9;30000:4;29996:20;29992:1;29981:9;29977:17;29970:47;30034:131;30160:4;30034:131;:::i;:::-;30026:139;;29753:419;;;:::o;30178:348::-;30218:7;30241:20;30259:1;30241:20;:::i;:::-;30236:25;;30275:20;30293:1;30275:20;:::i;:::-;30270:25;;30463:1;30395:66;30391:74;30388:1;30385:81;30380:1;30373:9;30366:17;30362:105;30359:131;;;30470:18;;:::i;:::-;30359:131;30518:1;30515;30511:9;30500:20;;30178:348;;;;:::o;30532:177::-;30672:29;30668:1;30660:6;30656:14;30649:53;30532:177;:::o;30715:366::-;30857:3;30878:67;30942:2;30937:3;30878:67;:::i;:::-;30871:74;;30954:93;31043:3;30954:93;:::i;:::-;31072:2;31067:3;31063:12;31056:19;;30715:366;;;:::o;31087:419::-;31253:4;31291:2;31280:9;31276:18;31268:26;;31340:9;31334:4;31330:20;31326:1;31315:9;31311:17;31304:47;31368:131;31494:4;31368:131;:::i;:::-;31360:139;;31087:419;;;:::o;31512:233::-;31551:3;31574:24;31592:5;31574:24;:::i;:::-;31565:33;;31620:66;31613:5;31610:77;31607:103;;31690:18;;:::i;:::-;31607:103;31737:1;31730:5;31726:13;31719:20;;31512:233;;;:::o;31751:177::-;31891:29;31887:1;31879:6;31875:14;31868:53;31751:177;:::o;31934:366::-;32076:3;32097:67;32161:2;32156:3;32097:67;:::i;:::-;32090:74;;32173:93;32262:3;32173:93;:::i;:::-;32291:2;32286:3;32282:12;32275:19;;31934:366;;;:::o;32306:419::-;32472:4;32510:2;32499:9;32495:18;32487:26;;32559:9;32553:4;32549:20;32545:1;32534:9;32530:17;32523:47;32587:131;32713:4;32587:131;:::i;:::-;32579:139;;32306:419;;;:::o;32731:230::-;32871:34;32867:1;32859:6;32855:14;32848:58;32940:13;32935:2;32927:6;32923:15;32916:38;32731:230;:::o;32967:366::-;33109:3;33130:67;33194:2;33189:3;33130:67;:::i;:::-;33123:74;;33206:93;33295:3;33206:93;:::i;:::-;33324:2;33319:3;33315:12;33308:19;;32967:366;;;:::o;33339:419::-;33505:4;33543:2;33532:9;33528:18;33520:26;;33592:9;33586:4;33582:20;33578:1;33567:9;33563:17;33556:47;33620:131;33746:4;33620:131;:::i;:::-;33612:139;;33339:419;;;:::o;33764:143::-;33821:5;33852:6;33846:13;33837:22;;33868:33;33895:5;33868:33;:::i;:::-;33764:143;;;;:::o;33913:351::-;33983:6;34032:2;34020:9;34011:7;34007:23;34003:32;34000:119;;;34038:79;;:::i;:::-;34000:119;34158:1;34183:64;34239:7;34230:6;34219:9;34215:22;34183:64;:::i;:::-;34173:74;;34129:128;33913:351;;;;:::o;34270:226::-;34410:34;34406:1;34398:6;34394:14;34387:58;34479:9;34474:2;34466:6;34462:15;34455:34;34270:226;:::o;34502:366::-;34644:3;34665:67;34729:2;34724:3;34665:67;:::i;:::-;34658:74;;34741:93;34830:3;34741:93;:::i;:::-;34859:2;34854:3;34850:12;34843:19;;34502:366;;;:::o;34874:419::-;35040:4;35078:2;35067:9;35063:18;35055:26;;35127:9;35121:4;35117:20;35113:1;35102:9;35098:17;35091:47;35155:131;35281:4;35155:131;:::i;:::-;35147:139;;34874:419;;;:::o;35299:240::-;35439:34;35435:1;35427:6;35423:14;35416:58;35508:23;35503:2;35495:6;35491:15;35484:48;35299:240;:::o;35545:366::-;35687:3;35708:67;35772:2;35767:3;35708:67;:::i;:::-;35701:74;;35784:93;35873:3;35784:93;:::i;:::-;35902:2;35897:3;35893:12;35886:19;;35545:366;;;:::o;35917:419::-;36083:4;36121:2;36110:9;36106:18;36098:26;;36170:9;36164:4;36160:20;36156:1;36145:9;36141:17;36134:47;36198:131;36324:4;36198:131;:::i;:::-;36190:139;;35917:419;;;:::o;36342:241::-;36482:34;36478:1;36470:6;36466:14;36459:58;36551:24;36546:2;36538:6;36534:15;36527:49;36342:241;:::o;36589:366::-;36731:3;36752:67;36816:2;36811:3;36752:67;:::i;:::-;36745:74;;36828:93;36917:3;36828:93;:::i;:::-;36946:2;36941:3;36937:12;36930:19;;36589:366;;;:::o;36961:419::-;37127:4;37165:2;37154:9;37150:18;37142:26;;37214:9;37208:4;37204:20;37200:1;37189:9;37185:17;37178:47;37242:131;37368:4;37242:131;:::i;:::-;37234:139;;36961:419;;;:::o;37386:148::-;37488:11;37525:3;37510:18;;37386:148;;;;:::o;37540:141::-;37589:4;37612:3;37604:11;;37635:3;37632:1;37625:14;37669:4;37666:1;37656:18;37648:26;;37540:141;;;:::o;37711:845::-;37814:3;37851:5;37845:12;37880:36;37906:9;37880:36;:::i;:::-;37932:89;38014:6;38009:3;37932:89;:::i;:::-;37925:96;;38052:1;38041:9;38037:17;38068:1;38063:137;;;;38214:1;38209:341;;;;38030:520;;38063:137;38147:4;38143:9;38132;38128:25;38123:3;38116:38;38183:6;38178:3;38174:16;38167:23;;38063:137;;38209:341;38276:38;38308:5;38276:38;:::i;:::-;38336:1;38350:154;38364:6;38361:1;38358:13;38350:154;;;38438:7;38432:14;38428:1;38423:3;38419:11;38412:35;38488:1;38479:7;38475:15;38464:26;;38386:4;38383:1;38379:12;38374:17;;38350:154;;;38533:6;38528:3;38524:16;38517:23;;38216:334;;38030:520;;37818:738;;37711:845;;;;:::o;38562:377::-;38668:3;38696:39;38729:5;38696:39;:::i;:::-;38751:89;38833:6;38828:3;38751:89;:::i;:::-;38744:96;;38849:52;38894:6;38889:3;38882:4;38875:5;38871:16;38849:52;:::i;:::-;38926:6;38921:3;38917:16;38910:23;;38672:267;38562:377;;;;:::o;38945:583::-;39167:3;39189:92;39277:3;39268:6;39189:92;:::i;:::-;39182:99;;39298:95;39389:3;39380:6;39298:95;:::i;:::-;39291:102;;39410:92;39498:3;39489:6;39410:92;:::i;:::-;39403:99;;39519:3;39512:10;;38945:583;;;;;;:::o;39534:225::-;39674:34;39670:1;39662:6;39658:14;39651:58;39743:8;39738:2;39730:6;39726:15;39719:33;39534:225;:::o;39765:366::-;39907:3;39928:67;39992:2;39987:3;39928:67;:::i;:::-;39921:74;;40004:93;40093:3;40004:93;:::i;:::-;40122:2;40117:3;40113:12;40106:19;;39765:366;;;:::o;40137:419::-;40303:4;40341:2;40330:9;40326:18;40318:26;;40390:9;40384:4;40380:20;40376:1;40365:9;40361:17;40354:47;40418:131;40544:4;40418:131;:::i;:::-;40410:139;;40137:419;;;:::o;40562:224::-;40702:34;40698:1;40690:6;40686:14;40679:58;40771:7;40766:2;40758:6;40754:15;40747:32;40562:224;:::o;40792:366::-;40934:3;40955:67;41019:2;41014:3;40955:67;:::i;:::-;40948:74;;41031:93;41120:3;41031:93;:::i;:::-;41149:2;41144:3;41140:12;41133:19;;40792:366;;;:::o;41164:419::-;41330:4;41368:2;41357:9;41353:18;41345:26;;41417:9;41411:4;41407:20;41403:1;41392:9;41388:17;41381:47;41445:131;41571:4;41445:131;:::i;:::-;41437:139;;41164:419;;;:::o;41589:182::-;41729:34;41725:1;41717:6;41713:14;41706:58;41589:182;:::o;41777:366::-;41919:3;41940:67;42004:2;41999:3;41940:67;:::i;:::-;41933:74;;42016:93;42105:3;42016:93;:::i;:::-;42134:2;42129:3;42125:12;42118:19;;41777:366;;;:::o;42149:419::-;42315:4;42353:2;42342:9;42338:18;42330:26;;42402:9;42396:4;42392:20;42388:1;42377:9;42373:17;42366:47;42430:131;42556:4;42430:131;:::i;:::-;42422:139;;42149:419;;;:::o;42574:166::-;42714:18;42710:1;42702:6;42698:14;42691:42;42574:166;:::o;42746:366::-;42888:3;42909:67;42973:2;42968:3;42909:67;:::i;:::-;42902:74;;42985:93;43074:3;42985:93;:::i;:::-;43103:2;43098:3;43094:12;43087:19;;42746:366;;;:::o;43118:419::-;43284:4;43322:2;43311:9;43307:18;43299:26;;43371:9;43365:4;43361:20;43357:1;43346:9;43342:17;43335:47;43399:131;43525:4;43399:131;:::i;:::-;43391:139;;43118:419;;;:::o;43543:170::-;43683:22;43679:1;43671:6;43667:14;43660:46;43543:170;:::o;43719:366::-;43861:3;43882:67;43946:2;43941:3;43882:67;:::i;:::-;43875:74;;43958:93;44047:3;43958:93;:::i;:::-;44076:2;44071:3;44067:12;44060:19;;43719:366;;;:::o;44091:419::-;44257:4;44295:2;44284:9;44280:18;44272:26;;44344:9;44338:4;44334:20;44330:1;44319:9;44315:17;44308:47;44372:131;44498:4;44372:131;:::i;:::-;44364:139;;44091:419;;;:::o;44516:98::-;44567:6;44601:5;44595:12;44585:22;;44516:98;;;:::o;44620:168::-;44703:11;44737:6;44732:3;44725:19;44777:4;44772:3;44768:14;44753:29;;44620:168;;;;:::o;44794:360::-;44880:3;44908:38;44940:5;44908:38;:::i;:::-;44962:70;45025:6;45020:3;44962:70;:::i;:::-;44955:77;;45041:52;45086:6;45081:3;45074:4;45067:5;45063:16;45041:52;:::i;:::-;45118:29;45140:6;45118:29;:::i;:::-;45113:3;45109:39;45102:46;;44884:270;44794:360;;;;:::o;45160:640::-;45355:4;45393:3;45382:9;45378:19;45370:27;;45407:71;45475:1;45464:9;45460:17;45451:6;45407:71;:::i;:::-;45488:72;45556:2;45545:9;45541:18;45532:6;45488:72;:::i;:::-;45570;45638:2;45627:9;45623:18;45614:6;45570:72;:::i;:::-;45689:9;45683:4;45679:20;45674:2;45663:9;45659:18;45652:48;45717:76;45788:4;45779:6;45717:76;:::i;:::-;45709:84;;45160:640;;;;;;;:::o;45806:141::-;45862:5;45893:6;45887:13;45878:22;;45909:32;45935:5;45909:32;:::i;:::-;45806:141;;;;:::o;45953:349::-;46022:6;46071:2;46059:9;46050:7;46046:23;46042:32;46039:119;;;46077:79;;:::i;:::-;46039:119;46197:1;46222:63;46277:7;46268:6;46257:9;46253:22;46222:63;:::i;:::-;46212:73;;46168:127;45953:349;;;;:::o

Swarm Source

ipfs://638d27f70ed489d0d1247538932b605aebfc093fcfbebc96331864e9d9bdb3b1
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.