ETH Price: $3,467.73 (+4.02%)
Gas: 5 Gwei

Token

Poacher Paul (PPOJO)
 

Overview

Max Total Supply

200 PPOJO

Holders

55

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PPOJO
0xf7f08575740a57bbccacd4f236425ac798e1a820
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:
PoacherPaulNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity >=0.7.0 <0.9.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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());
    }
}

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);
    }
}

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

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

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

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

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

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

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

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

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

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

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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

// SPDX-License-Identifier: MIT

contract PoacherPaulNFT is ERC721A, Ownable, Pausable {
  string public baseURI = "ipfs://bafybeifbzcbchzbykqcpxj3rozg3bknilthnjkup6lyihtpktnvzpxi43i/";
  uint256 public cost = 0.01 ether;
  uint256 public maxSupply = 10000;
  uint256 public maxMintAmount = 20;
  uint256 public nftPerAddressLimit = 50;

  bool public onlyWhitelisted = false;
  address[] public whitelistedAddresses;
  mapping(address => uint256) public addressMintedBalance;

  event NewTokenURI(string);

  constructor() ERC721A("Poacher Paul", "PPOJO") {}

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

  // public
  function mint(uint256 _mintAmount) public payable {
    require(!paused(), "the contract is paused");
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    uint256 ownerMintedCount = addressMintedBalance[msg.sender];
    require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
  
    if (msg.sender != owner()) {
      if (onlyWhitelisted == true) {
        require(isWhitelisted(msg.sender), "user is not whitelisted");
        require(supply + _mintAmount <= 1000, "First whitelist limit exceeded (1000)");
      }
      require(msg.value >= cost * _mintAmount, "insufficient funds");
    }

    addressMintedBalance[msg.sender] += _mintAmount;
    _safeMint(msg.sender, _mintAmount);
  }

  function mintReserved(address to, uint8 amount) external onlyOwner {
    require(amount > 0, "No amount specified");
    uint256 supply = totalSupply();
    require(supply + amount <= maxSupply, "max NFT limit exceeded");
    _safeMint(to, amount);
    addressMintedBalance[to] += amount;
  }

  function isWhitelisted(address _user) public view returns (bool) {
    if (onlyWhitelisted == true) {
      for (uint i = 0; i < whitelistedAddresses.length; i++) {
        if (whitelistedAddresses[i] == _user) {
          return true;
        }
      }
    }
    return false;
  }

  function setNewURI(string memory _newURI) external onlyOwner {
    baseURI = _newURI;
    emit NewTokenURI(_newURI);
  }

  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }

  function pause() external onlyOwner {
    _pause();
  }

  function unpause() external onlyOwner {
      _unpause();
  }

  function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }

  function endOnlyWhitelisted() public onlyOwner {
    onlyWhitelisted = false;
  }

  function whitelistUsers(address[] calldata _users) public onlyOwner {
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }

  function withdraw() public payable onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"","type":"string"}],"name":"NewTokenURI","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":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setNewURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180608001604052806043815260200162003c2c60439139600990805190602001906200003592919062000244565b50662386f26fc10000600a55612710600b556014600c556032600d556000600e60006101000a81548160ff0219169083151502179055503480156200007957600080fd5b506040518060400160405280600c81526020017f506f6163686572205061756c00000000000000000000000000000000000000008152506040518060400160405280600581526020017f50504f4a4f0000000000000000000000000000000000000000000000000000008152508160029080519060200190620000fe92919062000244565b5080600390805190602001906200011792919062000244565b50620001286200017160201b60201c565b600081905550505062000150620001446200017660201b60201c565b6200017e60201b60201c565b6000600860146101000a81548160ff02191690831515021790555062000359565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025290620002f4565b90600052602060002090601f016020900481019282620002765760008555620002c2565b82601f106200029157805160ff1916838001178555620002c2565b82800160010185558215620002c2579182015b82811115620002c1578251825591602001919060010190620002a4565b5b509050620002d19190620002d5565b5090565b5b80821115620002f0576000816000905550600101620002d6565b5090565b600060028204905060018216806200030d57607f821691505b602082108114156200032457620003236200032a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6138c380620003696000396000f3fe6080604052600436106102305760003560e01c80636c0360eb1161012e578063a22cb465116100ab578063d0eb26b01161006f578063d0eb26b0146107e7578063d5abeb0114610810578063e985e9c51461083b578063edec5f2714610878578063f2fde38b146108a157610230565b8063a22cb465146106f0578063b88d4fde14610719578063ba4e5c4914610742578063ba7d2c761461077f578063c87b56dd146107aa57610230565b80638da5cb5b116100f25780638da5cb5b1461062a5780638eb563961461065557806395d89b411461067e5780639c70b512146106a9578063a0712d68146106d457610230565b80636c0360eb1461056b57806370a0823114610596578063715018a6146105d35780637f00c7a6146105ea5780638456cb591461061357610230565b806323b872dd116101bc5780633f4ba83a116101805780633f4ba83a1461049a57806342842e0e146104b157806344a0d68a146104da5780635c975abb146105035780636352211e1461052e57610230565b806323b872dd146103ea57806328fb1eff146104135780633af32abf1461042a5780633c952764146104675780633ccfd60b1461049057610230565b80630e709b1b116102035780630e709b1b1461030357806313faede61461032c57806318160ddd1461035757806318cae26914610382578063239c70ae146103bf57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612b8f565b6108ca565b6040516102699190612fb9565b60405180910390f35b34801561027e57600080fd5b5061028761095c565b6040516102949190612fd4565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612c32565b6109ee565b6040516102d19190612f52565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190612a95565b610a6a565b005b34801561030f57600080fd5b5061032a60048036038101906103259190612be9565b610bab565b005b34801561033857600080fd5b50610341610c04565b60405161034e9190613196565b60405180910390f35b34801561036357600080fd5b5061036c610c0a565b6040516103799190613196565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190612912565b610c21565b6040516103b69190613196565b60405180910390f35b3480156103cb57600080fd5b506103d4610c39565b6040516103e19190613196565b60405180910390f35b3480156103f657600080fd5b50610411600480360381019061040c919061297f565b610c3f565b005b34801561041f57600080fd5b50610428610f64565b005b34801561043657600080fd5b50610451600480360381019061044c9190612912565b610f89565b60405161045e9190612fb9565b60405180910390f35b34801561047357600080fd5b5061048e60048036038101906104899190612b62565b611052565b005b610498611077565b005b3480156104a657600080fd5b506104af6110ff565b005b3480156104bd57600080fd5b506104d860048036038101906104d3919061297f565b611111565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190612c32565b611131565b005b34801561050f57600080fd5b50610518611143565b6040516105259190612fb9565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190612c32565b61115a565b6040516105629190612f52565b60405180910390f35b34801561057757600080fd5b5061058061116c565b60405161058d9190612fd4565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190612912565b6111fa565b6040516105ca9190613196565b60405180910390f35b3480156105df57600080fd5b506105e86112b3565b005b3480156105f657600080fd5b50610611600480360381019061060c9190612c32565b6112c7565b005b34801561061f57600080fd5b506106286112d9565b005b34801561063657600080fd5b5061063f6112eb565b60405161064c9190612f52565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190612ad5565b611315565b005b34801561068a57600080fd5b5061069361142d565b6040516106a09190612fd4565b60405180910390f35b3480156106b557600080fd5b506106be6114bf565b6040516106cb9190612fb9565b60405180910390f35b6106ee60048036038101906106e99190612c32565b6114d2565b005b3480156106fc57600080fd5b5061071760048036038101906107129190612a55565b611837565b005b34801561072557600080fd5b50610740600480360381019061073b91906129d2565b6119af565b005b34801561074e57600080fd5b5061076960048036038101906107649190612c32565b611a22565b6040516107769190612f52565b60405180910390f35b34801561078b57600080fd5b50610794611a61565b6040516107a19190613196565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190612c32565b611a67565b6040516107de9190612fd4565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612c32565b611b06565b005b34801561081c57600080fd5b50610825611b18565b6040516108329190613196565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d919061293f565b611b1e565b60405161086f9190612fb9565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a9190612b15565b611bb2565b005b3480156108ad57600080fd5b506108c860048036038101906108c39190612912565b611bde565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109555750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096b906133f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610997906133f9565b80156109e45780601f106109b9576101008083540402835291602001916109e4565b820191906000526020600020905b8154815290600101906020018083116109c757829003601f168201915b5050505050905090565b60006109f982611c62565b610a2f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a758261115a565b90508073ffffffffffffffffffffffffffffffffffffffff16610a96611cc1565b73ffffffffffffffffffffffffffffffffffffffff1614610af957610ac281610abd611cc1565b611b1e565b610af8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610bb3611cc9565b8060099080519060200190610bc99291906125fa565b507f8eca6ea708f9bc34439b72366aa672afc86bb8b1294f1ba9637945c5dab8ea7481604051610bf99190612fd4565b60405180910390a150565b600a5481565b6000610c14611d47565b6001546000540303905090565b60106020528060005260406000206000915090505481565b600c5481565b6000610c4a82611d4c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cb1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cbd84611e1a565b91509150610cd38187610cce611cc1565b611e3c565b610d1f57610ce886610ce3611cc1565b611b1e565b610d1e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d86576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d938686866001611e80565b8015610d9e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e6c85610e48888887611e86565b7c020000000000000000000000000000000000000000000000000000000017611eae565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610ef4576000600185019050600060046000838152602001908152602001600020541415610ef2576000548114610ef1578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f5c8686866001611ed9565b505050505050565b610f6c611cc9565b6000600e60006101000a81548160ff021916908315150217905550565b600060011515600e60009054906101000a900460ff16151514156110485760005b600f80549050811015611046578273ffffffffffffffffffffffffffffffffffffffff16600f8281548110610fe257610fe1613503565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561103357600191505061104d565b808061103e9061345c565b915050610faa565b505b600090505b919050565b61105a611cc9565b80600e60006101000a81548160ff02191690831515021790555050565b61107f611cc9565b60006110896112eb565b73ffffffffffffffffffffffffffffffffffffffff16476040516110ac90612f3d565b60006040518083038185875af1925050503d80600081146110e9576040519150601f19603f3d011682016040523d82523d6000602084013e6110ee565b606091505b50509050806110fc57600080fd5b50565b611107611cc9565b61110f611edf565b565b61112c838383604051806020016040528060008152506119af565b505050565b611139611cc9565b80600a8190555050565b6000600860149054906101000a900460ff16905090565b600061116582611d4c565b9050919050565b60098054611179906133f9565b80601f01602080910402602001604051908101604052809291908181526020018280546111a5906133f9565b80156111f25780601f106111c7576101008083540402835291602001916111f2565b820191906000526020600020905b8154815290600101906020018083116111d557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611262576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112bb611cc9565b6112c56000611f42565b565b6112cf611cc9565b80600c8190555050565b6112e1611cc9565b6112e9612008565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61131d611cc9565b60008160ff1611611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a906130f6565b60405180910390fd5b600061136d610c0a565b9050600b548260ff16826113819190613286565b11156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990613076565b60405180910390fd5b6113cf838360ff1661206b565b8160ff16601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114219190613286565b92505081905550505050565b60606003805461143c906133f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611468906133f9565b80156114b55780601f1061148a576101008083540402835291602001916114b5565b820191906000526020600020905b81548152906001019060200180831161149857829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1681565b6114da611143565b1561151a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611511906130d6565b60405180910390fd5b6000611524610c0a565b905060008211611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090613176565b60405180910390fd5b600c548211156115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590613096565b60405180910390fd5b600b5482826115bd9190613286565b11156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613076565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600d5483826116519190613286565b1115611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990613036565b60405180910390fd5b61169a6112eb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117d25760011515600e60009054906101000a900460ff1615151415611781576116f133610f89565b611730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172790613156565b60405180910390fd5b6103e8838361173f9190613286565b1115611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790613136565b60405180910390fd5b5b82600a5461178f91906132dc565b3410156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613116565b60405180910390fd5b5b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118219190613286565b92505081905550611832338461206b565b505050565b61183f611cc1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006118b1611cc1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661195e611cc1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119a39190612fb9565b60405180910390a35050565b6119ba848484610c3f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a1c576119e584848484612089565b611a1b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f8181548110611a3257600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b6060611a7282611c62565b611aa8576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ab26121e9565b9050600081511415611ad35760405180602001604052806000815250611afe565b80611add8461227b565b604051602001611aee929190612f19565b6040516020818303038152906040525b915050919050565b611b0e611cc9565b80600d8190555050565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bba611cc9565b600f6000611bc89190612680565b8181600f9190611bd99291906126a1565b505050565b611be6611cc9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90613016565b60405180910390fd5b611c5f81611f42565b50565b600081611c6d611d47565b11158015611c7c575060005482105b8015611cba575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b611cd16122d5565b73ffffffffffffffffffffffffffffffffffffffff16611cef6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c906130b6565b60405180910390fd5b565b600090565b60008082905080611d5b611d47565b11611de357600054811015611de25760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611de0575b6000811415611dd6576004600083600190039350838152602001908152602001600020549050611dab565b8092505050611e15565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611e9d8686846122dd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611ee76122e6565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f2b6122d5565b604051611f389190612f52565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61201061232f565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120546122d5565b6040516120619190612f52565b60405180910390a1565b612085828260405180602001604052806000815250612379565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120af611cc1565b8786866040518563ffffffff1660e01b81526004016120d19493929190612f6d565b602060405180830381600087803b1580156120eb57600080fd5b505af192505050801561211c57506040513d601f19601f820116820180604052508101906121199190612bbc565b60015b612196573d806000811461214c576040519150601f19603f3d011682016040523d82523d6000602084013e612151565b606091505b5060008151141561218e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546121f8906133f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612224906133f9565b80156122715780601f1061224657610100808354040283529160200191612271565b820191906000526020600020905b81548152906001019060200180831161225457829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156122c157600183039250600a81066030018353600a810490506122a1565b508181036020830392508083525050919050565b600033905090565b60009392505050565b6122ee611143565b61232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490612ff6565b60405180910390fd5b565b612337611143565b15612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e90613056565b60405180910390fd5b565b6123838383612416565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461241157600080549050600083820390505b6123c36000868380600101945086612089565b6123f9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106123b057816000541461240e57600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612483576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156124be576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124cb6000848385611e80565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612542836125336000866000611e86565b61253c856125ea565b17611eae565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612566578060008190555050506125e56000848385611ed9565b505050565b60006001821460e11b9050919050565b828054612606906133f9565b90600052602060002090601f016020900481019282612628576000855561266f565b82601f1061264157805160ff191683800117855561266f565b8280016001018555821561266f579182015b8281111561266e578251825591602001919060010190612653565b5b50905061267c9190612741565b5090565b508054600082559060005260206000209081019061269e9190612741565b50565b828054828255906000526020600020908101928215612730579160200282015b8281111561272f57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906126c1565b5b50905061273d9190612741565b5090565b5b8082111561275a576000816000905550600101612742565b5090565b600061277161276c846131d6565b6131b1565b90508281526020810184848401111561278d5761278c613570565b5b6127988482856133b7565b509392505050565b60006127b36127ae84613207565b6131b1565b9050828152602081018484840111156127cf576127ce613570565b5b6127da8482856133b7565b509392505050565b6000813590506127f18161381a565b92915050565b60008083601f84011261280d5761280c613566565b5b8235905067ffffffffffffffff81111561282a57612829613561565b5b6020830191508360208202830111156128465761284561356b565b5b9250929050565b60008135905061285c81613831565b92915050565b60008135905061287181613848565b92915050565b60008151905061288681613848565b92915050565b600082601f8301126128a1576128a0613566565b5b81356128b184826020860161275e565b91505092915050565b600082601f8301126128cf576128ce613566565b5b81356128df8482602086016127a0565b91505092915050565b6000813590506128f78161385f565b92915050565b60008135905061290c81613876565b92915050565b6000602082840312156129285761292761357a565b5b6000612936848285016127e2565b91505092915050565b600080604083850312156129565761295561357a565b5b6000612964858286016127e2565b9250506020612975858286016127e2565b9150509250929050565b6000806000606084860312156129985761299761357a565b5b60006129a6868287016127e2565b93505060206129b7868287016127e2565b92505060406129c8868287016128e8565b9150509250925092565b600080600080608085870312156129ec576129eb61357a565b5b60006129fa878288016127e2565b9450506020612a0b878288016127e2565b9350506040612a1c878288016128e8565b925050606085013567ffffffffffffffff811115612a3d57612a3c613575565b5b612a498782880161288c565b91505092959194509250565b60008060408385031215612a6c57612a6b61357a565b5b6000612a7a858286016127e2565b9250506020612a8b8582860161284d565b9150509250929050565b60008060408385031215612aac57612aab61357a565b5b6000612aba858286016127e2565b9250506020612acb858286016128e8565b9150509250929050565b60008060408385031215612aec57612aeb61357a565b5b6000612afa858286016127e2565b9250506020612b0b858286016128fd565b9150509250929050565b60008060208385031215612b2c57612b2b61357a565b5b600083013567ffffffffffffffff811115612b4a57612b49613575565b5b612b56858286016127f7565b92509250509250929050565b600060208284031215612b7857612b7761357a565b5b6000612b868482850161284d565b91505092915050565b600060208284031215612ba557612ba461357a565b5b6000612bb384828501612862565b91505092915050565b600060208284031215612bd257612bd161357a565b5b6000612be084828501612877565b91505092915050565b600060208284031215612bff57612bfe61357a565b5b600082013567ffffffffffffffff811115612c1d57612c1c613575565b5b612c29848285016128ba565b91505092915050565b600060208284031215612c4857612c4761357a565b5b6000612c56848285016128e8565b91505092915050565b612c6881613336565b82525050565b612c7781613348565b82525050565b6000612c8882613238565b612c92818561324e565b9350612ca28185602086016133c6565b612cab8161357f565b840191505092915050565b6000612cc182613243565b612ccb818561326a565b9350612cdb8185602086016133c6565b612ce48161357f565b840191505092915050565b6000612cfa82613243565b612d04818561327b565b9350612d148185602086016133c6565b80840191505092915050565b6000612d2d60148361326a565b9150612d3882613590565b602082019050919050565b6000612d5060268361326a565b9150612d5b826135b9565b604082019050919050565b6000612d73601c8361326a565b9150612d7e82613608565b602082019050919050565b6000612d9660108361326a565b9150612da182613631565b602082019050919050565b6000612db960168361326a565b9150612dc48261365a565b602082019050919050565b6000612ddc60248361326a565b9150612de782613683565b604082019050919050565b6000612dff60208361326a565b9150612e0a826136d2565b602082019050919050565b6000612e2260168361326a565b9150612e2d826136fb565b602082019050919050565b6000612e4560138361326a565b9150612e5082613724565b602082019050919050565b6000612e6860008361325f565b9150612e738261374d565b600082019050919050565b6000612e8b60128361326a565b9150612e9682613750565b602082019050919050565b6000612eae60258361326a565b9150612eb982613779565b604082019050919050565b6000612ed160178361326a565b9150612edc826137c8565b602082019050919050565b6000612ef4601b8361326a565b9150612eff826137f1565b602082019050919050565b612f13816133a0565b82525050565b6000612f258285612cef565b9150612f318284612cef565b91508190509392505050565b6000612f4882612e5b565b9150819050919050565b6000602082019050612f676000830184612c5f565b92915050565b6000608082019050612f826000830187612c5f565b612f8f6020830186612c5f565b612f9c6040830185612f0a565b8181036060830152612fae8184612c7d565b905095945050505050565b6000602082019050612fce6000830184612c6e565b92915050565b60006020820190508181036000830152612fee8184612cb6565b905092915050565b6000602082019050818103600083015261300f81612d20565b9050919050565b6000602082019050818103600083015261302f81612d43565b9050919050565b6000602082019050818103600083015261304f81612d66565b9050919050565b6000602082019050818103600083015261306f81612d89565b9050919050565b6000602082019050818103600083015261308f81612dac565b9050919050565b600060208201905081810360008301526130af81612dcf565b9050919050565b600060208201905081810360008301526130cf81612df2565b9050919050565b600060208201905081810360008301526130ef81612e15565b9050919050565b6000602082019050818103600083015261310f81612e38565b9050919050565b6000602082019050818103600083015261312f81612e7e565b9050919050565b6000602082019050818103600083015261314f81612ea1565b9050919050565b6000602082019050818103600083015261316f81612ec4565b9050919050565b6000602082019050818103600083015261318f81612ee7565b9050919050565b60006020820190506131ab6000830184612f0a565b92915050565b60006131bb6131cc565b90506131c7828261342b565b919050565b6000604051905090565b600067ffffffffffffffff8211156131f1576131f0613532565b5b6131fa8261357f565b9050602081019050919050565b600067ffffffffffffffff82111561322257613221613532565b5b61322b8261357f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613291826133a0565b915061329c836133a0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132d1576132d06134a5565b5b828201905092915050565b60006132e7826133a0565b91506132f2836133a0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561332b5761332a6134a5565b5b828202905092915050565b600061334182613380565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156133e45780820151818401526020810190506133c9565b838111156133f3576000848401525b50505050565b6000600282049050600182168061341157607f821691505b60208210811415613425576134246134d4565b5b50919050565b6134348261357f565b810181811067ffffffffffffffff8211171561345357613452613532565b5b80604052505050565b6000613467826133a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561349a576134996134a5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4e6f20616d6f756e742073706563696669656400000000000000000000000000600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f46697273742077686974656c697374206c696d6974206578636565646564202860008201527f3130303029000000000000000000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b61382381613336565b811461382e57600080fd5b50565b61383a81613348565b811461384557600080fd5b50565b61385181613354565b811461385c57600080fd5b50565b613868816133a0565b811461387357600080fd5b50565b61387f816133aa565b811461388a57600080fd5b5056fea2646970667358221220effb5dbedde29d44e21284ccbba4097f719c6eac5be426ed49b640fbf482b67564736f6c63430008070033697066733a2f2f6261667962656966627a636263687a62796b716370786a33726f7a6733626b6e696c74686e6a6b7570366c79696874706b746e767a7078693433692f

Deployed Bytecode

0x6080604052600436106102305760003560e01c80636c0360eb1161012e578063a22cb465116100ab578063d0eb26b01161006f578063d0eb26b0146107e7578063d5abeb0114610810578063e985e9c51461083b578063edec5f2714610878578063f2fde38b146108a157610230565b8063a22cb465146106f0578063b88d4fde14610719578063ba4e5c4914610742578063ba7d2c761461077f578063c87b56dd146107aa57610230565b80638da5cb5b116100f25780638da5cb5b1461062a5780638eb563961461065557806395d89b411461067e5780639c70b512146106a9578063a0712d68146106d457610230565b80636c0360eb1461056b57806370a0823114610596578063715018a6146105d35780637f00c7a6146105ea5780638456cb591461061357610230565b806323b872dd116101bc5780633f4ba83a116101805780633f4ba83a1461049a57806342842e0e146104b157806344a0d68a146104da5780635c975abb146105035780636352211e1461052e57610230565b806323b872dd146103ea57806328fb1eff146104135780633af32abf1461042a5780633c952764146104675780633ccfd60b1461049057610230565b80630e709b1b116102035780630e709b1b1461030357806313faede61461032c57806318160ddd1461035757806318cae26914610382578063239c70ae146103bf57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612b8f565b6108ca565b6040516102699190612fb9565b60405180910390f35b34801561027e57600080fd5b5061028761095c565b6040516102949190612fd4565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612c32565b6109ee565b6040516102d19190612f52565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190612a95565b610a6a565b005b34801561030f57600080fd5b5061032a60048036038101906103259190612be9565b610bab565b005b34801561033857600080fd5b50610341610c04565b60405161034e9190613196565b60405180910390f35b34801561036357600080fd5b5061036c610c0a565b6040516103799190613196565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190612912565b610c21565b6040516103b69190613196565b60405180910390f35b3480156103cb57600080fd5b506103d4610c39565b6040516103e19190613196565b60405180910390f35b3480156103f657600080fd5b50610411600480360381019061040c919061297f565b610c3f565b005b34801561041f57600080fd5b50610428610f64565b005b34801561043657600080fd5b50610451600480360381019061044c9190612912565b610f89565b60405161045e9190612fb9565b60405180910390f35b34801561047357600080fd5b5061048e60048036038101906104899190612b62565b611052565b005b610498611077565b005b3480156104a657600080fd5b506104af6110ff565b005b3480156104bd57600080fd5b506104d860048036038101906104d3919061297f565b611111565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190612c32565b611131565b005b34801561050f57600080fd5b50610518611143565b6040516105259190612fb9565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190612c32565b61115a565b6040516105629190612f52565b60405180910390f35b34801561057757600080fd5b5061058061116c565b60405161058d9190612fd4565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190612912565b6111fa565b6040516105ca9190613196565b60405180910390f35b3480156105df57600080fd5b506105e86112b3565b005b3480156105f657600080fd5b50610611600480360381019061060c9190612c32565b6112c7565b005b34801561061f57600080fd5b506106286112d9565b005b34801561063657600080fd5b5061063f6112eb565b60405161064c9190612f52565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190612ad5565b611315565b005b34801561068a57600080fd5b5061069361142d565b6040516106a09190612fd4565b60405180910390f35b3480156106b557600080fd5b506106be6114bf565b6040516106cb9190612fb9565b60405180910390f35b6106ee60048036038101906106e99190612c32565b6114d2565b005b3480156106fc57600080fd5b5061071760048036038101906107129190612a55565b611837565b005b34801561072557600080fd5b50610740600480360381019061073b91906129d2565b6119af565b005b34801561074e57600080fd5b5061076960048036038101906107649190612c32565b611a22565b6040516107769190612f52565b60405180910390f35b34801561078b57600080fd5b50610794611a61565b6040516107a19190613196565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190612c32565b611a67565b6040516107de9190612fd4565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612c32565b611b06565b005b34801561081c57600080fd5b50610825611b18565b6040516108329190613196565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d919061293f565b611b1e565b60405161086f9190612fb9565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a9190612b15565b611bb2565b005b3480156108ad57600080fd5b506108c860048036038101906108c39190612912565b611bde565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109555750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096b906133f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610997906133f9565b80156109e45780601f106109b9576101008083540402835291602001916109e4565b820191906000526020600020905b8154815290600101906020018083116109c757829003601f168201915b5050505050905090565b60006109f982611c62565b610a2f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a758261115a565b90508073ffffffffffffffffffffffffffffffffffffffff16610a96611cc1565b73ffffffffffffffffffffffffffffffffffffffff1614610af957610ac281610abd611cc1565b611b1e565b610af8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610bb3611cc9565b8060099080519060200190610bc99291906125fa565b507f8eca6ea708f9bc34439b72366aa672afc86bb8b1294f1ba9637945c5dab8ea7481604051610bf99190612fd4565b60405180910390a150565b600a5481565b6000610c14611d47565b6001546000540303905090565b60106020528060005260406000206000915090505481565b600c5481565b6000610c4a82611d4c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cb1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cbd84611e1a565b91509150610cd38187610cce611cc1565b611e3c565b610d1f57610ce886610ce3611cc1565b611b1e565b610d1e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d86576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d938686866001611e80565b8015610d9e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e6c85610e48888887611e86565b7c020000000000000000000000000000000000000000000000000000000017611eae565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610ef4576000600185019050600060046000838152602001908152602001600020541415610ef2576000548114610ef1578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f5c8686866001611ed9565b505050505050565b610f6c611cc9565b6000600e60006101000a81548160ff021916908315150217905550565b600060011515600e60009054906101000a900460ff16151514156110485760005b600f80549050811015611046578273ffffffffffffffffffffffffffffffffffffffff16600f8281548110610fe257610fe1613503565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561103357600191505061104d565b808061103e9061345c565b915050610faa565b505b600090505b919050565b61105a611cc9565b80600e60006101000a81548160ff02191690831515021790555050565b61107f611cc9565b60006110896112eb565b73ffffffffffffffffffffffffffffffffffffffff16476040516110ac90612f3d565b60006040518083038185875af1925050503d80600081146110e9576040519150601f19603f3d011682016040523d82523d6000602084013e6110ee565b606091505b50509050806110fc57600080fd5b50565b611107611cc9565b61110f611edf565b565b61112c838383604051806020016040528060008152506119af565b505050565b611139611cc9565b80600a8190555050565b6000600860149054906101000a900460ff16905090565b600061116582611d4c565b9050919050565b60098054611179906133f9565b80601f01602080910402602001604051908101604052809291908181526020018280546111a5906133f9565b80156111f25780601f106111c7576101008083540402835291602001916111f2565b820191906000526020600020905b8154815290600101906020018083116111d557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611262576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112bb611cc9565b6112c56000611f42565b565b6112cf611cc9565b80600c8190555050565b6112e1611cc9565b6112e9612008565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61131d611cc9565b60008160ff1611611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a906130f6565b60405180910390fd5b600061136d610c0a565b9050600b548260ff16826113819190613286565b11156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990613076565b60405180910390fd5b6113cf838360ff1661206b565b8160ff16601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114219190613286565b92505081905550505050565b60606003805461143c906133f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611468906133f9565b80156114b55780601f1061148a576101008083540402835291602001916114b5565b820191906000526020600020905b81548152906001019060200180831161149857829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1681565b6114da611143565b1561151a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611511906130d6565b60405180910390fd5b6000611524610c0a565b905060008211611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090613176565b60405180910390fd5b600c548211156115ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a590613096565b60405180910390fd5b600b5482826115bd9190613286565b11156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613076565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600d5483826116519190613286565b1115611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990613036565b60405180910390fd5b61169a6112eb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117d25760011515600e60009054906101000a900460ff1615151415611781576116f133610f89565b611730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172790613156565b60405180910390fd5b6103e8838361173f9190613286565b1115611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790613136565b60405180910390fd5b5b82600a5461178f91906132dc565b3410156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613116565b60405180910390fd5b5b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118219190613286565b92505081905550611832338461206b565b505050565b61183f611cc1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006118b1611cc1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661195e611cc1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119a39190612fb9565b60405180910390a35050565b6119ba848484610c3f565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a1c576119e584848484612089565b611a1b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f8181548110611a3257600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b6060611a7282611c62565b611aa8576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ab26121e9565b9050600081511415611ad35760405180602001604052806000815250611afe565b80611add8461227b565b604051602001611aee929190612f19565b6040516020818303038152906040525b915050919050565b611b0e611cc9565b80600d8190555050565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bba611cc9565b600f6000611bc89190612680565b8181600f9190611bd99291906126a1565b505050565b611be6611cc9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90613016565b60405180910390fd5b611c5f81611f42565b50565b600081611c6d611d47565b11158015611c7c575060005482105b8015611cba575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b611cd16122d5565b73ffffffffffffffffffffffffffffffffffffffff16611cef6112eb565b73ffffffffffffffffffffffffffffffffffffffff1614611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c906130b6565b60405180910390fd5b565b600090565b60008082905080611d5b611d47565b11611de357600054811015611de25760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611de0575b6000811415611dd6576004600083600190039350838152602001908152602001600020549050611dab565b8092505050611e15565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611e9d8686846122dd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611ee76122e6565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611f2b6122d5565b604051611f389190612f52565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61201061232f565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120546122d5565b6040516120619190612f52565b60405180910390a1565b612085828260405180602001604052806000815250612379565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120af611cc1565b8786866040518563ffffffff1660e01b81526004016120d19493929190612f6d565b602060405180830381600087803b1580156120eb57600080fd5b505af192505050801561211c57506040513d601f19601f820116820180604052508101906121199190612bbc565b60015b612196573d806000811461214c576040519150601f19603f3d011682016040523d82523d6000602084013e612151565b606091505b5060008151141561218e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546121f8906133f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612224906133f9565b80156122715780601f1061224657610100808354040283529160200191612271565b820191906000526020600020905b81548152906001019060200180831161225457829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156122c157600183039250600a81066030018353600a810490506122a1565b508181036020830392508083525050919050565b600033905090565b60009392505050565b6122ee611143565b61232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490612ff6565b60405180910390fd5b565b612337611143565b15612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e90613056565b60405180910390fd5b565b6123838383612416565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461241157600080549050600083820390505b6123c36000868380600101945086612089565b6123f9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106123b057816000541461240e57600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612483576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156124be576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124cb6000848385611e80565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612542836125336000866000611e86565b61253c856125ea565b17611eae565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612566578060008190555050506125e56000848385611ed9565b505050565b60006001821460e11b9050919050565b828054612606906133f9565b90600052602060002090601f016020900481019282612628576000855561266f565b82601f1061264157805160ff191683800117855561266f565b8280016001018555821561266f579182015b8281111561266e578251825591602001919060010190612653565b5b50905061267c9190612741565b5090565b508054600082559060005260206000209081019061269e9190612741565b50565b828054828255906000526020600020908101928215612730579160200282015b8281111561272f57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906126c1565b5b50905061273d9190612741565b5090565b5b8082111561275a576000816000905550600101612742565b5090565b600061277161276c846131d6565b6131b1565b90508281526020810184848401111561278d5761278c613570565b5b6127988482856133b7565b509392505050565b60006127b36127ae84613207565b6131b1565b9050828152602081018484840111156127cf576127ce613570565b5b6127da8482856133b7565b509392505050565b6000813590506127f18161381a565b92915050565b60008083601f84011261280d5761280c613566565b5b8235905067ffffffffffffffff81111561282a57612829613561565b5b6020830191508360208202830111156128465761284561356b565b5b9250929050565b60008135905061285c81613831565b92915050565b60008135905061287181613848565b92915050565b60008151905061288681613848565b92915050565b600082601f8301126128a1576128a0613566565b5b81356128b184826020860161275e565b91505092915050565b600082601f8301126128cf576128ce613566565b5b81356128df8482602086016127a0565b91505092915050565b6000813590506128f78161385f565b92915050565b60008135905061290c81613876565b92915050565b6000602082840312156129285761292761357a565b5b6000612936848285016127e2565b91505092915050565b600080604083850312156129565761295561357a565b5b6000612964858286016127e2565b9250506020612975858286016127e2565b9150509250929050565b6000806000606084860312156129985761299761357a565b5b60006129a6868287016127e2565b93505060206129b7868287016127e2565b92505060406129c8868287016128e8565b9150509250925092565b600080600080608085870312156129ec576129eb61357a565b5b60006129fa878288016127e2565b9450506020612a0b878288016127e2565b9350506040612a1c878288016128e8565b925050606085013567ffffffffffffffff811115612a3d57612a3c613575565b5b612a498782880161288c565b91505092959194509250565b60008060408385031215612a6c57612a6b61357a565b5b6000612a7a858286016127e2565b9250506020612a8b8582860161284d565b9150509250929050565b60008060408385031215612aac57612aab61357a565b5b6000612aba858286016127e2565b9250506020612acb858286016128e8565b9150509250929050565b60008060408385031215612aec57612aeb61357a565b5b6000612afa858286016127e2565b9250506020612b0b858286016128fd565b9150509250929050565b60008060208385031215612b2c57612b2b61357a565b5b600083013567ffffffffffffffff811115612b4a57612b49613575565b5b612b56858286016127f7565b92509250509250929050565b600060208284031215612b7857612b7761357a565b5b6000612b868482850161284d565b91505092915050565b600060208284031215612ba557612ba461357a565b5b6000612bb384828501612862565b91505092915050565b600060208284031215612bd257612bd161357a565b5b6000612be084828501612877565b91505092915050565b600060208284031215612bff57612bfe61357a565b5b600082013567ffffffffffffffff811115612c1d57612c1c613575565b5b612c29848285016128ba565b91505092915050565b600060208284031215612c4857612c4761357a565b5b6000612c56848285016128e8565b91505092915050565b612c6881613336565b82525050565b612c7781613348565b82525050565b6000612c8882613238565b612c92818561324e565b9350612ca28185602086016133c6565b612cab8161357f565b840191505092915050565b6000612cc182613243565b612ccb818561326a565b9350612cdb8185602086016133c6565b612ce48161357f565b840191505092915050565b6000612cfa82613243565b612d04818561327b565b9350612d148185602086016133c6565b80840191505092915050565b6000612d2d60148361326a565b9150612d3882613590565b602082019050919050565b6000612d5060268361326a565b9150612d5b826135b9565b604082019050919050565b6000612d73601c8361326a565b9150612d7e82613608565b602082019050919050565b6000612d9660108361326a565b9150612da182613631565b602082019050919050565b6000612db960168361326a565b9150612dc48261365a565b602082019050919050565b6000612ddc60248361326a565b9150612de782613683565b604082019050919050565b6000612dff60208361326a565b9150612e0a826136d2565b602082019050919050565b6000612e2260168361326a565b9150612e2d826136fb565b602082019050919050565b6000612e4560138361326a565b9150612e5082613724565b602082019050919050565b6000612e6860008361325f565b9150612e738261374d565b600082019050919050565b6000612e8b60128361326a565b9150612e9682613750565b602082019050919050565b6000612eae60258361326a565b9150612eb982613779565b604082019050919050565b6000612ed160178361326a565b9150612edc826137c8565b602082019050919050565b6000612ef4601b8361326a565b9150612eff826137f1565b602082019050919050565b612f13816133a0565b82525050565b6000612f258285612cef565b9150612f318284612cef565b91508190509392505050565b6000612f4882612e5b565b9150819050919050565b6000602082019050612f676000830184612c5f565b92915050565b6000608082019050612f826000830187612c5f565b612f8f6020830186612c5f565b612f9c6040830185612f0a565b8181036060830152612fae8184612c7d565b905095945050505050565b6000602082019050612fce6000830184612c6e565b92915050565b60006020820190508181036000830152612fee8184612cb6565b905092915050565b6000602082019050818103600083015261300f81612d20565b9050919050565b6000602082019050818103600083015261302f81612d43565b9050919050565b6000602082019050818103600083015261304f81612d66565b9050919050565b6000602082019050818103600083015261306f81612d89565b9050919050565b6000602082019050818103600083015261308f81612dac565b9050919050565b600060208201905081810360008301526130af81612dcf565b9050919050565b600060208201905081810360008301526130cf81612df2565b9050919050565b600060208201905081810360008301526130ef81612e15565b9050919050565b6000602082019050818103600083015261310f81612e38565b9050919050565b6000602082019050818103600083015261312f81612e7e565b9050919050565b6000602082019050818103600083015261314f81612ea1565b9050919050565b6000602082019050818103600083015261316f81612ec4565b9050919050565b6000602082019050818103600083015261318f81612ee7565b9050919050565b60006020820190506131ab6000830184612f0a565b92915050565b60006131bb6131cc565b90506131c7828261342b565b919050565b6000604051905090565b600067ffffffffffffffff8211156131f1576131f0613532565b5b6131fa8261357f565b9050602081019050919050565b600067ffffffffffffffff82111561322257613221613532565b5b61322b8261357f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613291826133a0565b915061329c836133a0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132d1576132d06134a5565b5b828201905092915050565b60006132e7826133a0565b91506132f2836133a0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561332b5761332a6134a5565b5b828202905092915050565b600061334182613380565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156133e45780820151818401526020810190506133c9565b838111156133f3576000848401525b50505050565b6000600282049050600182168061341157607f821691505b60208210811415613425576134246134d4565b5b50919050565b6134348261357f565b810181811067ffffffffffffffff8211171561345357613452613532565b5b80604052505050565b6000613467826133a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561349a576134996134a5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4e6f20616d6f756e742073706563696669656400000000000000000000000000600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f46697273742077686974656c697374206c696d6974206578636565646564202860008201527f3130303029000000000000000000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b61382381613336565b811461382e57600080fd5b50565b61383a81613348565b811461384557600080fd5b50565b61385181613354565b811461385c57600080fd5b50565b613868816133a0565b811461387357600080fd5b50565b61387f816133aa565b811461388a57600080fd5b5056fea2646970667358221220effb5dbedde29d44e21284ccbba4097f719c6eac5be426ed49b640fbf482b67564736f6c63430008070033

Deployed Bytecode Sourcemap

48241:3308:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18074:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23721:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25667:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25215:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50482:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48398:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17128:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48637:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48472:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34932:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51162:83;;;;;;;;;;;;;:::i;:::-;;50186:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51061:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51401:145;;;:::i;:::-;;50992:63;;;;;;;;;;;;;:::i;:::-;;26557:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50611:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1342:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23510:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48300:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18753:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3542:103;;;;;;;;;;;;;:::i;:::-;;50697:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50929:57;;;;;;;;;;;;;:::i;:::-;;2894:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49882:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23890:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48555:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48922:954;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25943:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26813:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48595:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48510:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24065:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50819:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48435:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26322:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51251:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3800:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18074:615;18159:4;18474:10;18459:25;;:11;:25;;;;:102;;;;18551:10;18536:25;;:11;:25;;;;18459:102;:179;;;;18628:10;18613:25;;:11;:25;;;;18459:179;18439:199;;18074:615;;;:::o;23721:100::-;23775:13;23808:5;23801:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23721:100;:::o;25667:204::-;25735:7;25760:16;25768:7;25760;:16::i;:::-;25755:64;;25785:34;;;;;;;;;;;;;;25755:64;25839:15;:24;25855:7;25839:24;;;;;;;;;;;;;;;;;;;;;25832:31;;25667:204;;;:::o;25215:386::-;25288:13;25304:16;25312:7;25304;:16::i;:::-;25288:32;;25360:5;25337:28;;:19;:17;:19::i;:::-;:28;;;25333:175;;25385:44;25402:5;25409:19;:17;:19::i;:::-;25385:16;:44::i;:::-;25380:128;;25457:35;;;;;;;;;;;;;;25380:128;25333:175;25547:2;25520:15;:24;25536:7;25520:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25585:7;25581:2;25565:28;;25574:5;25565:28;;;;;;;;;;;;25277:324;25215:386;;:::o;50482:123::-;2780:13;:11;:13::i;:::-;50560:7:::1;50550;:17;;;;;;;;;;;;:::i;:::-;;50579:20;50591:7;50579:20;;;;;;:::i;:::-;;;;;;;;50482:123:::0;:::o;48398:32::-;;;;:::o;17128:315::-;17181:7;17409:15;:13;:15::i;:::-;17394:12;;17378:13;;:28;:46;17371:53;;17128:315;:::o;48637:55::-;;;;;;;;;;;;;;;;;:::o;48472:33::-;;;;:::o;34932:2800::-;35066:27;35096;35115:7;35096:18;:27::i;:::-;35066:57;;35181:4;35140:45;;35156:19;35140:45;;;35136:86;;35194:28;;;;;;;;;;;;;;35136:86;35236:27;35265:23;35292:28;35312:7;35292:19;:28::i;:::-;35235:85;;;;35420:62;35439:15;35456:4;35462:19;:17;:19::i;:::-;35420:18;:62::i;:::-;35415:174;;35502:43;35519:4;35525:19;:17;:19::i;:::-;35502:16;:43::i;:::-;35497:92;;35554:35;;;;;;;;;;;;;;35497:92;35415:174;35620:1;35606:16;;:2;:16;;;35602:52;;;35631:23;;;;;;;;;;;;;;35602:52;35667:43;35689:4;35695:2;35699:7;35708:1;35667:21;:43::i;:::-;35803:15;35800:160;;;35943:1;35922:19;35915:30;35800:160;36338:18;:24;36357:4;36338:24;;;;;;;;;;;;;;;;36336:26;;;;;;;;;;;;36407:18;:22;36426:2;36407:22;;;;;;;;;;;;;;;;36405:24;;;;;;;;;;;36729:145;36766:2;36814:45;36829:4;36835:2;36839:19;36814:14;:45::i;:::-;14356:8;36787:72;36729:18;:145::i;:::-;36700:17;:26;36718:7;36700:26;;;;;;;;;;;:174;;;;37044:1;14356:8;36994:19;:46;:51;36990:626;;;37066:19;37098:1;37088:7;:11;37066:33;;37255:1;37221:17;:30;37239:11;37221:30;;;;;;;;;;;;:35;37217:384;;;37359:13;;37344:11;:28;37340:242;;37539:19;37506:17;:30;37524:11;37506:30;;;;;;;;;;;:52;;;;37340:242;37217:384;37047:569;36990:626;37663:7;37659:2;37644:27;;37653:4;37644:27;;;;;;;;;;;;37682:42;37703:4;37709:2;37713:7;37722:1;37682:20;:42::i;:::-;35055:2677;;;34932:2800;;;:::o;51162:83::-;2780:13;:11;:13::i;:::-;51234:5:::1;51216:15;;:23;;;;;;;;;;;;;;;;;;51162:83::o:0;50186:290::-;50245:4;50281;50262:23;;:15;;;;;;;;;;;:23;;;50258:194;;;50301:6;50296:149;50317:20;:27;;;;50313:1;:31;50296:149;;;50393:5;50366:32;;:20;50387:1;50366:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;50362:74;;;50420:4;50413:11;;;;;50362:74;50346:3;;;;;:::i;:::-;;;;50296:149;;;;50258:194;50465:5;50458:12;;50186:290;;;;:::o;51061:95::-;2780:13;:11;:13::i;:::-;51144:6:::1;51126:15;;:24;;;;;;;;;;;;;;;;;;51061:95:::0;:::o;51401:145::-;2780:13;:11;:13::i;:::-;51454:7:::1;51475;:5;:7::i;:::-;51467:21;;51496;51467:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51453:69;;;51537:2;51529:11;;;::::0;::::1;;51446:100;51401:145::o:0;50992:63::-;2780:13;:11;:13::i;:::-;51039:10:::1;:8;:10::i;:::-;50992:63::o:0;26557:185::-;26695:39;26712:4;26718:2;26722:7;26695:39;;;;;;;;;;;;:16;:39::i;:::-;26557:185;;;:::o;50611:80::-;2780:13;:11;:13::i;:::-;50677:8:::1;50670:4;:15;;;;50611:80:::0;:::o;1342:86::-;1389:4;1413:7;;;;;;;;;;;1406:14;;1342:86;:::o;23510:144::-;23574:7;23617:27;23636:7;23617:18;:27::i;:::-;23594:52;;23510:144;;;:::o;48300:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18753:224::-;18817:7;18858:1;18841:19;;:5;:19;;;18837:60;;;18869:28;;;;;;;;;;;;;;18837:60;13308:13;18915:18;:25;18934:5;18915:25;;;;;;;;;;;;;;;;:54;18908:61;;18753:224;;;:::o;3542:103::-;2780:13;:11;:13::i;:::-;3607:30:::1;3634:1;3607:18;:30::i;:::-;3542:103::o:0;50697:116::-;2780:13;:11;:13::i;:::-;50790:17:::1;50774:13;:33;;;;50697:116:::0;:::o;50929:57::-;2780:13;:11;:13::i;:::-;50972:8:::1;:6;:8::i;:::-;50929:57::o:0;2894:87::-;2940:7;2967:6;;;;;;;;;;;2960:13;;2894:87;:::o;49882:298::-;2780:13;:11;:13::i;:::-;49973:1:::1;49964:6;:10;;;49956:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;50005:14;50022:13;:11;:13::i;:::-;50005:30;;50069:9;;50059:6;50050:15;;:6;:15;;;;:::i;:::-;:28;;50042:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50112:21;50122:2;50126:6;50112:21;;:9;:21::i;:::-;50168:6;50140:34;;:20;:24;50161:2;50140:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;49949:231;49882:298:::0;;:::o;23890:104::-;23946:13;23979:7;23972:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23890:104;:::o;48555:35::-;;;;;;;;;;;;;:::o;48922:954::-;48988:8;:6;:8::i;:::-;48987:9;48979:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;49030:14;49047:13;:11;:13::i;:::-;49030:30;;49089:1;49075:11;:15;49067:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49152:13;;49137:11;:28;;49129:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;49245:9;;49230:11;49221:6;:20;;;;:::i;:::-;:33;;49213:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49290:24;49317:20;:32;49338:10;49317:32;;;;;;;;;;;;;;;;49290:59;;49398:18;;49383:11;49364:16;:30;;;;:::i;:::-;:52;;49356:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;49478:7;:5;:7::i;:::-;49464:21;;:10;:21;;;49460:314;;49519:4;49500:23;;:15;;;;;;;;;;;:23;;;49496:200;;;49544:25;49558:10;49544:13;:25::i;:::-;49536:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49640:4;49625:11;49616:6;:20;;;;:::i;:::-;:28;;49608:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;49496:200;49732:11;49725:4;;:18;;;;:::i;:::-;49712:9;:31;;49704:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49460:314;49818:11;49782:20;:32;49803:10;49782:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;49836:34;49846:10;49858:11;49836:9;:34::i;:::-;48972:904;;48922:954;:::o;25943:308::-;26054:19;:17;:19::i;:::-;26042:31;;:8;:31;;;26038:61;;;26082:17;;;;;;;;;;;;;;26038:61;26164:8;26112:18;:39;26131:19;:17;:19::i;:::-;26112:39;;;;;;;;;;;;;;;:49;26152:8;26112:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26224:8;26188:55;;26203:19;:17;:19::i;:::-;26188:55;;;26234:8;26188:55;;;;;;:::i;:::-;;;;;;;;25943:308;;:::o;26813:399::-;26980:31;26993:4;26999:2;27003:7;26980:12;:31::i;:::-;27044:1;27026:2;:14;;;:19;27022:183;;27065:56;27096:4;27102:2;27106:7;27115:5;27065:30;:56::i;:::-;27060:145;;27149:40;;;;;;;;;;;;;;27060:145;27022:183;26813:399;;;;:::o;48595:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48510:38::-;;;;:::o;24065:318::-;24138:13;24169:16;24177:7;24169;:16::i;:::-;24164:59;;24194:29;;;;;;;;;;;;;;24164:59;24236:21;24260:10;:8;:10::i;:::-;24236:34;;24313:1;24294:7;24288:21;:26;;:87;;;;;;;;;;;;;;;;;24341:7;24350:18;24360:7;24350:9;:18::i;:::-;24324:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24288:87;24281:94;;;24065:318;;;:::o;50819:104::-;2780:13;:11;:13::i;:::-;50911:6:::1;50890:18;:27;;;;50819:104:::0;:::o;48435:32::-;;;;:::o;26322:164::-;26419:4;26443:18;:25;26462:5;26443:25;;;;;;;;;;;;;;;:35;26469:8;26443:35;;;;;;;;;;;;;;;;;;;;;;;;;26436:42;;26322:164;;;;:::o;51251:144::-;2780:13;:11;:13::i;:::-;51333:20:::1;;51326:27;;;;:::i;:::-;51383:6;;51360:20;:29;;;;;;;:::i;:::-;;51251:144:::0;;:::o;3800:201::-;2780:13;:11;:13::i;:::-;3909:1:::1;3889:22;;:8;:22;;;;3881:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3965:28;3984:8;3965:18;:28::i;:::-;3800:201:::0;:::o;27467:273::-;27524:4;27580:7;27561:15;:13;:15::i;:::-;:26;;:66;;;;;27614:13;;27604:7;:23;27561:66;:152;;;;;27712:1;14078:8;27665:17;:26;27683:7;27665:26;;;;;;;;;;;;:43;:48;27561:152;27541:172;;27467:273;;;:::o;46028:105::-;46088:7;46115:10;46108:17;;46028:105;:::o;3059:132::-;3134:12;:10;:12::i;:::-;3123:23;;:7;:5;:7::i;:::-;:23;;;3115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3059:132::o;16652:92::-;16708:7;16652:92;:::o;20427:1129::-;20494:7;20514:12;20529:7;20514:22;;20597:4;20578:15;:13;:15::i;:::-;:23;20574:915;;20631:13;;20624:4;:20;20620:869;;;20669:14;20686:17;:23;20704:4;20686:23;;;;;;;;;;;;20669:40;;20802:1;14078:8;20775:6;:23;:28;20771:699;;;21294:113;21311:1;21301:6;:11;21294:113;;;21354:17;:25;21372:6;;;;;;;21354:25;;;;;;;;;;;;21345:34;;21294:113;;;21440:6;21433:13;;;;;;20771:699;20646:843;20620:869;20574:915;21517:31;;;;;;;;;;;;;;20427:1129;;;;:::o;33268:652::-;33363:27;33392:23;33433:53;33489:15;33433:71;;33675:7;33669:4;33662:21;33710:22;33704:4;33697:36;33786:4;33780;33770:21;33747:44;;33882:19;33876:26;33857:45;;33613:300;33268:652;;;:::o;34033:645::-;34175:11;34337:15;34331:4;34327:26;34319:34;;34496:15;34485:9;34481:31;34468:44;;34643:15;34632:9;34629:30;34622:4;34611:9;34608:19;34605:55;34595:65;;34033:645;;;;;:::o;44861:159::-;;;;;:::o;43173:309::-;43308:7;43328:16;14479:3;43354:19;:40;;43328:67;;14479:3;43421:31;43432:4;43438:2;43442:9;43421:10;:31::i;:::-;43413:40;;:61;;43406:68;;;43173:309;;;;;:::o;23001:447::-;23081:14;23249:15;23242:5;23238:27;23229:36;;23423:5;23409:11;23385:22;23381:40;23378:51;23371:5;23368:62;23358:72;;23001:447;;;;:::o;45679:158::-;;;;;:::o;2197:120::-;1206:16;:14;:16::i;:::-;2266:5:::1;2256:7;;:15;;;;;;;;;;;;;;;;;;2287:22;2296:12;:10;:12::i;:::-;2287:22;;;;;;:::i;:::-;;;;;;;;2197:120::o:0;4161:191::-;4235:16;4254:6;;;;;;;;;;;4235:25;;4280:8;4271:6;;:17;;;;;;;;;;;;;;;;;;4335:8;4304:40;;4325:8;4304:40;;;;;;;;;;;;4224:128;4161:191;:::o;1938:118::-;947:19;:17;:19::i;:::-;2008:4:::1;1998:7;;:14;;;;;;;;;;;;;;;;;;2028:20;2035:12;:10;:12::i;:::-;2028:20;;;;;;:::i;:::-;;;;;;;;1938:118::o:0;27824:104::-;27893:27;27903:2;27907:8;27893:27;;;;;;;;;;;;:9;:27::i;:::-;27824:104;;:::o;41683:716::-;41846:4;41892:2;41867:45;;;41913:19;:17;:19::i;:::-;41934:4;41940:7;41949:5;41867:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41863:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42167:1;42150:6;:13;:18;42146:235;;;42196:40;;;;;;;;;;;;;;42146:235;42339:6;42333:13;42324:6;42320:2;42316:15;42309:38;41863:529;42036:54;;;42026:64;;;:6;:64;;;;42019:71;;;41683:716;;;;;;:::o;48801:102::-;48861:13;48890:7;48883:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48801:102;:::o;46239:1960::-;46296:17;46715:3;46708:4;46702:11;46698:21;46691:28;;46806:3;46800:4;46793:17;46912:3;47368:5;47498:1;47493:3;47489:11;47482:18;;47635:2;47629:4;47625:13;47621:2;47617:22;47612:3;47604:36;47676:2;47670:4;47666:13;47658:21;;47260:697;47695:4;47260:697;;;47886:1;47881:3;47877:11;47870:18;;47937:2;47931:4;47927:13;47923:2;47919:22;47914:3;47906:36;47790:2;47784:4;47780:13;47772:21;;47260:697;;;47264:430;47996:3;47991;47987:13;48111:2;48106:3;48102:12;48095:19;;48174:6;48169:3;48162:19;46335:1857;;46239:1960;;;:::o;68:98::-;121:7;148:10;141:17;;68:98;:::o;44058:147::-;44195:6;44058:147;;;;;:::o;1686:108::-;1753:8;:6;:8::i;:::-;1745:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;1686:108::o;1501:::-;1572:8;:6;:8::i;:::-;1571:9;1563:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1501:108::o;28344:681::-;28467:19;28473:2;28477:8;28467:5;:19::i;:::-;28546:1;28528:2;:14;;;:19;28524:483;;28568:11;28582:13;;28568:27;;28614:13;28636:8;28630:3;:14;28614:30;;28663:233;28694:62;28733:1;28737:2;28741:7;;;;;;28750:5;28694:30;:62::i;:::-;28689:167;;28792:40;;;;;;;;;;;;;;28689:167;28891:3;28883:5;:11;28663:233;;28978:3;28961:13;;:20;28957:34;;28983:8;;;28957:34;28549:458;;28524:483;28344:681;;;:::o;29298:1529::-;29363:20;29386:13;;29363:36;;29428:1;29414:16;;:2;:16;;;29410:48;;;29439:19;;;;;;;;;;;;;;29410:48;29485:1;29473:8;:13;29469:44;;;29495:18;;;;;;;;;;;;;;29469:44;29526:61;29556:1;29560:2;29564:12;29578:8;29526:21;:61::i;:::-;30069:1;13445:2;30040:1;:25;;30039:31;30027:8;:44;30001:18;:22;30020:2;30001:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;30348:139;30385:2;30439:33;30462:1;30466:2;30470:1;30439:14;:33::i;:::-;30406:30;30427:8;30406:20;:30::i;:::-;:66;30348:18;:139::i;:::-;30314:17;:31;30332:12;30314:31;;;;;;;;;;;:173;;;;30504:15;30522:12;30504:30;;30549:11;30578:8;30563:12;:23;30549:37;;30601:101;30653:9;;;;;;30649:2;30628:35;;30645:1;30628:35;;;;;;;;;;;;30697:3;30687:7;:13;30601:101;;30734:3;30718:13;:19;;;;29775:974;;30759:60;30788:1;30792:2;30796:12;30810:8;30759:20;:60::i;:::-;29352:1475;29298:1529;;:::o;24831:322::-;24901:14;25132:1;25122:8;25119:15;25094:23;25090:45;25080:55;;24831:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:135::-;2912:5;2950:6;2937:20;2928:29;;2966:31;2991:5;2966:31;:::i;:::-;2868:135;;;;:::o;3009:329::-;3068:6;3117:2;3105:9;3096:7;3092:23;3088:32;3085:119;;;3123:79;;:::i;:::-;3085:119;3243:1;3268:53;3313:7;3304:6;3293:9;3289:22;3268:53;:::i;:::-;3258:63;;3214:117;3009:329;;;;:::o;3344:474::-;3412:6;3420;3469:2;3457:9;3448:7;3444:23;3440:32;3437:119;;;3475:79;;:::i;:::-;3437:119;3595:1;3620:53;3665:7;3656:6;3645:9;3641:22;3620:53;:::i;:::-;3610:63;;3566:117;3722:2;3748:53;3793:7;3784:6;3773:9;3769:22;3748:53;:::i;:::-;3738:63;;3693:118;3344:474;;;;;:::o;3824:619::-;3901:6;3909;3917;3966:2;3954:9;3945:7;3941:23;3937:32;3934:119;;;3972:79;;:::i;:::-;3934:119;4092:1;4117:53;4162:7;4153:6;4142:9;4138:22;4117:53;:::i;:::-;4107:63;;4063:117;4219:2;4245:53;4290:7;4281:6;4270:9;4266:22;4245:53;:::i;:::-;4235:63;;4190:118;4347:2;4373:53;4418:7;4409:6;4398:9;4394:22;4373:53;:::i;:::-;4363:63;;4318:118;3824:619;;;;;:::o;4449:943::-;4544:6;4552;4560;4568;4617:3;4605:9;4596:7;4592:23;4588:33;4585:120;;;4624:79;;:::i;:::-;4585:120;4744:1;4769:53;4814:7;4805:6;4794:9;4790:22;4769:53;:::i;:::-;4759:63;;4715:117;4871:2;4897:53;4942:7;4933:6;4922:9;4918:22;4897:53;:::i;:::-;4887:63;;4842:118;4999:2;5025:53;5070:7;5061:6;5050:9;5046:22;5025:53;:::i;:::-;5015:63;;4970:118;5155:2;5144:9;5140:18;5127:32;5186:18;5178:6;5175:30;5172:117;;;5208:79;;:::i;:::-;5172:117;5313:62;5367:7;5358:6;5347:9;5343:22;5313:62;:::i;:::-;5303:72;;5098:287;4449:943;;;;;;;:::o;5398:468::-;5463:6;5471;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:53;5716:7;5707:6;5696:9;5692:22;5671:53;:::i;:::-;5661:63;;5617:117;5773:2;5799:50;5841:7;5832:6;5821:9;5817:22;5799:50;:::i;:::-;5789:60;;5744:115;5398:468;;;;;:::o;5872:474::-;5940:6;5948;5997:2;5985:9;5976:7;5972:23;5968:32;5965:119;;;6003:79;;:::i;:::-;5965:119;6123:1;6148:53;6193:7;6184:6;6173:9;6169:22;6148:53;:::i;:::-;6138:63;;6094:117;6250:2;6276:53;6321:7;6312:6;6301:9;6297:22;6276:53;:::i;:::-;6266:63;;6221:118;5872:474;;;;;:::o;6352:470::-;6418:6;6426;6475:2;6463:9;6454:7;6450:23;6446:32;6443:119;;;6481:79;;:::i;:::-;6443:119;6601:1;6626:53;6671:7;6662:6;6651:9;6647:22;6626:53;:::i;:::-;6616:63;;6572:117;6728:2;6754:51;6797:7;6788:6;6777:9;6773:22;6754:51;:::i;:::-;6744:61;;6699:116;6352:470;;;;;:::o;6828:559::-;6914:6;6922;6971:2;6959:9;6950:7;6946:23;6942:32;6939:119;;;6977:79;;:::i;:::-;6939:119;7125:1;7114:9;7110:17;7097:31;7155:18;7147:6;7144:30;7141:117;;;7177:79;;:::i;:::-;7141:117;7290:80;7362:7;7353:6;7342:9;7338:22;7290:80;:::i;:::-;7272:98;;;;7068:312;6828:559;;;;;:::o;7393:323::-;7449:6;7498:2;7486:9;7477:7;7473:23;7469:32;7466:119;;;7504:79;;:::i;:::-;7466:119;7624:1;7649:50;7691:7;7682:6;7671:9;7667:22;7649:50;:::i;:::-;7639:60;;7595:114;7393:323;;;;:::o;7722:327::-;7780:6;7829:2;7817:9;7808:7;7804:23;7800:32;7797:119;;;7835:79;;:::i;:::-;7797:119;7955:1;7980:52;8024:7;8015:6;8004:9;8000:22;7980:52;:::i;:::-;7970:62;;7926:116;7722:327;;;;:::o;8055:349::-;8124:6;8173:2;8161:9;8152:7;8148:23;8144:32;8141:119;;;8179:79;;:::i;:::-;8141:119;8299:1;8324:63;8379:7;8370:6;8359:9;8355:22;8324:63;:::i;:::-;8314:73;;8270:127;8055:349;;;;:::o;8410:509::-;8479:6;8528:2;8516:9;8507:7;8503:23;8499:32;8496:119;;;8534:79;;:::i;:::-;8496:119;8682:1;8671:9;8667:17;8654:31;8712:18;8704:6;8701:30;8698:117;;;8734:79;;:::i;:::-;8698:117;8839:63;8894:7;8885:6;8874:9;8870:22;8839:63;:::i;:::-;8829:73;;8625:287;8410:509;;;;:::o;8925:329::-;8984:6;9033:2;9021:9;9012:7;9008:23;9004:32;9001:119;;;9039:79;;:::i;:::-;9001:119;9159:1;9184:53;9229:7;9220:6;9209:9;9205:22;9184:53;:::i;:::-;9174:63;;9130:117;8925:329;;;;:::o;9260:118::-;9347:24;9365:5;9347:24;:::i;:::-;9342:3;9335:37;9260:118;;:::o;9384:109::-;9465:21;9480:5;9465:21;:::i;:::-;9460:3;9453:34;9384:109;;:::o;9499:360::-;9585:3;9613:38;9645:5;9613:38;:::i;:::-;9667:70;9730:6;9725:3;9667:70;:::i;:::-;9660:77;;9746:52;9791:6;9786:3;9779:4;9772:5;9768:16;9746:52;:::i;:::-;9823:29;9845:6;9823:29;:::i;:::-;9818:3;9814:39;9807:46;;9589:270;9499:360;;;;:::o;9865:364::-;9953:3;9981:39;10014:5;9981:39;:::i;:::-;10036:71;10100:6;10095:3;10036:71;:::i;:::-;10029:78;;10116:52;10161:6;10156:3;10149:4;10142:5;10138:16;10116:52;:::i;:::-;10193:29;10215:6;10193:29;:::i;:::-;10188:3;10184:39;10177:46;;9957:272;9865:364;;;;:::o;10235:377::-;10341:3;10369:39;10402:5;10369:39;:::i;:::-;10424:89;10506:6;10501:3;10424:89;:::i;:::-;10417:96;;10522:52;10567:6;10562:3;10555:4;10548:5;10544:16;10522:52;:::i;:::-;10599:6;10594:3;10590:16;10583:23;;10345:267;10235:377;;;;:::o;10618:366::-;10760:3;10781:67;10845:2;10840:3;10781:67;:::i;:::-;10774:74;;10857:93;10946:3;10857:93;:::i;:::-;10975:2;10970:3;10966:12;10959:19;;10618:366;;;:::o;10990:::-;11132:3;11153:67;11217:2;11212:3;11153:67;:::i;:::-;11146:74;;11229:93;11318:3;11229:93;:::i;:::-;11347:2;11342:3;11338:12;11331:19;;10990:366;;;:::o;11362:::-;11504:3;11525:67;11589:2;11584:3;11525:67;:::i;:::-;11518:74;;11601:93;11690:3;11601:93;:::i;:::-;11719:2;11714:3;11710:12;11703:19;;11362:366;;;:::o;11734:::-;11876:3;11897:67;11961:2;11956:3;11897:67;:::i;:::-;11890:74;;11973:93;12062:3;11973:93;:::i;:::-;12091:2;12086:3;12082:12;12075:19;;11734:366;;;:::o;12106:::-;12248:3;12269:67;12333:2;12328:3;12269:67;:::i;:::-;12262:74;;12345:93;12434:3;12345:93;:::i;:::-;12463:2;12458:3;12454:12;12447:19;;12106:366;;;:::o;12478:::-;12620:3;12641:67;12705:2;12700:3;12641:67;:::i;:::-;12634:74;;12717:93;12806:3;12717:93;:::i;:::-;12835:2;12830:3;12826:12;12819:19;;12478:366;;;:::o;12850:::-;12992:3;13013:67;13077:2;13072:3;13013:67;:::i;:::-;13006:74;;13089:93;13178:3;13089:93;:::i;:::-;13207:2;13202:3;13198:12;13191:19;;12850:366;;;:::o;13222:::-;13364:3;13385:67;13449:2;13444:3;13385:67;:::i;:::-;13378:74;;13461:93;13550:3;13461:93;:::i;:::-;13579:2;13574:3;13570:12;13563:19;;13222:366;;;:::o;13594:::-;13736:3;13757:67;13821:2;13816:3;13757:67;:::i;:::-;13750:74;;13833:93;13922:3;13833:93;:::i;:::-;13951:2;13946:3;13942:12;13935:19;;13594:366;;;:::o;13966:398::-;14125:3;14146:83;14227:1;14222:3;14146:83;:::i;:::-;14139:90;;14238:93;14327:3;14238:93;:::i;:::-;14356:1;14351:3;14347:11;14340:18;;13966:398;;;:::o;14370:366::-;14512:3;14533:67;14597:2;14592:3;14533:67;:::i;:::-;14526:74;;14609:93;14698:3;14609:93;:::i;:::-;14727:2;14722:3;14718:12;14711:19;;14370:366;;;:::o;14742:::-;14884:3;14905:67;14969:2;14964:3;14905:67;:::i;:::-;14898:74;;14981:93;15070:3;14981:93;:::i;:::-;15099:2;15094:3;15090:12;15083:19;;14742:366;;;:::o;15114:::-;15256:3;15277:67;15341:2;15336:3;15277:67;:::i;:::-;15270:74;;15353:93;15442:3;15353:93;:::i;:::-;15471:2;15466:3;15462:12;15455:19;;15114:366;;;:::o;15486:::-;15628:3;15649:67;15713:2;15708:3;15649:67;:::i;:::-;15642:74;;15725:93;15814:3;15725:93;:::i;:::-;15843:2;15838:3;15834:12;15827:19;;15486:366;;;:::o;15858:118::-;15945:24;15963:5;15945:24;:::i;:::-;15940:3;15933:37;15858:118;;:::o;15982:435::-;16162:3;16184:95;16275:3;16266:6;16184:95;:::i;:::-;16177:102;;16296:95;16387:3;16378:6;16296:95;:::i;:::-;16289:102;;16408:3;16401:10;;15982:435;;;;;:::o;16423:379::-;16607:3;16629:147;16772:3;16629:147;:::i;:::-;16622:154;;16793:3;16786:10;;16423:379;;;:::o;16808:222::-;16901:4;16939:2;16928:9;16924:18;16916:26;;16952:71;17020:1;17009:9;17005:17;16996:6;16952:71;:::i;:::-;16808:222;;;;:::o;17036:640::-;17231:4;17269:3;17258:9;17254:19;17246:27;;17283:71;17351:1;17340:9;17336:17;17327:6;17283:71;:::i;:::-;17364:72;17432:2;17421:9;17417:18;17408:6;17364:72;:::i;:::-;17446;17514:2;17503:9;17499:18;17490:6;17446:72;:::i;:::-;17565:9;17559:4;17555:20;17550:2;17539:9;17535:18;17528:48;17593:76;17664:4;17655:6;17593:76;:::i;:::-;17585:84;;17036:640;;;;;;;:::o;17682:210::-;17769:4;17807:2;17796:9;17792:18;17784:26;;17820:65;17882:1;17871:9;17867:17;17858:6;17820:65;:::i;:::-;17682:210;;;;:::o;17898:313::-;18011:4;18049:2;18038:9;18034:18;18026:26;;18098:9;18092:4;18088:20;18084:1;18073:9;18069:17;18062:47;18126:78;18199:4;18190:6;18126:78;:::i;:::-;18118:86;;17898:313;;;;:::o;18217:419::-;18383:4;18421:2;18410:9;18406:18;18398:26;;18470:9;18464:4;18460:20;18456:1;18445:9;18441:17;18434:47;18498:131;18624:4;18498:131;:::i;:::-;18490:139;;18217:419;;;:::o;18642:::-;18808:4;18846:2;18835:9;18831:18;18823:26;;18895:9;18889:4;18885:20;18881:1;18870:9;18866:17;18859:47;18923:131;19049:4;18923:131;:::i;:::-;18915:139;;18642:419;;;:::o;19067:::-;19233:4;19271:2;19260:9;19256:18;19248:26;;19320:9;19314:4;19310:20;19306:1;19295:9;19291:17;19284:47;19348:131;19474:4;19348:131;:::i;:::-;19340:139;;19067:419;;;:::o;19492:::-;19658:4;19696:2;19685:9;19681:18;19673:26;;19745:9;19739:4;19735:20;19731:1;19720:9;19716:17;19709:47;19773:131;19899:4;19773:131;:::i;:::-;19765:139;;19492:419;;;:::o;19917:::-;20083:4;20121:2;20110:9;20106:18;20098:26;;20170:9;20164:4;20160:20;20156:1;20145:9;20141:17;20134:47;20198:131;20324:4;20198:131;:::i;:::-;20190:139;;19917:419;;;:::o;20342:::-;20508:4;20546:2;20535:9;20531:18;20523:26;;20595:9;20589:4;20585:20;20581:1;20570:9;20566:17;20559:47;20623:131;20749:4;20623:131;:::i;:::-;20615:139;;20342:419;;;:::o;20767:::-;20933:4;20971:2;20960:9;20956:18;20948:26;;21020:9;21014:4;21010:20;21006:1;20995:9;20991:17;20984:47;21048:131;21174:4;21048:131;:::i;:::-;21040:139;;20767:419;;;:::o;21192:::-;21358:4;21396:2;21385:9;21381:18;21373:26;;21445:9;21439:4;21435:20;21431:1;21420:9;21416:17;21409:47;21473:131;21599:4;21473:131;:::i;:::-;21465:139;;21192:419;;;:::o;21617:::-;21783:4;21821:2;21810:9;21806:18;21798:26;;21870:9;21864:4;21860:20;21856:1;21845:9;21841:17;21834:47;21898:131;22024:4;21898:131;:::i;:::-;21890:139;;21617:419;;;:::o;22042:::-;22208:4;22246:2;22235:9;22231:18;22223:26;;22295:9;22289:4;22285:20;22281:1;22270:9;22266:17;22259:47;22323:131;22449:4;22323:131;:::i;:::-;22315:139;;22042:419;;;:::o;22467:::-;22633:4;22671:2;22660:9;22656:18;22648:26;;22720:9;22714:4;22710:20;22706:1;22695:9;22691:17;22684:47;22748:131;22874:4;22748:131;:::i;:::-;22740:139;;22467:419;;;:::o;22892:::-;23058:4;23096:2;23085:9;23081:18;23073:26;;23145:9;23139:4;23135:20;23131:1;23120:9;23116:17;23109:47;23173:131;23299:4;23173:131;:::i;:::-;23165:139;;22892:419;;;:::o;23317:::-;23483:4;23521:2;23510:9;23506:18;23498:26;;23570:9;23564:4;23560:20;23556:1;23545:9;23541:17;23534:47;23598:131;23724:4;23598:131;:::i;:::-;23590:139;;23317:419;;;:::o;23742:222::-;23835:4;23873:2;23862:9;23858:18;23850:26;;23886:71;23954:1;23943:9;23939:17;23930:6;23886:71;:::i;:::-;23742:222;;;;:::o;23970:129::-;24004:6;24031:20;;:::i;:::-;24021:30;;24060:33;24088:4;24080:6;24060:33;:::i;:::-;23970:129;;;:::o;24105:75::-;24138:6;24171:2;24165:9;24155:19;;24105:75;:::o;24186:307::-;24247:4;24337:18;24329:6;24326:30;24323:56;;;24359:18;;:::i;:::-;24323:56;24397:29;24419:6;24397:29;:::i;:::-;24389:37;;24481:4;24475;24471:15;24463:23;;24186:307;;;:::o;24499:308::-;24561:4;24651:18;24643:6;24640:30;24637:56;;;24673:18;;:::i;:::-;24637:56;24711:29;24733:6;24711:29;:::i;:::-;24703:37;;24795:4;24789;24785:15;24777:23;;24499:308;;;:::o;24813:98::-;24864:6;24898:5;24892:12;24882:22;;24813:98;;;:::o;24917:99::-;24969:6;25003:5;24997:12;24987:22;;24917:99;;;:::o;25022:168::-;25105:11;25139:6;25134:3;25127:19;25179:4;25174:3;25170:14;25155:29;;25022:168;;;;:::o;25196:147::-;25297:11;25334:3;25319:18;;25196:147;;;;:::o;25349:169::-;25433:11;25467:6;25462:3;25455:19;25507:4;25502:3;25498:14;25483:29;;25349:169;;;;:::o;25524:148::-;25626:11;25663:3;25648:18;;25524:148;;;;:::o;25678:305::-;25718:3;25737:20;25755:1;25737:20;:::i;:::-;25732:25;;25771:20;25789:1;25771:20;:::i;:::-;25766:25;;25925:1;25857:66;25853:74;25850:1;25847:81;25844:107;;;25931:18;;:::i;:::-;25844:107;25975:1;25972;25968:9;25961:16;;25678:305;;;;:::o;25989:348::-;26029:7;26052:20;26070:1;26052:20;:::i;:::-;26047:25;;26086:20;26104:1;26086:20;:::i;:::-;26081:25;;26274:1;26206:66;26202:74;26199:1;26196:81;26191:1;26184:9;26177:17;26173:105;26170:131;;;26281:18;;:::i;:::-;26170:131;26329:1;26326;26322:9;26311:20;;25989:348;;;;:::o;26343:96::-;26380:7;26409:24;26427:5;26409:24;:::i;:::-;26398:35;;26343:96;;;:::o;26445:90::-;26479:7;26522:5;26515:13;26508:21;26497:32;;26445:90;;;:::o;26541:149::-;26577:7;26617:66;26610:5;26606:78;26595:89;;26541:149;;;:::o;26696:126::-;26733:7;26773:42;26766:5;26762:54;26751:65;;26696:126;;;:::o;26828:77::-;26865:7;26894:5;26883:16;;26828:77;;;:::o;26911:86::-;26946:7;26986:4;26979:5;26975:16;26964:27;;26911:86;;;:::o;27003:154::-;27087:6;27082:3;27077;27064:30;27149:1;27140:6;27135:3;27131:16;27124:27;27003:154;;;:::o;27163:307::-;27231:1;27241:113;27255:6;27252:1;27249:13;27241:113;;;27340:1;27335:3;27331:11;27325:18;27321:1;27316:3;27312:11;27305:39;27277:2;27274:1;27270:10;27265:15;;27241:113;;;27372:6;27369:1;27366:13;27363:101;;;27452:1;27443:6;27438:3;27434:16;27427:27;27363:101;27212:258;27163:307;;;:::o;27476:320::-;27520:6;27557:1;27551:4;27547:12;27537:22;;27604:1;27598:4;27594:12;27625:18;27615:81;;27681:4;27673:6;27669:17;27659:27;;27615:81;27743:2;27735:6;27732:14;27712:18;27709:38;27706:84;;;27762:18;;:::i;:::-;27706:84;27527:269;27476:320;;;:::o;27802:281::-;27885:27;27907:4;27885:27;:::i;:::-;27877:6;27873:40;28015:6;28003:10;28000:22;27979:18;27967:10;27964:34;27961:62;27958:88;;;28026:18;;:::i;:::-;27958:88;28066:10;28062:2;28055:22;27845:238;27802:281;;:::o;28089:233::-;28128:3;28151:24;28169:5;28151:24;:::i;:::-;28142:33;;28197:66;28190:5;28187:77;28184:103;;;28267:18;;:::i;:::-;28184:103;28314:1;28307:5;28303:13;28296:20;;28089:233;;;:::o;28328:180::-;28376:77;28373:1;28366:88;28473:4;28470:1;28463:15;28497:4;28494:1;28487:15;28514:180;28562:77;28559:1;28552:88;28659:4;28656:1;28649:15;28683:4;28680:1;28673:15;28700:180;28748:77;28745:1;28738:88;28845:4;28842:1;28835:15;28869:4;28866:1;28859:15;28886:180;28934:77;28931:1;28924:88;29031:4;29028:1;29021:15;29055:4;29052:1;29045:15;29072:117;29181:1;29178;29171:12;29195:117;29304:1;29301;29294:12;29318:117;29427:1;29424;29417:12;29441:117;29550:1;29547;29540:12;29564:117;29673:1;29670;29663:12;29687:117;29796:1;29793;29786:12;29810:102;29851:6;29902:2;29898:7;29893:2;29886:5;29882:14;29878:28;29868:38;;29810:102;;;:::o;29918:170::-;30058:22;30054:1;30046:6;30042:14;30035:46;29918:170;:::o;30094:225::-;30234:34;30230:1;30222:6;30218:14;30211:58;30303:8;30298:2;30290:6;30286:15;30279:33;30094:225;:::o;30325:178::-;30465:30;30461:1;30453:6;30449:14;30442:54;30325:178;:::o;30509:166::-;30649:18;30645:1;30637:6;30633:14;30626:42;30509:166;:::o;30681:172::-;30821:24;30817:1;30809:6;30805:14;30798:48;30681:172;:::o;30859:223::-;30999:34;30995:1;30987:6;30983:14;30976:58;31068:6;31063:2;31055:6;31051:15;31044:31;30859:223;:::o;31088:182::-;31228:34;31224:1;31216:6;31212:14;31205:58;31088:182;:::o;31276:172::-;31416:24;31412:1;31404:6;31400:14;31393:48;31276:172;:::o;31454:169::-;31594:21;31590:1;31582:6;31578:14;31571:45;31454:169;:::o;31629:114::-;;:::o;31749:168::-;31889:20;31885:1;31877:6;31873:14;31866:44;31749:168;:::o;31923:224::-;32063:34;32059:1;32051:6;32047:14;32040:58;32132:7;32127:2;32119:6;32115:15;32108:32;31923:224;:::o;32153:173::-;32293:25;32289:1;32281:6;32277:14;32270:49;32153:173;:::o;32332:177::-;32472:29;32468:1;32460:6;32456:14;32449:53;32332:177;:::o;32515:122::-;32588:24;32606:5;32588:24;:::i;:::-;32581:5;32578:35;32568:63;;32627:1;32624;32617:12;32568:63;32515:122;:::o;32643:116::-;32713:21;32728:5;32713:21;:::i;:::-;32706:5;32703:32;32693:60;;32749:1;32746;32739:12;32693:60;32643:116;:::o;32765:120::-;32837:23;32854:5;32837:23;:::i;:::-;32830:5;32827:34;32817:62;;32875:1;32872;32865:12;32817:62;32765:120;:::o;32891:122::-;32964:24;32982:5;32964:24;:::i;:::-;32957:5;32954:35;32944:63;;33003:1;33000;32993:12;32944:63;32891:122;:::o;33019:118::-;33090:22;33106:5;33090:22;:::i;:::-;33083:5;33080:33;33070:61;;33127:1;33124;33117:12;33070:61;33019:118;:::o

Swarm Source

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