ETH Price: $3,450.20 (+0.84%)
Gas: 8 Gwei

Token

GoblinGrundmaz (GG)
 

Overview

Max Total Supply

1,125 GG

Holders

135

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 GG
0x1e18677d4c9391ecbbbf63a0dc56f1b10f099f7f
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:
GoblinGrundmaz

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-06-08
*/

// SPDX-License-Identifier: MIT
// A Square //

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0; 

abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
 
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
 
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
 
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 Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
library Address { 
    function isContract(address account) internal view returns (bool) { 
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    } 
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    } 
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    } 
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
 
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
 
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else { 
            if (returndata.length > 0) { 

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
interface IERC721Receiver { 
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
 
interface IERC165 { 
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
 
abstract contract ERC165 is IERC165 { 
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
} 
interface IERC721 is IERC165 { 
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); 
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); 
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved); 
    function balanceOf(address owner) external view returns (uint256 balance); 
    function ownerOf(uint256 tokenId) external view returns (address owner); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function approve(address to, uint256 tokenId) external;
 
    function getApproved(uint256 tokenId) external view returns (address operator); 
    function setApprovalForAll(address operator, bool _approved) external; 
    function isApprovedForAll(address owner, address operator) external view returns (bool); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
} 
interface IERC721Enumerable is IERC721 { 
    function totalSupply() external view returns (uint256); 
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); 
    function tokenByIndex(uint256 index) external view returns (uint256);
}  
interface IERC721Metadata is IERC721 { 
    function name() external view returns (string memory); 
    function symbol() external view returns (string memory); 
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * 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 See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

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

    /**
     * Sets the auxillary 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 {
        _addressData[owner].aux = aux;
    }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_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 && !_ownerships[tokenId].burned;
    }

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

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

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

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

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

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

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

        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 Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

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

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


  uint256 public MAX_PER_Transaction = 10; // maximam amount that user can mint/Transaction
  uint256 public MAX_PER_WALLET = 10; // maximam amount that user can mint/Wallet

  mapping(address => uint256) public publicClaimedBy;

  uint256 public  PRICE = 0 ether;
  uint256 public  ACTUAL_PRICE = 0.005 ether; 


  uint256 private constant TotalCollectionSize_ = 7500; // total number of nfts
  uint256 private constant MaxMintPerBatch_ = 20; //max mint per transaction

  string private _baseTokenURI;
  uint public reserve = 0;


  uint public status = 0; //0-pause 1-public

  constructor() ERC721A("GoblinGrundmaz","GG") {

  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }
 
  function mint(uint256 quantity) external payable callerIsUser {
    require(status == 1 , "Sale is not Active");
    require(totalSupply() + quantity <= TotalCollectionSize_-reserve, "reached max supply");
    require(quantity <= MAX_PER_Transaction,"can not mint this many");

    if(totalSupply() + quantity <= 1000) {
        PRICE = 0;
    } else {
        PRICE = ACTUAL_PRICE;
    }
    require(msg.value >= PRICE * quantity, "Need to send more ETH.");

    publicClaimedBy[msg.sender] += quantity;
    require(publicClaimedBy[msg.sender] <= MAX_PER_WALLET, "Purchase exceeds max allowed");


    _safeMint(msg.sender, quantity);


  }

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

  function setBaseURI(string memory baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }
  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return _ownershipOf(tokenId);
  }

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

  function changeMintPrice(uint256 _newPrice) external onlyOwner
  {
      PRICE = _newPrice;
  }

  function changeActualMintPrice(uint256 _newPrice) external onlyOwner
  {
      ACTUAL_PRICE = _newPrice;
  }

   function changeMAX_PER_WALLET(uint256 q) external onlyOwner
  {
      MAX_PER_WALLET = q;
  }

  function changeMAX_PER_Transaction(uint256 q) external onlyOwner
  {
      MAX_PER_Transaction = q;
  }

  function setStatus(uint256 s)external onlyOwner{
      status = s;
  }

   function getStatus()public view returns(uint){
      return status;
  }

 function setReserveTokens(uint256 _quantity) public onlyOwner {
        reserve=_quantity;
    }
    
  function getPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*PRICE;
    }

    function getActualPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*ACTUAL_PRICE;
    }

 function mintReserveTokens(uint quantity) public onlyOwner {
        require(quantity <= reserve, "The quantity exceeds the reserve.");
        reserve -= quantity;
        _safeMint(msg.sender, quantity);

    }

  function airdrop(address sendTo, uint quantity)public onlyOwner{
    require(totalSupply() + quantity <= TotalCollectionSize_, "reached max supply");
    _safeMint(sendTo, quantity);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ACTUAL_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_Transaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sendTo","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeActualMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_Transaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getActualPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"setReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"s","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a8055600a600b556000600d556611c37937e08000600e55600060105560006011553480156200003457600080fd5b506040518060400160405280600e81526020017f476f626c696e4772756e646d617a0000000000000000000000000000000000008152506040518060400160405280600281526020017f4747000000000000000000000000000000000000000000000000000000000000815250620000c1620000b56200011960201b60201c565b6200012160201b60201c565b8160039080519060200190620000d9929190620001ee565b508060049080519060200190620000f2929190620001ee565b5062000103620001e560201b60201c565b6001819055505050600160098190555062000303565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620001fc906200029e565b90600052602060002090601f0160209004810192826200022057600085556200026c565b82601f106200023b57805160ff19168380011785556200026c565b828001600101855582156200026c579182015b828111156200026b5782518255916020019190600101906200024e565b5b5090506200027b91906200027f565b5090565b5b808211156200029a57600081600090555060010162000280565b5090565b60006002820490506001821680620002b757607f821691505b60208210811415620002ce57620002cd620002d4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61415d80620003136000396000f3fe60806040526004361061023b5760003560e01c8063752361431161012e578063aedc8e38116100ab578063dc33e6811161006f578063dc33e6811461085e578063e626cc1e1461089b578063e7572230146108c6578063e985e9c514610903578063f2fde38b146109405761023b565b8063aedc8e3814610767578063b88d4fde146107a4578063c151471a146107cd578063c87b56dd146107f6578063cd3293de146108335761023b565b806395d89b41116100f257806395d89b41146106b7578063a0712d68146106e2578063a22cb465146106fe578063a40ece7a14610727578063ac446002146107505761023b565b806375236143146105be5780638ba4cc3c146105fb5780638d859f3e146106245780638da5cb5b1461064f5780639231ab2a1461067a5761023b565b80633fd17366116101bc5780636352211e116101805780636352211e146104db57806369ba1a75146105185780636a44e1731461054157806370a082311461056a578063715018a6146105a75761023b565b80633fd173661461040a57806342842e0e146104335780634e69d5601461045c57806351d7ff931461048757806355f804b3146104b25761023b565b806318160ddd1161020357806318160ddd14610339578063200d2ed21461036457806323b872dd1461038f578063288bd8fd146103b85780632ba2865b146103e15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630f2cdd6c1461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906132b2565b610969565b6040516102749190613784565b60405180910390f35b34801561028957600080fd5b50610292610a4b565b60405161029f919061379f565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613355565b610add565b6040516102dc919061371d565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613272565b610b59565b005b34801561031a57600080fd5b50610323610c64565b604051610330919061395c565b60405180910390f35b34801561034557600080fd5b5061034e610c6a565b60405161035b919061395c565b60405180910390f35b34801561037057600080fd5b50610379610c81565b604051610386919061395c565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b1919061315c565b610c87565b005b3480156103c457600080fd5b506103df60048036038101906103da9190613355565b610c97565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613355565b610d7e565b005b34801561041657600080fd5b50610431600480360381019061042c9190613355565b610e04565b005b34801561043f57600080fd5b5061045a6004803603810190610455919061315c565b610e8a565b005b34801561046857600080fd5b50610471610eaa565b60405161047e919061395c565b60405180910390f35b34801561049357600080fd5b5061049c610eb4565b6040516104a9919061395c565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d4919061330c565b610eba565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190613355565b610f50565b60405161050f919061371d565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613355565b610f66565b005b34801561054d57600080fd5b5061056860048036038101906105639190613355565b610fec565b005b34801561057657600080fd5b50610591600480360381019061058c91906130ef565b611072565b60405161059e919061395c565b60405180910390f35b3480156105b357600080fd5b506105bc611142565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906130ef565b6111ca565b6040516105f2919061395c565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613272565b6111e2565b005b34801561063057600080fd5b506106396112c3565b604051610646919061395c565b60405180910390f35b34801561065b57600080fd5b506106646112c9565b604051610671919061371d565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613355565b6112f2565b6040516106ae9190613941565b60405180910390f35b3480156106c357600080fd5b506106cc61130a565b6040516106d9919061379f565b60405180910390f35b6106fc60048036038101906106f79190613355565b61139c565b005b34801561070a57600080fd5b5061072560048036038101906107209190613232565b611661565b005b34801561073357600080fd5b5061074e60048036038101906107499190613355565b6117d9565b005b34801561075c57600080fd5b5061076561185f565b005b34801561077357600080fd5b5061078e60048036038101906107899190613355565b6119e0565b60405161079b919061395c565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c691906131af565b6119f7565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613355565b611a73565b005b34801561080257600080fd5b5061081d60048036038101906108189190613355565b611af9565b60405161082a919061379f565b60405180910390f35b34801561083f57600080fd5b50610848611ba0565b604051610855919061395c565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906130ef565b611ba6565b604051610892919061395c565b60405180910390f35b3480156108a757600080fd5b506108b0611bb8565b6040516108bd919061395c565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190613355565b611bbe565b6040516108fa919061395c565b60405180910390f35b34801561090f57600080fd5b5061092a6004803603810190610925919061311c565b611bd5565b6040516109379190613784565b60405180910390f35b34801561094c57600080fd5b50610967600480360381019061096291906130ef565b611c69565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a445750610a4382611d61565b5b9050919050565b606060038054610a5a90613c2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8690613c2b565b8015610ad35780601f10610aa857610100808354040283529160200191610ad3565b820191906000526020600020905b815481529060010190602001808311610ab657829003601f168201915b5050505050905090565b6000610ae882611dcb565b610b1e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6482610f50565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bcc576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610beb611e19565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c1d5750610c1b81610c16611e19565b611bd5565b155b15610c54576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c5f838383611e21565b505050565b600b5481565b6000610c74611ed3565b6002546001540303905090565b60115481565b610c92838383611edc565b505050565b610c9f611e19565b73ffffffffffffffffffffffffffffffffffffffff16610cbd6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a90613861565b60405180910390fd5b601054811115610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f906137e1565b60405180910390fd5b8060106000828254610d6a9190613b2d565b92505081905550610d7b3382612392565b50565b610d86611e19565b73ffffffffffffffffffffffffffffffffffffffff16610da46112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190613861565b60405180910390fd5b80600b8190555050565b610e0c611e19565b73ffffffffffffffffffffffffffffffffffffffff16610e2a6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790613861565b60405180910390fd5b80600d8190555050565b610ea5838383604051806020016040528060008152506119f7565b505050565b6000601154905090565b600a5481565b610ec2611e19565b73ffffffffffffffffffffffffffffffffffffffff16610ee06112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d90613861565b60405180910390fd5b80600f9080519060200190610f4c929190612ec0565b5050565b6000610f5b826123b0565b600001519050919050565b610f6e611e19565b73ffffffffffffffffffffffffffffffffffffffff16610f8c6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990613861565b60405180910390fd5b8060118190555050565b610ff4611e19565b73ffffffffffffffffffffffffffffffffffffffff166110126112c9565b73ffffffffffffffffffffffffffffffffffffffff1614611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90613861565b60405180910390fd5b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110da576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61114a611e19565b73ffffffffffffffffffffffffffffffffffffffff166111686112c9565b73ffffffffffffffffffffffffffffffffffffffff16146111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590613861565b60405180910390fd5b6111c8600061263f565b565b600c6020528060005260406000206000915090505481565b6111ea611e19565b73ffffffffffffffffffffffffffffffffffffffff166112086112c9565b73ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613861565b60405180910390fd5b611d4c8161126a610c6a565b6112749190613a4c565b11156112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac90613841565b60405180910390fd5b6112bf8282612392565b5050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112fa612f46565b611303826123b0565b9050919050565b60606004805461131990613c2b565b80601f016020809104026020016040519081016040528092919081815260200182805461134590613c2b565b80156113925780601f1061136757610100808354040283529160200191611392565b820191906000526020600020905b81548152906001019060200180831161137557829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190613821565b60405180910390fd5b60016011541461144f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144690613801565b60405180910390fd5b601054611d4c61145f9190613b2d565b81611468610c6a565b6114729190613a4c565b11156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613841565b60405180910390fd5b600a548111156114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef906138e1565b60405180910390fd5b6103e881611504610c6a565b61150e9190613a4c565b11611520576000600d8190555061152a565b600e54600d819055505b80600d546115389190613ad3565b34101561157a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611571906138c1565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115c99190613a4c565b92505081905550600b54600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90613901565b60405180910390fd5b61165e3382612392565b50565b611669611e19565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116ce576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006116db611e19565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611788611e19565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117cd9190613784565b60405180910390a35050565b6117e1611e19565b73ffffffffffffffffffffffffffffffffffffffff166117ff6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613861565b60405180910390fd5b80600a8190555050565b611867611e19565b73ffffffffffffffffffffffffffffffffffffffff166118856112c9565b73ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290613861565b60405180910390fd5b60026009541415611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890613921565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161194f90613708565b60006040518083038185875af1925050503d806000811461198c576040519150601f19603f3d011682016040523d82523d6000602084013e611991565b606091505b50509050806119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc906138a1565b60405180910390fd5b506001600981905550565b6000600e54826119f09190613ad3565b9050919050565b611a02848484611edc565b611a218373ffffffffffffffffffffffffffffffffffffffff16612703565b8015611a365750611a3484848484612716565b155b15611a6d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611a7b611e19565b73ffffffffffffffffffffffffffffffffffffffff16611a996112c9565b73ffffffffffffffffffffffffffffffffffffffff1614611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690613861565b60405180910390fd5b80600e8190555050565b6060611b0482611dcb565b611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90613881565b60405180910390fd5b6000611b4d612876565b90506000815111611b6d5760405180602001604052806000815250611b98565b80611b7784612908565b604051602001611b889291906136ce565b6040516020818303038152906040525b915050919050565b60105481565b6000611bb182612a69565b9050919050565b600e5481565b6000600d5482611bce9190613ad3565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c71611e19565b73ffffffffffffffffffffffffffffffffffffffff16611c8f6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc90613861565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c906137c1565b60405180910390fd5b611d5e8161263f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611dd6611ed3565b11158015611de5575060015482105b8015611e12575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611ee7826123b0565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f52576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f73611e19565b73ffffffffffffffffffffffffffffffffffffffff161480611fa25750611fa185611f9c611e19565b611bd5565b5b80611fe75750611fb0611e19565b73ffffffffffffffffffffffffffffffffffffffff16611fcf84610add565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612020576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612087576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120948585856001612ad3565b6120a060008487611e21565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561232057600154821461231f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461238b8585856001612ad9565b5050505050565b6123ac828260405180602001604052806000815250612adf565b5050565b6123b8612f46565b6000829050806123c6611ed3565b111580156123d5575060015481105b15612608576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161260657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124ea57809250505061263a565b5b60011561260557818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461260057809250505061263a565b6124eb565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261273c611e19565b8786866040518563ffffffff1660e01b815260040161275e9493929190613738565b602060405180830381600087803b15801561277857600080fd5b505af19250505080156127a957506040513d601f19601f820116820180604052508101906127a691906132df565b60015b612823573d80600081146127d9576040519150601f19603f3d011682016040523d82523d6000602084013e6127de565b606091505b5060008151141561281b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461288590613c2b565b80601f01602080910402602001604051908101604052809291908181526020018280546128b190613c2b565b80156128fe5780601f106128d3576101008083540402835291602001916128fe565b820191906000526020600020905b8154815290600101906020018083116128e157829003601f168201915b5050505050905090565b60606000821415612950576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a64565b600082905060005b6000821461298257808061296b90613c8e565b915050600a8261297b9190613aa2565b9150612958565b60008167ffffffffffffffff81111561299e5761299d613dc4565b5b6040519080825280601f01601f1916602001820160405280156129d05781602001600182028036833780820191505090505b5090505b60008514612a5d576001826129e99190613b2d565b9150600a856129f89190613cd7565b6030612a049190613a4c565b60f81b818381518110612a1a57612a19613d95565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a569190613aa2565b94506129d4565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b612aec8383836001612af1565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612b5f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612b9a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ba76000868387612ad3565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612d715750612d708773ffffffffffffffffffffffffffffffffffffffff16612703565b5b15612e37575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612de66000888480600101955088612716565b612e1c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612d77578260015414612e3257600080fd5b612ea3565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612e38575b816001819055505050612eb96000868387612ad9565b5050505050565b828054612ecc90613c2b565b90600052602060002090601f016020900481019282612eee5760008555612f35565b82601f10612f0757805160ff1916838001178555612f35565b82800160010185558215612f35579182015b82811115612f34578251825591602001919060010190612f19565b5b509050612f429190612f89565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612fa2576000816000905550600101612f8a565b5090565b6000612fb9612fb48461399c565b613977565b905082815260208101848484011115612fd557612fd4613df8565b5b612fe0848285613be9565b509392505050565b6000612ffb612ff6846139cd565b613977565b90508281526020810184848401111561301757613016613df8565b5b613022848285613be9565b509392505050565b600081359050613039816140cb565b92915050565b60008135905061304e816140e2565b92915050565b600081359050613063816140f9565b92915050565b600081519050613078816140f9565b92915050565b600082601f83011261309357613092613df3565b5b81356130a3848260208601612fa6565b91505092915050565b600082601f8301126130c1576130c0613df3565b5b81356130d1848260208601612fe8565b91505092915050565b6000813590506130e981614110565b92915050565b60006020828403121561310557613104613e02565b5b60006131138482850161302a565b91505092915050565b6000806040838503121561313357613132613e02565b5b60006131418582860161302a565b92505060206131528582860161302a565b9150509250929050565b60008060006060848603121561317557613174613e02565b5b60006131838682870161302a565b93505060206131948682870161302a565b92505060406131a5868287016130da565b9150509250925092565b600080600080608085870312156131c9576131c8613e02565b5b60006131d78782880161302a565b94505060206131e88782880161302a565b93505060406131f9878288016130da565b925050606085013567ffffffffffffffff81111561321a57613219613dfd565b5b6132268782880161307e565b91505092959194509250565b6000806040838503121561324957613248613e02565b5b60006132578582860161302a565b92505060206132688582860161303f565b9150509250929050565b6000806040838503121561328957613288613e02565b5b60006132978582860161302a565b92505060206132a8858286016130da565b9150509250929050565b6000602082840312156132c8576132c7613e02565b5b60006132d684828501613054565b91505092915050565b6000602082840312156132f5576132f4613e02565b5b600061330384828501613069565b91505092915050565b60006020828403121561332257613321613e02565b5b600082013567ffffffffffffffff8111156133405761333f613dfd565b5b61334c848285016130ac565b91505092915050565b60006020828403121561336b5761336a613e02565b5b6000613379848285016130da565b91505092915050565b61338b81613b61565b82525050565b61339a81613b61565b82525050565b6133a981613b73565b82525050565b6133b881613b73565b82525050565b60006133c9826139fe565b6133d38185613a14565b93506133e3818560208601613bf8565b6133ec81613e07565b840191505092915050565b600061340282613a09565b61340c8185613a30565b935061341c818560208601613bf8565b61342581613e07565b840191505092915050565b600061343b82613a09565b6134458185613a41565b9350613455818560208601613bf8565b80840191505092915050565b600061346e602683613a30565b915061347982613e18565b604082019050919050565b6000613491602183613a30565b915061349c82613e67565b604082019050919050565b60006134b4601283613a30565b91506134bf82613eb6565b602082019050919050565b60006134d7601e83613a30565b91506134e282613edf565b602082019050919050565b60006134fa601283613a30565b915061350582613f08565b602082019050919050565b600061351d600583613a41565b915061352882613f31565b600582019050919050565b6000613540602083613a30565b915061354b82613f5a565b602082019050919050565b6000613563602f83613a30565b915061356e82613f83565b604082019050919050565b6000613586600083613a25565b915061359182613fd2565b600082019050919050565b60006135a9601083613a30565b91506135b482613fd5565b602082019050919050565b60006135cc601683613a30565b91506135d782613ffe565b602082019050919050565b60006135ef601683613a30565b91506135fa82614027565b602082019050919050565b6000613612601c83613a30565b915061361d82614050565b602082019050919050565b6000613635601f83613a30565b915061364082614079565b602082019050919050565b6000613658600183613a41565b9150613663826140a2565b600182019050919050565b6060820160008201516136846000850182613382565b50602082015161369760208501826136bf565b5060408201516136aa60408501826133a0565b50505050565b6136b981613bcb565b82525050565b6136c881613bd5565b82525050565b60006136da8285613430565b91506136e58261364b565b91506136f18284613430565b91506136fc82613510565b91508190509392505050565b600061371382613579565b9150819050919050565b60006020820190506137326000830184613391565b92915050565b600060808201905061374d6000830187613391565b61375a6020830186613391565b61376760408301856136b0565b818103606083015261377981846133be565b905095945050505050565b600060208201905061379960008301846133af565b92915050565b600060208201905081810360008301526137b981846133f7565b905092915050565b600060208201905081810360008301526137da81613461565b9050919050565b600060208201905081810360008301526137fa81613484565b9050919050565b6000602082019050818103600083015261381a816134a7565b9050919050565b6000602082019050818103600083015261383a816134ca565b9050919050565b6000602082019050818103600083015261385a816134ed565b9050919050565b6000602082019050818103600083015261387a81613533565b9050919050565b6000602082019050818103600083015261389a81613556565b9050919050565b600060208201905081810360008301526138ba8161359c565b9050919050565b600060208201905081810360008301526138da816135bf565b9050919050565b600060208201905081810360008301526138fa816135e2565b9050919050565b6000602082019050818103600083015261391a81613605565b9050919050565b6000602082019050818103600083015261393a81613628565b9050919050565b6000606082019050613956600083018461366e565b92915050565b600060208201905061397160008301846136b0565b92915050565b6000613981613992565b905061398d8282613c5d565b919050565b6000604051905090565b600067ffffffffffffffff8211156139b7576139b6613dc4565b5b6139c082613e07565b9050602081019050919050565b600067ffffffffffffffff8211156139e8576139e7613dc4565b5b6139f182613e07565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a5782613bcb565b9150613a6283613bcb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a9757613a96613d08565b5b828201905092915050565b6000613aad82613bcb565b9150613ab883613bcb565b925082613ac857613ac7613d37565b5b828204905092915050565b6000613ade82613bcb565b9150613ae983613bcb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2257613b21613d08565b5b828202905092915050565b6000613b3882613bcb565b9150613b4383613bcb565b925082821015613b5657613b55613d08565b5b828203905092915050565b6000613b6c82613bab565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613c16578082015181840152602081019050613bfb565b83811115613c25576000848401525b50505050565b60006002820490506001821680613c4357607f821691505b60208210811415613c5757613c56613d66565b5b50919050565b613c6682613e07565b810181811067ffffffffffffffff82111715613c8557613c84613dc4565b5b80604052505050565b6000613c9982613bcb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ccc57613ccb613d08565b5b600182019050919050565b6000613ce282613bcb565b9150613ced83613bcb565b925082613cfd57613cfc613d37565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6140d481613b61565b81146140df57600080fd5b50565b6140eb81613b73565b81146140f657600080fd5b50565b61410281613b7f565b811461410d57600080fd5b50565b61411981613bcb565b811461412457600080fd5b5056fea26469706673582212200e9839e7418d1402c5922ef562160d2d6b9a4ecdf94f7aa8fc9ec4f840cce7b564736f6c63430008070033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063752361431161012e578063aedc8e38116100ab578063dc33e6811161006f578063dc33e6811461085e578063e626cc1e1461089b578063e7572230146108c6578063e985e9c514610903578063f2fde38b146109405761023b565b8063aedc8e3814610767578063b88d4fde146107a4578063c151471a146107cd578063c87b56dd146107f6578063cd3293de146108335761023b565b806395d89b41116100f257806395d89b41146106b7578063a0712d68146106e2578063a22cb465146106fe578063a40ece7a14610727578063ac446002146107505761023b565b806375236143146105be5780638ba4cc3c146105fb5780638d859f3e146106245780638da5cb5b1461064f5780639231ab2a1461067a5761023b565b80633fd17366116101bc5780636352211e116101805780636352211e146104db57806369ba1a75146105185780636a44e1731461054157806370a082311461056a578063715018a6146105a75761023b565b80633fd173661461040a57806342842e0e146104335780634e69d5601461045c57806351d7ff931461048757806355f804b3146104b25761023b565b806318160ddd1161020357806318160ddd14610339578063200d2ed21461036457806323b872dd1461038f578063288bd8fd146103b85780632ba2865b146103e15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630f2cdd6c1461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906132b2565b610969565b6040516102749190613784565b60405180910390f35b34801561028957600080fd5b50610292610a4b565b60405161029f919061379f565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613355565b610add565b6040516102dc919061371d565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613272565b610b59565b005b34801561031a57600080fd5b50610323610c64565b604051610330919061395c565b60405180910390f35b34801561034557600080fd5b5061034e610c6a565b60405161035b919061395c565b60405180910390f35b34801561037057600080fd5b50610379610c81565b604051610386919061395c565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b1919061315c565b610c87565b005b3480156103c457600080fd5b506103df60048036038101906103da9190613355565b610c97565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613355565b610d7e565b005b34801561041657600080fd5b50610431600480360381019061042c9190613355565b610e04565b005b34801561043f57600080fd5b5061045a6004803603810190610455919061315c565b610e8a565b005b34801561046857600080fd5b50610471610eaa565b60405161047e919061395c565b60405180910390f35b34801561049357600080fd5b5061049c610eb4565b6040516104a9919061395c565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d4919061330c565b610eba565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190613355565b610f50565b60405161050f919061371d565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613355565b610f66565b005b34801561054d57600080fd5b5061056860048036038101906105639190613355565b610fec565b005b34801561057657600080fd5b50610591600480360381019061058c91906130ef565b611072565b60405161059e919061395c565b60405180910390f35b3480156105b357600080fd5b506105bc611142565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906130ef565b6111ca565b6040516105f2919061395c565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190613272565b6111e2565b005b34801561063057600080fd5b506106396112c3565b604051610646919061395c565b60405180910390f35b34801561065b57600080fd5b506106646112c9565b604051610671919061371d565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613355565b6112f2565b6040516106ae9190613941565b60405180910390f35b3480156106c357600080fd5b506106cc61130a565b6040516106d9919061379f565b60405180910390f35b6106fc60048036038101906106f79190613355565b61139c565b005b34801561070a57600080fd5b5061072560048036038101906107209190613232565b611661565b005b34801561073357600080fd5b5061074e60048036038101906107499190613355565b6117d9565b005b34801561075c57600080fd5b5061076561185f565b005b34801561077357600080fd5b5061078e60048036038101906107899190613355565b6119e0565b60405161079b919061395c565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c691906131af565b6119f7565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613355565b611a73565b005b34801561080257600080fd5b5061081d60048036038101906108189190613355565b611af9565b60405161082a919061379f565b60405180910390f35b34801561083f57600080fd5b50610848611ba0565b604051610855919061395c565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906130ef565b611ba6565b604051610892919061395c565b60405180910390f35b3480156108a757600080fd5b506108b0611bb8565b6040516108bd919061395c565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190613355565b611bbe565b6040516108fa919061395c565b60405180910390f35b34801561090f57600080fd5b5061092a6004803603810190610925919061311c565b611bd5565b6040516109379190613784565b60405180910390f35b34801561094c57600080fd5b50610967600480360381019061096291906130ef565b611c69565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a445750610a4382611d61565b5b9050919050565b606060038054610a5a90613c2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8690613c2b565b8015610ad35780601f10610aa857610100808354040283529160200191610ad3565b820191906000526020600020905b815481529060010190602001808311610ab657829003601f168201915b5050505050905090565b6000610ae882611dcb565b610b1e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6482610f50565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bcc576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610beb611e19565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c1d5750610c1b81610c16611e19565b611bd5565b155b15610c54576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c5f838383611e21565b505050565b600b5481565b6000610c74611ed3565b6002546001540303905090565b60115481565b610c92838383611edc565b505050565b610c9f611e19565b73ffffffffffffffffffffffffffffffffffffffff16610cbd6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a90613861565b60405180910390fd5b601054811115610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f906137e1565b60405180910390fd5b8060106000828254610d6a9190613b2d565b92505081905550610d7b3382612392565b50565b610d86611e19565b73ffffffffffffffffffffffffffffffffffffffff16610da46112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190613861565b60405180910390fd5b80600b8190555050565b610e0c611e19565b73ffffffffffffffffffffffffffffffffffffffff16610e2a6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790613861565b60405180910390fd5b80600d8190555050565b610ea5838383604051806020016040528060008152506119f7565b505050565b6000601154905090565b600a5481565b610ec2611e19565b73ffffffffffffffffffffffffffffffffffffffff16610ee06112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d90613861565b60405180910390fd5b80600f9080519060200190610f4c929190612ec0565b5050565b6000610f5b826123b0565b600001519050919050565b610f6e611e19565b73ffffffffffffffffffffffffffffffffffffffff16610f8c6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990613861565b60405180910390fd5b8060118190555050565b610ff4611e19565b73ffffffffffffffffffffffffffffffffffffffff166110126112c9565b73ffffffffffffffffffffffffffffffffffffffff1614611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90613861565b60405180910390fd5b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110da576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61114a611e19565b73ffffffffffffffffffffffffffffffffffffffff166111686112c9565b73ffffffffffffffffffffffffffffffffffffffff16146111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590613861565b60405180910390fd5b6111c8600061263f565b565b600c6020528060005260406000206000915090505481565b6111ea611e19565b73ffffffffffffffffffffffffffffffffffffffff166112086112c9565b73ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613861565b60405180910390fd5b611d4c8161126a610c6a565b6112749190613a4c565b11156112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac90613841565b60405180910390fd5b6112bf8282612392565b5050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112fa612f46565b611303826123b0565b9050919050565b60606004805461131990613c2b565b80601f016020809104026020016040519081016040528092919081815260200182805461134590613c2b565b80156113925780601f1061136757610100808354040283529160200191611392565b820191906000526020600020905b81548152906001019060200180831161137557829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190613821565b60405180910390fd5b60016011541461144f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144690613801565b60405180910390fd5b601054611d4c61145f9190613b2d565b81611468610c6a565b6114729190613a4c565b11156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613841565b60405180910390fd5b600a548111156114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef906138e1565b60405180910390fd5b6103e881611504610c6a565b61150e9190613a4c565b11611520576000600d8190555061152a565b600e54600d819055505b80600d546115389190613ad3565b34101561157a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611571906138c1565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115c99190613a4c565b92505081905550600b54600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90613901565b60405180910390fd5b61165e3382612392565b50565b611669611e19565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116ce576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006116db611e19565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611788611e19565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117cd9190613784565b60405180910390a35050565b6117e1611e19565b73ffffffffffffffffffffffffffffffffffffffff166117ff6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90613861565b60405180910390fd5b80600a8190555050565b611867611e19565b73ffffffffffffffffffffffffffffffffffffffff166118856112c9565b73ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290613861565b60405180910390fd5b60026009541415611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890613921565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161194f90613708565b60006040518083038185875af1925050503d806000811461198c576040519150601f19603f3d011682016040523d82523d6000602084013e611991565b606091505b50509050806119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc906138a1565b60405180910390fd5b506001600981905550565b6000600e54826119f09190613ad3565b9050919050565b611a02848484611edc565b611a218373ffffffffffffffffffffffffffffffffffffffff16612703565b8015611a365750611a3484848484612716565b155b15611a6d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611a7b611e19565b73ffffffffffffffffffffffffffffffffffffffff16611a996112c9565b73ffffffffffffffffffffffffffffffffffffffff1614611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690613861565b60405180910390fd5b80600e8190555050565b6060611b0482611dcb565b611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a90613881565b60405180910390fd5b6000611b4d612876565b90506000815111611b6d5760405180602001604052806000815250611b98565b80611b7784612908565b604051602001611b889291906136ce565b6040516020818303038152906040525b915050919050565b60105481565b6000611bb182612a69565b9050919050565b600e5481565b6000600d5482611bce9190613ad3565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c71611e19565b73ffffffffffffffffffffffffffffffffffffffff16611c8f6112c9565b73ffffffffffffffffffffffffffffffffffffffff1614611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc90613861565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c906137c1565b60405180910390fd5b611d5e8161263f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611dd6611ed3565b11158015611de5575060015482105b8015611e12575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611ee7826123b0565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f52576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f73611e19565b73ffffffffffffffffffffffffffffffffffffffff161480611fa25750611fa185611f9c611e19565b611bd5565b5b80611fe75750611fb0611e19565b73ffffffffffffffffffffffffffffffffffffffff16611fcf84610add565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612020576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612087576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120948585856001612ad3565b6120a060008487611e21565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561232057600154821461231f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461238b8585856001612ad9565b5050505050565b6123ac828260405180602001604052806000815250612adf565b5050565b6123b8612f46565b6000829050806123c6611ed3565b111580156123d5575060015481105b15612608576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161260657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124ea57809250505061263a565b5b60011561260557818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461260057809250505061263a565b6124eb565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261273c611e19565b8786866040518563ffffffff1660e01b815260040161275e9493929190613738565b602060405180830381600087803b15801561277857600080fd5b505af19250505080156127a957506040513d601f19601f820116820180604052508101906127a691906132df565b60015b612823573d80600081146127d9576040519150601f19603f3d011682016040523d82523d6000602084013e6127de565b606091505b5060008151141561281b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461288590613c2b565b80601f01602080910402602001604051908101604052809291908181526020018280546128b190613c2b565b80156128fe5780601f106128d3576101008083540402835291602001916128fe565b820191906000526020600020905b8154815290600101906020018083116128e157829003601f168201915b5050505050905090565b60606000821415612950576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a64565b600082905060005b6000821461298257808061296b90613c8e565b915050600a8261297b9190613aa2565b9150612958565b60008167ffffffffffffffff81111561299e5761299d613dc4565b5b6040519080825280601f01601f1916602001820160405280156129d05781602001600182028036833780820191505090505b5090505b60008514612a5d576001826129e99190613b2d565b9150600a856129f89190613cd7565b6030612a049190613a4c565b60f81b818381518110612a1a57612a19613d95565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a569190613aa2565b94506129d4565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b612aec8383836001612af1565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612b5f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612b9a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ba76000868387612ad3565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612d715750612d708773ffffffffffffffffffffffffffffffffffffffff16612703565b5b15612e37575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612de66000888480600101955088612716565b612e1c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612d77578260015414612e3257600080fd5b612ea3565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612e38575b816001819055505050612eb96000868387612ad9565b5050505050565b828054612ecc90613c2b565b90600052602060002090601f016020900481019282612eee5760008555612f35565b82601f10612f0757805160ff1916838001178555612f35565b82800160010185558215612f35579182015b82811115612f34578251825591602001919060010190612f19565b5b509050612f429190612f89565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612fa2576000816000905550600101612f8a565b5090565b6000612fb9612fb48461399c565b613977565b905082815260208101848484011115612fd557612fd4613df8565b5b612fe0848285613be9565b509392505050565b6000612ffb612ff6846139cd565b613977565b90508281526020810184848401111561301757613016613df8565b5b613022848285613be9565b509392505050565b600081359050613039816140cb565b92915050565b60008135905061304e816140e2565b92915050565b600081359050613063816140f9565b92915050565b600081519050613078816140f9565b92915050565b600082601f83011261309357613092613df3565b5b81356130a3848260208601612fa6565b91505092915050565b600082601f8301126130c1576130c0613df3565b5b81356130d1848260208601612fe8565b91505092915050565b6000813590506130e981614110565b92915050565b60006020828403121561310557613104613e02565b5b60006131138482850161302a565b91505092915050565b6000806040838503121561313357613132613e02565b5b60006131418582860161302a565b92505060206131528582860161302a565b9150509250929050565b60008060006060848603121561317557613174613e02565b5b60006131838682870161302a565b93505060206131948682870161302a565b92505060406131a5868287016130da565b9150509250925092565b600080600080608085870312156131c9576131c8613e02565b5b60006131d78782880161302a565b94505060206131e88782880161302a565b93505060406131f9878288016130da565b925050606085013567ffffffffffffffff81111561321a57613219613dfd565b5b6132268782880161307e565b91505092959194509250565b6000806040838503121561324957613248613e02565b5b60006132578582860161302a565b92505060206132688582860161303f565b9150509250929050565b6000806040838503121561328957613288613e02565b5b60006132978582860161302a565b92505060206132a8858286016130da565b9150509250929050565b6000602082840312156132c8576132c7613e02565b5b60006132d684828501613054565b91505092915050565b6000602082840312156132f5576132f4613e02565b5b600061330384828501613069565b91505092915050565b60006020828403121561332257613321613e02565b5b600082013567ffffffffffffffff8111156133405761333f613dfd565b5b61334c848285016130ac565b91505092915050565b60006020828403121561336b5761336a613e02565b5b6000613379848285016130da565b91505092915050565b61338b81613b61565b82525050565b61339a81613b61565b82525050565b6133a981613b73565b82525050565b6133b881613b73565b82525050565b60006133c9826139fe565b6133d38185613a14565b93506133e3818560208601613bf8565b6133ec81613e07565b840191505092915050565b600061340282613a09565b61340c8185613a30565b935061341c818560208601613bf8565b61342581613e07565b840191505092915050565b600061343b82613a09565b6134458185613a41565b9350613455818560208601613bf8565b80840191505092915050565b600061346e602683613a30565b915061347982613e18565b604082019050919050565b6000613491602183613a30565b915061349c82613e67565b604082019050919050565b60006134b4601283613a30565b91506134bf82613eb6565b602082019050919050565b60006134d7601e83613a30565b91506134e282613edf565b602082019050919050565b60006134fa601283613a30565b915061350582613f08565b602082019050919050565b600061351d600583613a41565b915061352882613f31565b600582019050919050565b6000613540602083613a30565b915061354b82613f5a565b602082019050919050565b6000613563602f83613a30565b915061356e82613f83565b604082019050919050565b6000613586600083613a25565b915061359182613fd2565b600082019050919050565b60006135a9601083613a30565b91506135b482613fd5565b602082019050919050565b60006135cc601683613a30565b91506135d782613ffe565b602082019050919050565b60006135ef601683613a30565b91506135fa82614027565b602082019050919050565b6000613612601c83613a30565b915061361d82614050565b602082019050919050565b6000613635601f83613a30565b915061364082614079565b602082019050919050565b6000613658600183613a41565b9150613663826140a2565b600182019050919050565b6060820160008201516136846000850182613382565b50602082015161369760208501826136bf565b5060408201516136aa60408501826133a0565b50505050565b6136b981613bcb565b82525050565b6136c881613bd5565b82525050565b60006136da8285613430565b91506136e58261364b565b91506136f18284613430565b91506136fc82613510565b91508190509392505050565b600061371382613579565b9150819050919050565b60006020820190506137326000830184613391565b92915050565b600060808201905061374d6000830187613391565b61375a6020830186613391565b61376760408301856136b0565b818103606083015261377981846133be565b905095945050505050565b600060208201905061379960008301846133af565b92915050565b600060208201905081810360008301526137b981846133f7565b905092915050565b600060208201905081810360008301526137da81613461565b9050919050565b600060208201905081810360008301526137fa81613484565b9050919050565b6000602082019050818103600083015261381a816134a7565b9050919050565b6000602082019050818103600083015261383a816134ca565b9050919050565b6000602082019050818103600083015261385a816134ed565b9050919050565b6000602082019050818103600083015261387a81613533565b9050919050565b6000602082019050818103600083015261389a81613556565b9050919050565b600060208201905081810360008301526138ba8161359c565b9050919050565b600060208201905081810360008301526138da816135bf565b9050919050565b600060208201905081810360008301526138fa816135e2565b9050919050565b6000602082019050818103600083015261391a81613605565b9050919050565b6000602082019050818103600083015261393a81613628565b9050919050565b6000606082019050613956600083018461366e565b92915050565b600060208201905061397160008301846136b0565b92915050565b6000613981613992565b905061398d8282613c5d565b919050565b6000604051905090565b600067ffffffffffffffff8211156139b7576139b6613dc4565b5b6139c082613e07565b9050602081019050919050565b600067ffffffffffffffff8211156139e8576139e7613dc4565b5b6139f182613e07565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a5782613bcb565b9150613a6283613bcb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a9757613a96613d08565b5b828201905092915050565b6000613aad82613bcb565b9150613ab883613bcb565b925082613ac857613ac7613d37565b5b828204905092915050565b6000613ade82613bcb565b9150613ae983613bcb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2257613b21613d08565b5b828202905092915050565b6000613b3882613bcb565b9150613b4383613bcb565b925082821015613b5657613b55613d08565b5b828203905092915050565b6000613b6c82613bab565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613c16578082015181840152602081019050613bfb565b83811115613c25576000848401525b50505050565b60006002820490506001821680613c4357607f821691505b60208210811415613c5757613c56613d66565b5b50919050565b613c6682613e07565b810181811067ffffffffffffffff82111715613c8557613c84613dc4565b5b80604052505050565b6000613c9982613bcb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ccc57613ccb613d08565b5b600182019050919050565b6000613ce282613bcb565b9150613ced83613bcb565b925082613cfd57613cfc613d37565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6140d481613b61565b81146140df57600080fd5b50565b6140eb81613b73565b81146140f657600080fd5b50565b61410281613b7f565b811461410d57600080fd5b50565b61411981613bcb565b811461412457600080fd5b5056fea26469706673582212200e9839e7418d1402c5922ef562160d2d6b9a4ecdf94f7aa8fc9ec4f840cce7b564736f6c63430008070033

Deployed Bytecode Sourcemap

32884:3940:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15139:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18252:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19755:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19318:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33079:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14388:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33535:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20620:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36409:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35670:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35448:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20861:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35963:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32986:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34780:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18060:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35884:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36041:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15508:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5170:103;;;;;;;;;;;;;:::i;:::-;;33164:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36632:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33221:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4947:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35107:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18421:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33760:660;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20031:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35772:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35261:181;;;;;;;;;;;;;:::i;:::-;;36274:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21117:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35552:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34427:347;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33503:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34996:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33257:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36149:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20389:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5282:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15139:305;15241:4;15293:25;15278:40;;;:11;:40;;;;:105;;;;15350:33;15335:48;;;:11;:48;;;;15278:105;:158;;;;15400:36;15424:11;15400:23;:36::i;:::-;15278:158;15258:178;;15139:305;;;:::o;18252:100::-;18306:13;18339:5;18332:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18252:100;:::o;19755:204::-;19823:7;19848:16;19856:7;19848;:16::i;:::-;19843:64;;19873:34;;;;;;;;;;;;;;19843:64;19927:15;:24;19943:7;19927:24;;;;;;;;;;;;;;;;;;;;;19920:31;;19755:204;;;:::o;19318:371::-;19391:13;19407:24;19423:7;19407:15;:24::i;:::-;19391:40;;19452:5;19446:11;;:2;:11;;;19442:48;;;19466:24;;;;;;;;;;;;;;19442:48;19523:5;19507:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;19533:37;19550:5;19557:12;:10;:12::i;:::-;19533:16;:37::i;:::-;19532:38;19507:63;19503:138;;;19594:35;;;;;;;;;;;;;;19503:138;19653:28;19662:2;19666:7;19675:5;19653:8;:28::i;:::-;19380:309;19318:371;;:::o;33079:34::-;;;;:::o;14388:303::-;14432:7;14657:15;:13;:15::i;:::-;14642:12;;14626:13;;:28;:46;14619:53;;14388:303;:::o;33535:22::-;;;;:::o;20620:170::-;20754:28;20764:4;20770:2;20774:7;20754:9;:28::i;:::-;20620:170;;;:::o;36409:217::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36499:7:::1;;36487:8;:19;;36479:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36566:8;36555:7;;:19;;;;;;;:::i;:::-;;;;;;;;36585:31;36595:10;36607:8;36585:9;:31::i;:::-;36409:217:::0;:::o;35670:96::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35759:1:::1;35742:14;:18;;;;35670:96:::0;:::o;35448:98::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35531:9:::1;35523:5;:17;;;;35448:98:::0;:::o;20861:185::-;20999:39;21016:4;21022:2;21026:7;20999:39;;;;;;;;;;;;:16;:39::i;:::-;20861:185;;;:::o;35963:73::-;36003:4;36024:6;;36017:13;;35963:73;:::o;32986:39::-;;;;:::o;34780:98::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34865:7:::1;34849:13;:23;;;;;;;;;;;;:::i;:::-;;34780:98:::0;:::o;18060:125::-;18124:7;18151:21;18164:7;18151:12;:21::i;:::-;:26;;;18144:33;;18060:125;;;:::o;35884:72::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35949:1:::1;35940:6;:10;;;;35884:72:::0;:::o;36041:98::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36122:9:::1;36114:7;:17;;;;36041:98:::0;:::o;15508:206::-;15572:7;15613:1;15596:19;;:5;:19;;;15592:60;;;15624:28;;;;;;;;;;;;;;15592:60;15678:12;:19;15691:5;15678:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;15670:36;;15663:43;;15508:206;;;:::o;5170:103::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5235:30:::1;5262:1;5235:18;:30::i;:::-;5170:103::o:0;33164:50::-;;;;;;;;;;;;;;;;;:::o;36632:189::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33357:4:::1;36726:8;36710:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;36702:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;36788:27;36798:6;36806:8;36788:9;:27::i;:::-;36632:189:::0;;:::o;33221:31::-;;;;:::o;4947:87::-;4993:7;5020:6;;;;;;;;;;;5013:13;;4947:87;:::o;35107:148::-;35188:21;;:::i;:::-;35228;35241:7;35228:12;:21::i;:::-;35221:28;;35107:148;;;:::o;18421:104::-;18477:13;18510:7;18503:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18421:104;:::o;33760:660::-;33694:10;33681:23;;:9;:23;;;33673:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33847:1:::1;33837:6;;:11;33829:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;33936:7;;33357:4;33915:28;;;;:::i;:::-;33903:8;33887:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:56;;33879:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33993:19;;33981:8;:31;;33973:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34078:4;34066:8;34050:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:32;34047:110;;34103:1;34095:5;:9;;;;34047:110;;;34137:12;;34129:5;:20;;;;34047:110;34192:8;34184:5;;:16;;;;:::i;:::-;34171:9;:29;;34163:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34267:8;34236:15;:27;34252:10;34236:27;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;34321:14;;34290:15;:27;34306:10;34290:27;;;;;;;;;;;;;;;;:45;;34282:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;34379:31;34389:10;34401:8;34379:9;:31::i;:::-;33760:660:::0;:::o;20031:287::-;20142:12;:10;:12::i;:::-;20130:24;;:8;:24;;;20126:54;;;20163:17;;;;;;;;;;;;;;20126:54;20238:8;20193:18;:32;20212:12;:10;:12::i;:::-;20193:32;;;;;;;;;;;;;;;:42;20226:8;20193:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;20291:8;20262:48;;20277:12;:10;:12::i;:::-;20262:48;;;20301:8;20262:48;;;;;;:::i;:::-;;;;;;;;20031:287;;:::o;35772:106::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35871:1:::1;35849:19;:23;;;;35772:106:::0;:::o;35261:181::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2729:1:::1;2875:7;;:19;;2867:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2729:1;2936:7;:18;;;;35326:12:::2;35344:10;:15;;35367:21;35344:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35325:68;;;35408:7;35400:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;35318:124;2685:1:::1;2979:7;:22;;;;35261:181::o:0;36274:130::-;36338:7;36384:12;;36374:9;:22;;;;:::i;:::-;36367:29;;36274:130;;;:::o;21117:369::-;21284:28;21294:4;21300:2;21304:7;21284:9;:28::i;:::-;21327:15;:2;:13;;;:15::i;:::-;:76;;;;;21347:56;21378:4;21384:2;21388:7;21397:5;21347:30;:56::i;:::-;21346:57;21327:76;21323:156;;;21427:40;;;;;;;;;;;;;;21323:156;21117:369;;;;:::o;35552:111::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35648:9:::1;35633:12;:24;;;;35552:111:::0;:::o;34427:347::-;34500:13;34530:16;34538:7;34530;:16::i;:::-;34522:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;34604:21;34628:10;:8;:10::i;:::-;34604:34;;34683:1;34665:7;34659:21;:25;:109;;;;;;;;;;;;;;;;;34720:7;34734:18;:7;:16;:18::i;:::-;34703:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34659:109;34645:123;;;34427:347;;;:::o;33503:23::-;;;;:::o;34996:107::-;35054:7;35077:20;35091:5;35077:13;:20::i;:::-;35070:27;;34996:107;;;:::o;33257:42::-;;;;:::o;36149:117::-;36207:7;36253:5;;36243:9;:15;;;;:::i;:::-;36236:22;;36149:117;;;:::o;20389:164::-;20486:4;20510:18;:25;20529:5;20510:25;;;;;;;;;;;;;;;:35;20536:8;20510:35;;;;;;;;;;;;;;;;;;;;;;;;;20503:42;;20389:164;;;;:::o;5282:201::-;5092:12;:10;:12::i;:::-;5081:23;;:7;:5;:7::i;:::-;:23;;;5073:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5391:1:::1;5371:22;;:8;:22;;;;5363:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5447:28;5466:8;5447:18;:28::i;:::-;5282:201:::0;:::o;9600:157::-;9685:4;9724:25;9709:40;;;:11;:40;;;;9702:47;;9600:157;;;:::o;21741:174::-;21798:4;21841:7;21822:15;:13;:15::i;:::-;:26;;:53;;;;;21862:13;;21852:7;:23;21822:53;:85;;;;;21880:11;:20;21892:7;21880:20;;;;;;;;;;;:27;;;;;;;;;;;;21879:28;21822:85;21815:92;;21741:174;;;:::o;4490:98::-;4543:7;4570:10;4563:17;;4490:98;:::o;29898:196::-;30040:2;30013:15;:24;30029:7;30013:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30078:7;30074:2;30058:28;;30067:5;30058:28;;;;;;;;;;;;29898:196;;;:::o;14162:92::-;14218:7;14245:1;14238:8;;14162:92;:::o;24841:2130::-;24956:35;24994:21;25007:7;24994:12;:21::i;:::-;24956:59;;25054:4;25032:26;;:13;:18;;;:26;;;25028:67;;25067:28;;;;;;;;;;;;;;25028:67;25108:22;25150:4;25134:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;25171:36;25188:4;25194:12;:10;:12::i;:::-;25171:16;:36::i;:::-;25134:73;:126;;;;25248:12;:10;:12::i;:::-;25224:36;;:20;25236:7;25224:11;:20::i;:::-;:36;;;25134:126;25108:153;;25279:17;25274:66;;25305:35;;;;;;;;;;;;;;25274:66;25369:1;25355:16;;:2;:16;;;25351:52;;;25380:23;;;;;;;;;;;;;;25351:52;25416:43;25438:4;25444:2;25448:7;25457:1;25416:21;:43::i;:::-;25524:35;25541:1;25545:7;25554:4;25524:8;:35::i;:::-;25885:1;25855:12;:18;25868:4;25855:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25929:1;25901:12;:16;25914:2;25901:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25947:31;25981:11;:20;25993:7;25981:20;;;;;;;;;;;25947:54;;26032:2;26016:8;:13;;;:18;;;;;;;;;;;;;;;;;;26082:15;26049:8;:23;;;:49;;;;;;;;;;;;;;;;;;26350:19;26382:1;26372:7;:11;26350:33;;26398:31;26432:11;:24;26444:11;26432:24;;;;;;;;;;;26398:58;;26500:1;26475:27;;:8;:13;;;;;;;;;;;;:27;;;26471:384;;;26685:13;;26670:11;:28;26666:174;;26739:4;26723:8;:13;;;:20;;;;;;;;;;;;;;;;;;26792:13;:28;;;26766:8;:23;;;:54;;;;;;;;;;;;;;;;;;26666:174;26471:384;25830:1036;;;26902:7;26898:2;26883:27;;26892:4;26883:27;;;;;;;;;;;;26921:42;26942:4;26948:2;26952:7;26961:1;26921:20;:42::i;:::-;24945:2026;;24841:2130;;;:::o;21923:104::-;21992:27;22002:2;22006:8;21992:27;;;;;;;;;;;;:9;:27::i;:::-;21923:104;;:::o;16889:1109::-;16951:21;;:::i;:::-;16985:12;17000:7;16985:22;;17068:4;17049:15;:13;:15::i;:::-;:23;;:47;;;;;17083:13;;17076:4;:20;17049:47;17045:886;;;17117:31;17151:11;:17;17163:4;17151:17;;;;;;;;;;;17117:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17192:9;:16;;;17187:729;;17263:1;17237:28;;:9;:14;;;:28;;;17233:101;;17301:9;17294:16;;;;;;17233:101;17636:261;17643:4;17636:261;;;17676:6;;;;;;;;17721:11;:17;17733:4;17721:17;;;;;;;;;;;17709:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17795:1;17769:28;;:9;:14;;;:28;;;17765:109;;17837:9;17830:16;;;;;;17765:109;17636:261;;;17187:729;17098:833;17045:886;17959:31;;;;;;;;;;;;;;16889:1109;;;;:::o;5492:191::-;5566:16;5585:6;;;;;;;;;;;5566:25;;5611:8;5602:6;;:17;;;;;;;;;;;;;;;;;;5666:8;5635:40;;5656:8;5635:40;;;;;;;;;;;;5555:128;5492:191;:::o;5715:197::-;5775:4;5793:12;5860:7;5848:20;5840:28;;5903:1;5896:4;:8;5889:15;;;5715:197;;;:::o;30586:667::-;30749:4;30786:2;30770:36;;;30807:12;:10;:12::i;:::-;30821:4;30827:7;30836:5;30770:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30766:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31021:1;31004:6;:13;:18;31000:235;;;31050:40;;;;;;;;;;;;;;31000:235;31193:6;31187:13;31178:6;31174:2;31170:15;31163:38;30766:480;30899:45;;;30889:55;;;:6;:55;;;;30882:62;;;30586:667;;;;;;:::o;34882:108::-;34942:13;34971;34964:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34882:108;:::o;3107:533::-;3163:13;3203:1;3194:5;:10;3190:53;;;3221:10;;;;;;;;;;;;;;;;;;;;;3190:53;3253:12;3268:5;3253:20;;3284:14;3309:78;3324:1;3316:4;:9;3309:78;;3342:8;;;;;:::i;:::-;;;;3373:2;3365:10;;;;;:::i;:::-;;;3309:78;;;3397:19;3429:6;3419:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3397:39;;3447:154;3463:1;3454:5;:10;3447:154;;3491:1;3481:11;;;;;:::i;:::-;;;3558:2;3550:5;:10;;;;:::i;:::-;3537:2;:24;;;;:::i;:::-;3524:39;;3507:6;3514;3507:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3587:2;3578:11;;;;;:::i;:::-;;;3447:154;;;3625:6;3611:21;;;;;3107:533;;;;:::o;15796:137::-;15857:7;15892:12;:19;15905:5;15892:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;15884:41;;15877:48;;15796:137;;;:::o;31901:159::-;;;;;:::o;32719:158::-;;;;;:::o;22390:163::-;22513:32;22519:2;22523:8;22533:5;22540:4;22513:5;:32::i;:::-;22390:163;;;:::o;22812:1775::-;22951:20;22974:13;;22951:36;;23016:1;23002:16;;:2;:16;;;22998:48;;;23027:19;;;;;;;;;;;;;;22998:48;23073:1;23061:8;:13;23057:44;;;23083:18;;;;;;;;;;;;;;23057:44;23114:61;23144:1;23148:2;23152:12;23166:8;23114:21;:61::i;:::-;23487:8;23452:12;:16;23465:2;23452:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23551:8;23511:12;:16;23524:2;23511:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23610:2;23577:11;:25;23589:12;23577:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;23677:15;23627:11;:25;23639:12;23627:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;23710:20;23733:12;23710:35;;23760:11;23789:8;23774:12;:23;23760:37;;23818:4;:23;;;;;23826:15;:2;:13;;;:15::i;:::-;23818:23;23814:641;;;23862:314;23918:12;23914:2;23893:38;;23910:1;23893:38;;;;;;;;;;;;23959:69;23998:1;24002:2;24006:14;;;;;;24022:5;23959:30;:69::i;:::-;23954:174;;24064:40;;;;;;;;;;;;;;23954:174;24171:3;24155:12;:19;;23862:314;;24257:12;24240:13;;:29;24236:43;;24271:8;;;24236:43;23814:641;;;24320:120;24376:14;;;;;;24372:2;24351:40;;24368:1;24351:40;;;;;;;;;;;;24435:3;24419:12;:19;;24320:120;;23814:641;24485:12;24469:13;:28;;;;23427:1082;;24519:60;24548:1;24552:2;24556:12;24570:8;24519:20;:60::i;:::-;22940:1647;22812:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:108::-;7235:24;7253:5;7235:24;:::i;:::-;7230:3;7223:37;7158:108;;:::o;7272:118::-;7359:24;7377:5;7359:24;:::i;:::-;7354:3;7347:37;7272:118;;:::o;7396:99::-;7467:21;7482:5;7467:21;:::i;:::-;7462:3;7455:34;7396:99;;:::o;7501:109::-;7582:21;7597:5;7582:21;:::i;:::-;7577:3;7570:34;7501:109;;:::o;7616:360::-;7702:3;7730:38;7762:5;7730:38;:::i;:::-;7784:70;7847:6;7842:3;7784:70;:::i;:::-;7777:77;;7863:52;7908:6;7903:3;7896:4;7889:5;7885:16;7863:52;:::i;:::-;7940:29;7962:6;7940:29;:::i;:::-;7935:3;7931:39;7924:46;;7706:270;7616:360;;;;:::o;7982:364::-;8070:3;8098:39;8131:5;8098:39;:::i;:::-;8153:71;8217:6;8212:3;8153:71;:::i;:::-;8146:78;;8233:52;8278:6;8273:3;8266:4;8259:5;8255:16;8233:52;:::i;:::-;8310:29;8332:6;8310:29;:::i;:::-;8305:3;8301:39;8294:46;;8074:272;7982:364;;;;:::o;8352:377::-;8458:3;8486:39;8519:5;8486:39;:::i;:::-;8541:89;8623:6;8618:3;8541:89;:::i;:::-;8534:96;;8639:52;8684:6;8679:3;8672:4;8665:5;8661:16;8639:52;:::i;:::-;8716:6;8711:3;8707:16;8700:23;;8462:267;8352:377;;;;:::o;8735:366::-;8877:3;8898:67;8962:2;8957:3;8898:67;:::i;:::-;8891:74;;8974:93;9063:3;8974:93;:::i;:::-;9092:2;9087:3;9083:12;9076:19;;8735:366;;;:::o;9107:::-;9249:3;9270:67;9334:2;9329:3;9270:67;:::i;:::-;9263:74;;9346:93;9435:3;9346:93;:::i;:::-;9464:2;9459:3;9455:12;9448:19;;9107:366;;;:::o;9479:::-;9621:3;9642:67;9706:2;9701:3;9642:67;:::i;:::-;9635:74;;9718:93;9807:3;9718:93;:::i;:::-;9836:2;9831:3;9827:12;9820:19;;9479:366;;;:::o;9851:::-;9993:3;10014:67;10078:2;10073:3;10014:67;:::i;:::-;10007:74;;10090:93;10179:3;10090:93;:::i;:::-;10208:2;10203:3;10199:12;10192:19;;9851:366;;;:::o;10223:::-;10365:3;10386:67;10450:2;10445:3;10386:67;:::i;:::-;10379:74;;10462:93;10551:3;10462:93;:::i;:::-;10580:2;10575:3;10571:12;10564:19;;10223:366;;;:::o;10595:400::-;10755:3;10776:84;10858:1;10853:3;10776:84;:::i;:::-;10769:91;;10869:93;10958:3;10869:93;:::i;:::-;10987:1;10982:3;10978:11;10971:18;;10595:400;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11001:366;;;:::o;11373:::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11373:366;;;:::o;11745:398::-;11904:3;11925:83;12006:1;12001:3;11925:83;:::i;:::-;11918:90;;12017:93;12106:3;12017:93;:::i;:::-;12135:1;12130:3;12126:11;12119:18;;11745:398;;;:::o;12149:366::-;12291:3;12312:67;12376:2;12371:3;12312:67;:::i;:::-;12305:74;;12388:93;12477:3;12388:93;:::i;:::-;12506:2;12501:3;12497:12;12490:19;;12149:366;;;:::o;12521:::-;12663:3;12684:67;12748:2;12743:3;12684:67;:::i;:::-;12677:74;;12760:93;12849:3;12760:93;:::i;:::-;12878:2;12873:3;12869:12;12862:19;;12521:366;;;:::o;12893:::-;13035:3;13056:67;13120:2;13115:3;13056:67;:::i;:::-;13049:74;;13132:93;13221:3;13132:93;:::i;:::-;13250:2;13245:3;13241:12;13234:19;;12893:366;;;:::o;13265:::-;13407:3;13428:67;13492:2;13487:3;13428:67;:::i;:::-;13421:74;;13504:93;13593:3;13504:93;:::i;:::-;13622:2;13617:3;13613:12;13606:19;;13265:366;;;:::o;13637:::-;13779:3;13800:67;13864:2;13859:3;13800:67;:::i;:::-;13793:74;;13876:93;13965:3;13876:93;:::i;:::-;13994:2;13989:3;13985:12;13978:19;;13637:366;;;:::o;14009:400::-;14169:3;14190:84;14272:1;14267:3;14190:84;:::i;:::-;14183:91;;14283:93;14372:3;14283:93;:::i;:::-;14401:1;14396:3;14392:11;14385:18;;14009:400;;;:::o;14485:697::-;14644:4;14639:3;14635:14;14731:4;14724:5;14720:16;14714:23;14750:63;14807:4;14802:3;14798:14;14784:12;14750:63;:::i;:::-;14659:164;14915:4;14908:5;14904:16;14898:23;14934:61;14989:4;14984:3;14980:14;14966:12;14934:61;:::i;:::-;14833:172;15089:4;15082:5;15078:16;15072:23;15108:57;15159:4;15154:3;15150:14;15136:12;15108:57;:::i;:::-;15015:160;14613:569;14485:697;;:::o;15188:118::-;15275:24;15293:5;15275:24;:::i;:::-;15270:3;15263:37;15188:118;;:::o;15312:105::-;15387:23;15404:5;15387:23;:::i;:::-;15382:3;15375:36;15312:105;;:::o;15423:967::-;15805:3;15827:95;15918:3;15909:6;15827:95;:::i;:::-;15820:102;;15939:148;16083:3;15939:148;:::i;:::-;15932:155;;16104:95;16195:3;16186:6;16104:95;:::i;:::-;16097:102;;16216:148;16360:3;16216:148;:::i;:::-;16209:155;;16381:3;16374:10;;15423:967;;;;;:::o;16396:379::-;16580:3;16602:147;16745:3;16602:147;:::i;:::-;16595:154;;16766:3;16759:10;;16396:379;;;:::o;16781:222::-;16874:4;16912:2;16901:9;16897:18;16889:26;;16925:71;16993:1;16982:9;16978:17;16969:6;16925:71;:::i;:::-;16781:222;;;;:::o;17009:640::-;17204:4;17242:3;17231:9;17227:19;17219:27;;17256:71;17324:1;17313:9;17309:17;17300:6;17256:71;:::i;:::-;17337:72;17405:2;17394:9;17390:18;17381:6;17337:72;:::i;:::-;17419;17487:2;17476:9;17472:18;17463:6;17419:72;:::i;:::-;17538:9;17532:4;17528:20;17523:2;17512:9;17508:18;17501:48;17566:76;17637:4;17628:6;17566:76;:::i;:::-;17558:84;;17009:640;;;;;;;:::o;17655:210::-;17742:4;17780:2;17769:9;17765:18;17757:26;;17793:65;17855:1;17844:9;17840:17;17831:6;17793:65;:::i;:::-;17655:210;;;;:::o;17871:313::-;17984:4;18022:2;18011:9;18007:18;17999:26;;18071:9;18065:4;18061:20;18057:1;18046:9;18042:17;18035:47;18099:78;18172:4;18163:6;18099:78;:::i;:::-;18091:86;;17871:313;;;;:::o;18190:419::-;18356:4;18394:2;18383:9;18379:18;18371:26;;18443:9;18437:4;18433:20;18429:1;18418:9;18414:17;18407:47;18471:131;18597:4;18471:131;:::i;:::-;18463:139;;18190:419;;;:::o;18615:::-;18781:4;18819:2;18808:9;18804:18;18796:26;;18868:9;18862:4;18858:20;18854:1;18843:9;18839:17;18832:47;18896:131;19022:4;18896:131;:::i;:::-;18888:139;;18615:419;;;:::o;19040:::-;19206:4;19244:2;19233:9;19229:18;19221:26;;19293:9;19287:4;19283:20;19279:1;19268:9;19264:17;19257:47;19321:131;19447:4;19321:131;:::i;:::-;19313:139;;19040:419;;;:::o;19465:::-;19631:4;19669:2;19658:9;19654:18;19646:26;;19718:9;19712:4;19708:20;19704:1;19693:9;19689:17;19682:47;19746:131;19872:4;19746:131;:::i;:::-;19738:139;;19465:419;;;:::o;19890:::-;20056:4;20094:2;20083:9;20079:18;20071:26;;20143:9;20137:4;20133:20;20129:1;20118:9;20114:17;20107:47;20171:131;20297:4;20171:131;:::i;:::-;20163:139;;19890:419;;;:::o;20315:::-;20481:4;20519:2;20508:9;20504:18;20496:26;;20568:9;20562:4;20558:20;20554:1;20543:9;20539:17;20532:47;20596:131;20722:4;20596:131;:::i;:::-;20588:139;;20315:419;;;:::o;20740:::-;20906:4;20944:2;20933:9;20929:18;20921:26;;20993:9;20987:4;20983:20;20979:1;20968:9;20964:17;20957:47;21021:131;21147:4;21021:131;:::i;:::-;21013:139;;20740:419;;;:::o;21165:::-;21331:4;21369:2;21358:9;21354:18;21346:26;;21418:9;21412:4;21408:20;21404:1;21393:9;21389:17;21382:47;21446:131;21572:4;21446:131;:::i;:::-;21438:139;;21165:419;;;:::o;21590:::-;21756:4;21794:2;21783:9;21779:18;21771:26;;21843:9;21837:4;21833:20;21829:1;21818:9;21814:17;21807:47;21871:131;21997:4;21871:131;:::i;:::-;21863:139;;21590:419;;;:::o;22015:::-;22181:4;22219:2;22208:9;22204:18;22196:26;;22268:9;22262:4;22258:20;22254:1;22243:9;22239:17;22232:47;22296:131;22422:4;22296:131;:::i;:::-;22288:139;;22015:419;;;:::o;22440:::-;22606:4;22644:2;22633:9;22629:18;22621:26;;22693:9;22687:4;22683:20;22679:1;22668:9;22664:17;22657:47;22721:131;22847:4;22721:131;:::i;:::-;22713:139;;22440:419;;;:::o;22865:::-;23031:4;23069:2;23058:9;23054:18;23046:26;;23118:9;23112:4;23108:20;23104:1;23093:9;23089:17;23082:47;23146:131;23272:4;23146:131;:::i;:::-;23138:139;;22865:419;;;:::o;23290:346::-;23445:4;23483:2;23472:9;23468:18;23460:26;;23496:133;23626:1;23615:9;23611:17;23602:6;23496:133;:::i;:::-;23290:346;;;;:::o;23642:222::-;23735:4;23773:2;23762:9;23758:18;23750:26;;23786:71;23854:1;23843:9;23839:17;23830:6;23786:71;:::i;:::-;23642:222;;;;:::o;23870:129::-;23904:6;23931:20;;:::i;:::-;23921:30;;23960:33;23988:4;23980:6;23960:33;:::i;:::-;23870:129;;;:::o;24005:75::-;24038:6;24071:2;24065:9;24055:19;;24005:75;:::o;24086:307::-;24147:4;24237:18;24229:6;24226:30;24223:56;;;24259:18;;:::i;:::-;24223:56;24297:29;24319:6;24297:29;:::i;:::-;24289:37;;24381:4;24375;24371:15;24363:23;;24086:307;;;:::o;24399:308::-;24461:4;24551:18;24543:6;24540:30;24537:56;;;24573:18;;:::i;:::-;24537:56;24611:29;24633:6;24611:29;:::i;:::-;24603:37;;24695:4;24689;24685:15;24677:23;;24399:308;;;:::o;24713:98::-;24764:6;24798:5;24792:12;24782:22;;24713:98;;;:::o;24817:99::-;24869:6;24903:5;24897:12;24887:22;;24817:99;;;:::o;24922:168::-;25005:11;25039:6;25034:3;25027:19;25079:4;25074:3;25070:14;25055:29;;24922:168;;;;:::o;25096:147::-;25197:11;25234:3;25219:18;;25096:147;;;;:::o;25249:169::-;25333:11;25367:6;25362:3;25355:19;25407:4;25402:3;25398:14;25383:29;;25249:169;;;;:::o;25424:148::-;25526:11;25563:3;25548:18;;25424:148;;;;:::o;25578:305::-;25618:3;25637:20;25655:1;25637:20;:::i;:::-;25632:25;;25671:20;25689:1;25671:20;:::i;:::-;25666:25;;25825:1;25757:66;25753:74;25750:1;25747:81;25744:107;;;25831:18;;:::i;:::-;25744:107;25875:1;25872;25868:9;25861:16;;25578:305;;;;:::o;25889:185::-;25929:1;25946:20;25964:1;25946:20;:::i;:::-;25941:25;;25980:20;25998:1;25980:20;:::i;:::-;25975:25;;26019:1;26009:35;;26024:18;;:::i;:::-;26009:35;26066:1;26063;26059:9;26054:14;;25889:185;;;;:::o;26080:348::-;26120:7;26143:20;26161:1;26143:20;:::i;:::-;26138:25;;26177:20;26195:1;26177:20;:::i;:::-;26172:25;;26365:1;26297:66;26293:74;26290:1;26287:81;26282:1;26275:9;26268:17;26264:105;26261:131;;;26372:18;;:::i;:::-;26261:131;26420:1;26417;26413:9;26402:20;;26080:348;;;;:::o;26434:191::-;26474:4;26494:20;26512:1;26494:20;:::i;:::-;26489:25;;26528:20;26546:1;26528:20;:::i;:::-;26523:25;;26567:1;26564;26561:8;26558:34;;;26572:18;;:::i;:::-;26558:34;26617:1;26614;26610:9;26602:17;;26434:191;;;;:::o;26631:96::-;26668:7;26697:24;26715:5;26697:24;:::i;:::-;26686:35;;26631:96;;;:::o;26733:90::-;26767:7;26810:5;26803:13;26796:21;26785:32;;26733:90;;;:::o;26829:149::-;26865:7;26905:66;26898:5;26894:78;26883:89;;26829:149;;;:::o;26984:126::-;27021:7;27061:42;27054:5;27050:54;27039:65;;26984:126;;;:::o;27116:77::-;27153:7;27182:5;27171:16;;27116:77;;;:::o;27199:101::-;27235:7;27275:18;27268:5;27264:30;27253:41;;27199:101;;;:::o;27306:154::-;27390:6;27385:3;27380;27367:30;27452:1;27443:6;27438:3;27434:16;27427:27;27306:154;;;:::o;27466:307::-;27534:1;27544:113;27558:6;27555:1;27552:13;27544:113;;;27643:1;27638:3;27634:11;27628:18;27624:1;27619:3;27615:11;27608:39;27580:2;27577:1;27573:10;27568:15;;27544:113;;;27675:6;27672:1;27669:13;27666:101;;;27755:1;27746:6;27741:3;27737:16;27730:27;27666:101;27515:258;27466:307;;;:::o;27779:320::-;27823:6;27860:1;27854:4;27850:12;27840:22;;27907:1;27901:4;27897:12;27928:18;27918:81;;27984:4;27976:6;27972:17;27962:27;;27918:81;28046:2;28038:6;28035:14;28015:18;28012:38;28009:84;;;28065:18;;:::i;:::-;28009:84;27830:269;27779:320;;;:::o;28105:281::-;28188:27;28210:4;28188:27;:::i;:::-;28180:6;28176:40;28318:6;28306:10;28303:22;28282:18;28270:10;28267:34;28264:62;28261:88;;;28329:18;;:::i;:::-;28261:88;28369:10;28365:2;28358:22;28148:238;28105:281;;:::o;28392:233::-;28431:3;28454:24;28472:5;28454:24;:::i;:::-;28445:33;;28500:66;28493:5;28490:77;28487:103;;;28570:18;;:::i;:::-;28487:103;28617:1;28610:5;28606:13;28599:20;;28392:233;;;:::o;28631:176::-;28663:1;28680:20;28698:1;28680:20;:::i;:::-;28675:25;;28714:20;28732:1;28714:20;:::i;:::-;28709:25;;28753:1;28743:35;;28758:18;;:::i;:::-;28743:35;28799:1;28796;28792:9;28787:14;;28631:176;;;;:::o;28813:180::-;28861:77;28858:1;28851:88;28958:4;28955:1;28948:15;28982:4;28979:1;28972:15;28999:180;29047:77;29044:1;29037:88;29144:4;29141:1;29134:15;29168:4;29165:1;29158:15;29185:180;29233:77;29230:1;29223:88;29330:4;29327:1;29320:15;29354:4;29351:1;29344:15;29371:180;29419:77;29416:1;29409:88;29516:4;29513:1;29506:15;29540:4;29537:1;29530:15;29557:180;29605:77;29602:1;29595:88;29702:4;29699:1;29692:15;29726:4;29723:1;29716:15;29743:117;29852:1;29849;29842:12;29866:117;29975:1;29972;29965:12;29989:117;30098:1;30095;30088:12;30112:117;30221:1;30218;30211:12;30235:102;30276:6;30327:2;30323:7;30318:2;30311:5;30307:14;30303:28;30293:38;;30235:102;;;:::o;30343:225::-;30483:34;30479:1;30471:6;30467:14;30460:58;30552:8;30547:2;30539:6;30535:15;30528:33;30343:225;:::o;30574:220::-;30714:34;30710:1;30702:6;30698:14;30691:58;30783:3;30778:2;30770:6;30766:15;30759:28;30574:220;:::o;30800:168::-;30940:20;30936:1;30928:6;30924:14;30917:44;30800:168;:::o;30974:180::-;31114:32;31110:1;31102:6;31098:14;31091:56;30974:180;:::o;31160:168::-;31300:20;31296:1;31288:6;31284:14;31277:44;31160:168;:::o;31334:155::-;31474:7;31470:1;31462:6;31458:14;31451:31;31334:155;:::o;31495:182::-;31635:34;31631:1;31623:6;31619:14;31612:58;31495:182;:::o;31683:234::-;31823:34;31819:1;31811:6;31807:14;31800:58;31892:17;31887:2;31879:6;31875:15;31868:42;31683:234;:::o;31923:114::-;;:::o;32043:166::-;32183:18;32179:1;32171:6;32167:14;32160:42;32043:166;:::o;32215:172::-;32355:24;32351:1;32343:6;32339:14;32332:48;32215:172;:::o;32393:::-;32533:24;32529:1;32521:6;32517:14;32510:48;32393:172;:::o;32571:178::-;32711:30;32707:1;32699:6;32695:14;32688:54;32571:178;:::o;32755:181::-;32895:33;32891:1;32883:6;32879:14;32872:57;32755:181;:::o;32942:151::-;33082:3;33078:1;33070:6;33066:14;33059:27;32942:151;:::o;33099:122::-;33172:24;33190:5;33172:24;:::i;:::-;33165:5;33162:35;33152:63;;33211:1;33208;33201:12;33152:63;33099:122;:::o;33227:116::-;33297:21;33312:5;33297:21;:::i;:::-;33290:5;33287:32;33277:60;;33333:1;33330;33323:12;33277:60;33227:116;:::o;33349:120::-;33421:23;33438:5;33421:23;:::i;:::-;33414:5;33411:34;33401:62;;33459:1;33456;33449:12;33401:62;33349:120;:::o;33475:122::-;33548:24;33566:5;33548:24;:::i;:::-;33541:5;33538:35;33528:63;;33587:1;33584;33577:12;33528:63;33475:122;:::o

Swarm Source

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