ETH Price: $2,865.82 (+6.51%)
 

Overview

Max Total Supply

1,651 APED

Holders

247

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 APED
0xbcdf628839183c0b29f05a41694e4aae35d01e43
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

ApeRaffle fully blockchain turn-based game with rewards.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ApeRaffle

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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



pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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


pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}



pragma solidity ^0.8.0;


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // 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) private _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;

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @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)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI))
                : "";
    }

    /**
     * @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);
        require(to != owner, "ERC721A: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721A: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721A: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: approve to caller");

        _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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

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

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

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

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

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}




pragma solidity ^0.8.0;


contract ApeRaffle is ERC721A, Ownable {

    uint256 public apePrice = 42000000000000000;
    uint256 public apeWlPrice = 0;
    uint public maxApePurchase = 25;
    uint public maxWlApePurchase = 1;
    uint public ApeSup = 4200;
    bool public drop_is_active = false;
    bool public presale_is_active = true;
    string public baseURI = "https://ipfs.io/ipfs/QmNoKJrk5fLbaG1taXv1sYnuv3APrMsMs9JXYaQqFjTtXU";
    uint256 public tokensMinted = 0;

    mapping(address => uint) addressesThatMinted;

    struct Whitelistaddr {
        uint256 presalemints;
        bool exists;
    }
    mapping(address => Whitelistaddr) private whitelist;

    constructor() ERC721A("ApeRaffle", "APED",24, 10000){
   
   whitelist[0xdcf90FDd7EF37178A1dfB414D2Ef028d8681a83B].exists = true;
whitelist[0xE187F9D2abAd356D3Cd84fBb446766CB1dFDe5A4].exists = true;
whitelist[0x56ae97EDfdab3b367E8e0DDcdB63A0C4072B96D2].exists = true;
whitelist[0x6099381e17d4Ffb7a2717bb7Ee8067867442aA55].exists = true;
whitelist[0xD9e6E096649e183eB3F51f3A424EA940d4126a07].exists = true;
whitelist[0xea06264f9324c417d633a867B62D5f03e1346418].exists = true;
whitelist[0x77a38728E69098ACB6F6Dc343a69ad28a4B913a0].exists = true;
whitelist[0x5ED2698484c888C5701Bc0Af690ccA67F67Bc000].exists = true;
whitelist[0x035f4B090F4fE6a2d95a3e3617ba0FAF8C8322e5].exists = true;
whitelist[0x5382718773076C66198ee1a4fb82c2Ed47B362ED].exists = true;
whitelist[0xd5d1c5daF1Ef2807b4033c169eCc0F7e1CbCdFf9].exists = true;
whitelist[0x2318C512B95404d05b09936DB4836c78054253f7].exists = true;
whitelist[0x6eD487770e3065Ab5Ff038f757AAde4a35601C43].exists = true;
whitelist[0x1B065C320a3f889E57D2dA4C218b1d97e90C609a].exists = true;
whitelist[0xe819D78c8AE7Eb2c3BEBBED6CaCB6f91D6221735].exists = true;
whitelist[0x995484306Fa2833dc37A0cfCCDc237ECD54019e2].exists = true;
whitelist[0x93e4a8D7aA34CAed7669bfbd24037680277D277C].exists = true;
whitelist[0x1329eE6b4DeA88F48ecB25858F911b409847a74e].exists = true;
whitelist[0x6B18fb2248eD2fddD1c639EEC40fEd4A5d596747].exists = true;
whitelist[0x72466e0A114aC95661e2011633759F73Ef77943F].exists = true;
whitelist[0xe4FaDECA360813E6d0AFF959E0f7F256EEA5A26b].exists = true;
whitelist[0xd7cc1a676F987001b9F622adfC50788ad908e505].exists = true;
whitelist[0x64BC4Ed143D0c2043D6A93C1C3214022622b7D6C].exists = true;
whitelist[0x70627c9376F78F4e69b12094c2eEC4d187433340].exists = true;
whitelist[0xf1D6212ee15486a0E1541FD68318a2de4abF872d].exists = true;
whitelist[0xD9393a4EC941E0456Dd51Ce8EA65765C76295366].exists = true;
whitelist[0x6D1DEDAceB920980Ae80e2C901971755296Ca41e].exists = true;
whitelist[0x6F9a0Ab8B1e7098B31031d1b2ca6daD090E2122E].exists = true;
whitelist[0x9BeB2df4Bf7Ddd5f06f7Ac71ecaB0440246278CE].exists = true;
whitelist[0xaF88a198559D08B5932a5dF63b6Be42bE8f96eE1].exists = true;
whitelist[0x0C07747AB98EE84971C90Fbd353eda207B737c43].exists = true;
whitelist[0xB72eDF2669F2b05571aE4eE0E045D5927982b1a9].exists = true;
whitelist[0xA2B48C299A90303E758680E4FdEcE6C0AdC1D588].exists = true;
whitelist[0x974BFb4a344da64Ae216E8c21b70c3235cac7CF8].exists = true;
whitelist[0x36Fa3E52D58A7401Be46353F50667FBf931e4F42].exists = true;
whitelist[0x65960E16ff98732704d8FFc86ff736f5A4a032F2].exists = true;
whitelist[0x0D54d4500FACb7f836868A94daAb41ABdcFAB0A8].exists = true;
whitelist[0x18651bC48BC18110C99332f63BB921Cf0592cA53].exists = true;
whitelist[0xD75301B8Aad060377D616098d91Bbc42054C2074].exists = true;
whitelist[0x21EbFbbb8dF82E20d7130e0A35B1C6A22068380a].exists = true;
whitelist[0x6C8A0db8610F08159d3be7a2bFeCb8624E76aC79].exists = true;
whitelist[0x7AD79B83575BECB692bddF23909b74f1F52503De].exists = true;
whitelist[0x9Baf7C87825e382408a5C17D36af48d3c8A4756B].exists = true;
whitelist[0xE77c2317E7d9170f374A6ce32877E95E91E6AE92].exists = true;
whitelist[0xA3C35f9eb6EB55db0Ab0311749b7D95Ce2B9bC52].exists = true;
whitelist[0x75256484A5f5e56D2c0189ed64Aa7CF4C677E2E6].exists = true;
whitelist[0x63ff0cBf0A777e9c2F84F0386947F0c86B99a939].exists = true;
whitelist[0xAB8782298BB8c647562c8D80c794E6E013852f99].exists = true;
whitelist[0x1cFacf54fcA7A1574666325cDf0F5387db97752a].exists = true;
whitelist[0x66Ce82ab8dc9ce4C93f244E56e7647d81a8a97D5].exists = true;
whitelist[0xE31515776f6CC88F57B6f697f4F5c11D2269e862].exists = true;
whitelist[0x3ef083f9f48B5f3b7734aA582f7BF04cf2D4b173].exists = true;
whitelist[0x5BE48Eb33ecC783CE0dBf17Ce0d392bDC3D1C5de].exists = true;
whitelist[0x97F7c8A4F4734CB893024Ea0fD563CebEEc5B0e2].exists = true;
whitelist[0x973477e108f9e5B4aA61CC5B972015daf3c20f5a].exists = true;
whitelist[0xfebbB48C8f7A67Dc3DcEE19524A410E078e6A6a1].exists = true;
whitelist[0xA15Cee6667054F7cE834c7E5d2a06dBa4454a227].exists = true;
whitelist[0x219C9F6799a890f2093Fa0a87277C976DDc46f2D].exists = true;
whitelist[0xd0aA5209e5B1594215e1450C4e7596bB3066E330].exists = true;
whitelist[0x54A987BB76eB866dc2359D6a7f7B8E160BD48f39].exists = true;
whitelist[0xEB0AADED83e56137a526ed20D66645D6955cA0fb].exists = true;
whitelist[0x2eCC650E73D984DB98c2d239108D2931BdAB7028].exists = true;
whitelist[0x97E054d5C8BAdE27F527b8d76287F78978f1242F].exists = true;
whitelist[0xF96CB1BB32542129b2F2f3248e90252D7291f27F].exists = true;
whitelist[0x441839Ca1653706192D4cc1B1d1698f50108e01b].exists = true;
whitelist[0x8a8117c238f01F7F9AA835BE5735c7B2B33d7315].exists = true;
whitelist[0xd3F332cF93Cb42dBF4f39dF4001f157165eaC1E6].exists = true;
whitelist[0x5100650a6F0d69795Ed52ccCfdD5f6651A18EDed].exists = true;
whitelist[0x027C73dF1f9F1b846bb79c0D23C6c5a5798a747F].exists = true;
whitelist[0x63a5b7C95447E2c1CfbC904932027E19534e63e2].exists = true;
whitelist[0xABA5509bDcAF5D7B97d65a3Bc9aA5261a14119b1].exists = true;
whitelist[0xfB63762F4D921437B09dd1E69cfcc357D3299175].exists = true;
whitelist[0x5F6777cfD0652d7E8C249152fF1B36c721E250eA].exists = true;
whitelist[0x1F1D2A3fa9b32429B709694BEa92192A685eaF72].exists = true;
whitelist[0x18eb9EFBAb54297cb2c75b3eE01F8471a3953571].exists = true;
whitelist[0xDE051A2A43A18F76626296F09207934270EF5D71].exists = true;
whitelist[0x99FD27b7A783a69e71D56C8B1309ee1e158Ba48a].exists = true;
whitelist[0x79E19185F624a861051be468cc137Ab1e90539a9].exists = true;
whitelist[0x95e122628A0f323598460A071555c38cdc46fe00].exists = true;
whitelist[0xb342eFb33f6AeA4184bF0917b3883d4333Fb3950].exists = true;
whitelist[0x454f40135BFfB862559223fb2A8614ddb5977aDD].exists = true;
whitelist[0xfBfc29e19B1E235b3a1B86DD3BE037e9617b1991].exists = true;
whitelist[0xEA771c3aA97fC8DbA614ECf6de91D7B2b595EF1a].exists = true;
whitelist[0xe6723F96A3485783cb89F84C0C53Ea88B0410a17].exists = true;
whitelist[0x5F1F88a17BEB89E9B51C8167382569F8F5FB89Af].exists = true;
whitelist[0x097bf2c7CDF1543238e88abd675A26cde1aa3259].exists = true;
whitelist[0xc74b35a30e6CEf0a0c7dAE582b87200285C2af6b].exists = true;
whitelist[0x9d509C23f0170760920FDf24D0315e7E70903fC6].exists = true;
whitelist[0x29146D7c15d94f19fb92863b80898ca93a659C54].exists = true;
whitelist[0x626f1Ceb00a2112f1dEfBb1ebF9EFdb98d88830f].exists = true;
whitelist[0x0B0237aD59e1BbCb611fdf0c9Fa07350C3f41e87].exists = true;
whitelist[0xD8dBC8Db662B2712c5C9E1e66A961c427a81bE3d].exists = true;
whitelist[0x4e4CC29ab82cf8aa4EcD3578A26409E57793de4b].exists = true;
whitelist[0xd7DFF7399E8F45490c708f5eC1A4a39993B7b4A6].exists = true;
whitelist[0xe973B9fDC98586D0BE196fC5dA93e6D26CE9A899].exists = true;
whitelist[0xcd245Eb87Cce56756BBF4661A5a88999A48d8752].exists = true;
whitelist[0x212Ed9cf16aA66e0DB9b8483E82908659D3f5370].exists = true;
whitelist[0xB5905960c0224d9333fC58eb60E2B57423b18d99].exists = true;
whitelist[0x036D0560582c444ff13d5822e2759A9f1E3D1e1e].exists = true;
whitelist[0xd7125Fec3a9a58EcC15449e124813887b1ea2ecF].exists = true;
whitelist[0xdC18E236e31aB28115E35ebE446ddCf333fE9a58].exists = true;

    }

    function OnWhiteList(address walletaddr)
    public
    view
    returns (bool)
    {
        if (whitelist[walletaddr].exists){
            return true;
        }
        else{
            return false;
        }
    }

    function addToWhiteList (address[] memory newWalletaddr) public onlyOwner{
        for (uint256 i = 0; i<newWalletaddr.length;i++){
            whitelist[newWalletaddr[i]].exists = true;
        }        
    }

    function withdraw() public onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
    }

    function flipDropState() public onlyOwner {
        drop_is_active = !drop_is_active;
    }

    function flipPresaleSate() public onlyOwner {
        presale_is_active = !presale_is_active;
    }

    function PresaleMint(uint256 numberOfTokens) public payable{
        require(presale_is_active, "Please wait until the PreMint has begun!");
        require(whitelist[msg.sender].exists == true, "This Wallet is not able mint for presale"); 
        require(numberOfTokens > 0 && tokensMinted + numberOfTokens <= ApeSup, "Purchase would exceed current max supply of tickets");
        require(whitelist[msg.sender].presalemints + numberOfTokens <= maxWlApePurchase,"This Wallet has already minted its reserved tickets");
        require(msg.value >= apeWlPrice * numberOfTokens, "ETH value sent is too little for this many tickets");
        addressesThatMinted[msg.sender] += numberOfTokens;
        whitelist[msg.sender].presalemints += numberOfTokens;

        _safeMint(msg.sender, numberOfTokens);
    }

    function mintApeRaffle(uint numberOfTokens) public payable {
        require(drop_is_active, "Please wait until the Public sale is active to mint");
        require(numberOfTokens > 0 && numberOfTokens <= maxApePurchase);
        require(tokensMinted + numberOfTokens <= ApeSup, "Purchase would exceed max supply of tickets");
        require(msg.value >= apePrice * numberOfTokens, "ETH value sent is too little for this many tickets");
        require(((addressesThatMinted[msg.sender] + numberOfTokens) ) <= maxApePurchase , "this would exceed mint max allowance");

        addressesThatMinted[msg.sender] += numberOfTokens;

        _safeMint(msg.sender, numberOfTokens);
    }

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

    function setBaseURI(string memory newBaseURI)public onlyOwner{
        baseURI = newBaseURI;
    }
    function changeMintPrice(uint256 newPrice) public onlyOwner {
        // require(newPrice < apePrice); removing mandate to go lower
        apePrice = newPrice;
    }
    function changeWlMintPrice(uint256 newWlPrice) public onlyOwner {
        // require(newPrice < apePrice); removing mandate to go lower
        apeWlPrice = newWlPrice;
    }
    function changeMintSupply(uint256 newSupply) public onlyOwner {
        // require(newSupply < ApeSup); removing mandate to go lower
        require(newSupply > totalSupply());
        ApeSup = newSupply;
    }
    function changeMaxApePurchase(uint256 newMaxApePurchase) public onlyOwner {

        maxApePurchase = newMaxApePurchase;
    }
    function changeMaxWlApePurchase(uint256 newMaxWlApePurchase) public onlyOwner {

        maxWlApePurchase = newMaxWlApePurchase;
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"ApeSup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"walletaddr","type":"address"}],"name":"OnWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"PresaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newWalletaddr","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"apePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apeWlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxApePurchase","type":"uint256"}],"name":"changeMaxApePurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWlApePurchase","type":"uint256"}],"name":"changeMaxWlApePurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changeMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"changeMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWlPrice","type":"uint256"}],"name":"changeWlMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"drop_is_active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipDropState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleSate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxApePurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWlApePurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintApeRaffle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":[],"name":"presale_is_active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600080556000600755669536c7089100006009556000600a556019600b556001600c55611068600d556000600e60006101000a81548160ff0219169083151502179055506001600e60016101000a81548160ff02191690831515021790555060405180608001604052806043815260200162007f2b60439139600f90805190602001906200009492919062002e75565b506000601055348015620000a757600080fd5b506040518060400160405280600981526020017f417065526166666c6500000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f41504544000000000000000000000000000000000000000000000000000000008152506018612710600081116200015f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001569062003017565b60405180910390fd5b60008211620001a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200019c9062002ff5565b60405180910390fd5b8360019080519060200190620001bd92919062002e75565b508260029080519060200190620001d692919062002e75565b508160a081815250508060808181525050505050506000620001fd62002e6d60201b60201c565b905080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060016012600073dcf90fdd7ef37178a1dfb414d2ef028d8681a83b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073e187f9d2abad356d3cd84fbb446766cb1dfde5a473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007356ae97edfdab3b367e8e0ddcdb63a0c4072b96d273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000736099381e17d4ffb7a2717bb7ee8067867442aa5573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d9e6e096649e183eb3f51f3a424ea940d4126a0773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073ea06264f9324c417d633a867b62d5f03e134641873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007377a38728e69098acb6f6dc343a69ad28a4b913a073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000735ed2698484c888c5701bc0af690cca67f67bc00073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073035f4b090f4fe6a2d95a3e3617ba0faf8c8322e573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000735382718773076c66198ee1a4fb82c2ed47b362ed73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d5d1c5daf1ef2807b4033c169ecc0f7e1cbcdff973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000732318c512b95404d05b09936db4836c78054253f773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000736ed487770e3065ab5ff038f757aade4a35601c4373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000731b065c320a3f889e57d2da4c218b1d97e90c609a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073e819d78c8ae7eb2c3bebbed6cacb6f91d622173573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073995484306fa2833dc37a0cfccdc237ecd54019e273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007393e4a8d7aa34caed7669bfbd24037680277d277c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000731329ee6b4dea88f48ecb25858f911b409847a74e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000736b18fb2248ed2fddd1c639eec40fed4a5d59674773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007372466e0a114ac95661e2011633759f73ef77943f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073e4fadeca360813e6d0aff959e0f7f256eea5a26b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d7cc1a676f987001b9f622adfc50788ad908e50573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007364bc4ed143d0c2043d6a93c1c3214022622b7d6c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007370627c9376f78f4e69b12094c2eec4d18743334073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073f1d6212ee15486a0e1541fd68318a2de4abf872d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d9393a4ec941e0456dd51ce8ea65765c7629536673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000736d1dedaceb920980ae80e2c901971755296ca41e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000736f9a0ab8b1e7098b31031d1b2ca6dad090e2122e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000739beb2df4bf7ddd5f06f7ac71ecab0440246278ce73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073af88a198559d08b5932a5df63b6be42be8f96ee173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000730c07747ab98ee84971c90fbd353eda207b737c4373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073b72edf2669f2b05571ae4ee0e045d5927982b1a973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073a2b48c299a90303e758680e4fdece6c0adc1d58873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073974bfb4a344da64ae216e8c21b70c3235cac7cf873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007336fa3e52d58a7401be46353f50667fbf931e4f4273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007365960e16ff98732704d8ffc86ff736f5a4a032f273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000730d54d4500facb7f836868a94daab41abdcfab0a873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007318651bc48bc18110c99332f63bb921cf0592ca5373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d75301b8aad060377d616098d91bbc42054c207473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007321ebfbbb8df82e20d7130e0a35b1c6a22068380a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000736c8a0db8610f08159d3be7a2bfecb8624e76ac7973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000737ad79b83575becb692bddf23909b74f1f52503de73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000739baf7c87825e382408a5c17d36af48d3c8a4756b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073e77c2317e7d9170f374a6ce32877e95e91e6ae9273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073a3c35f9eb6eb55db0ab0311749b7d95ce2b9bc5273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007375256484a5f5e56d2c0189ed64aa7cf4c677e2e673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007363ff0cbf0a777e9c2f84f0386947f0c86b99a93973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073ab8782298bb8c647562c8d80c794e6e013852f9973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000731cfacf54fca7a1574666325cdf0f5387db97752a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007366ce82ab8dc9ce4c93f244e56e7647d81a8a97d573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073e31515776f6cc88f57b6f697f4f5c11d2269e86273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000733ef083f9f48b5f3b7734aa582f7bf04cf2d4b17373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000735be48eb33ecc783ce0dbf17ce0d392bdc3d1c5de73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007397f7c8a4f4734cb893024ea0fd563cebeec5b0e273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073973477e108f9e5b4aa61cc5b972015daf3c20f5a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073febbb48c8f7a67dc3dcee19524a410e078e6a6a173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073a15cee6667054f7ce834c7e5d2a06dba4454a22773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073219c9f6799a890f2093fa0a87277c976ddc46f2d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d0aa5209e5b1594215e1450c4e7596bb3066e33073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007354a987bb76eb866dc2359d6a7f7b8e160bd48f3973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073eb0aaded83e56137a526ed20d66645d6955ca0fb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000732ecc650e73d984db98c2d239108d2931bdab702873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007397e054d5c8bade27f527b8d76287f78978f1242f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073f96cb1bb32542129b2f2f3248e90252d7291f27f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073441839ca1653706192d4cc1b1d1698f50108e01b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000738a8117c238f01f7f9aa835be5735c7b2b33d731573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d3f332cf93cb42dbf4f39df4001f157165eac1e673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000735100650a6f0d69795ed52cccfdd5f6651a18eded73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073027c73df1f9f1b846bb79c0d23c6c5a5798a747f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007363a5b7c95447e2c1cfbc904932027e19534e63e273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073aba5509bdcaf5d7b97d65a3bc9aa5261a14119b173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073fb63762f4d921437b09dd1e69cfcc357d329917573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000735f6777cfd0652d7e8c249152ff1b36c721e250ea73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000731f1d2a3fa9b32429b709694bea92192a685eaf7273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007318eb9efbab54297cb2c75b3ee01f8471a395357173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073de051a2a43a18f76626296f09207934270ef5d7173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007399fd27b7a783a69e71d56c8b1309ee1e158ba48a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007379e19185f624a861051be468cc137ab1e90539a973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007395e122628a0f323598460a071555c38cdc46fe0073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073b342efb33f6aea4184bf0917b3883d4333fb395073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073454f40135bffb862559223fb2a8614ddb5977add73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073fbfc29e19b1e235b3a1b86dd3be037e9617b199173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073ea771c3aa97fc8dba614ecf6de91d7b2b595ef1a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073e6723f96a3485783cb89f84c0c53ea88b0410a1773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000735f1f88a17beb89e9b51c8167382569f8f5fb89af73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073097bf2c7cdf1543238e88abd675a26cde1aa325973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073c74b35a30e6cef0a0c7dae582b87200285c2af6b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000739d509c23f0170760920fdf24d0315e7e70903fc673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506001601260007329146d7c15d94f19fb92863b80898ca93a659c5473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073626f1ceb00a2112f1defbb1ebf9efdb98d88830f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000730b0237ad59e1bbcb611fdf0c9fa07350c3f41e8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d8dbc8db662b2712c5c9e1e66a961c427a81be3d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550600160126000734e4cc29ab82cf8aa4ecd3578a26409e57793de4b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d7dff7399e8f45490c708f5ec1a4a39993b7b4a673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073e973b9fdc98586d0be196fc5da93e6d26ce9a89973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073cd245eb87cce56756bbf4661a5a88999a48d875273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073212ed9cf16aa66e0db9b8483e82908659d3f537073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073b5905960c0224d9333fc58eb60e2b57423b18d9973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073036d0560582c444ff13d5822e2759a9f1e3d1e1e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073d7125fec3a9a58ecc15449e124813887b1ea2ecf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555060016012600073dc18e236e31ab28115e35ebe446ddcf333fe9a5873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550620030af565b600033905090565b82805462002e83906200304a565b90600052602060002090601f01602090048101928262002ea7576000855562002ef3565b82601f1062002ec257805160ff191683800117855562002ef3565b8280016001018555821562002ef3579182015b8281111562002ef257825182559160200191906001019062002ed5565b5b50905062002f02919062002f06565b5090565b5b8082111562002f2157600081600090555060010162002f07565b5090565b600062002f3460278362003039565b91507f455243373231413a206d61782062617463682073697a65206d7573742062652060008301527f6e6f6e7a65726f000000000000000000000000000000000000000000000000006020830152604082019050919050565b600062002f9c602e8362003039565b91507f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008301527f6e6f6e7a65726f20737570706c790000000000000000000000000000000000006020830152604082019050919050565b60006020820190508181036000830152620030108162002f25565b9050919050565b60006020820190508181036000830152620030328162002f8d565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200306357607f821691505b602082108114156200307a576200307962003080565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a051614e4b620030e060003960008181612b4401528181612b6d0152612fdd015260005050614e4b6000f3fe6080604052600436106102515760003560e01c80636de9f32b11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461085c578063cd82737614610899578063d7224ba0146108c4578063dd764566146108ef578063e985e9c514610918578063f2fde38b1461095557610251565b8063a22cb465146107ae578063a31a13eb146107d7578063af27073e146107ee578063b88d4fde1461080a578063bab910621461083357610251565b80637a3f451e116100fd5780637a3f451e146106ed5780638da5cb5b1461071857806395d89b411461074357806396f8f6dd1461076e5780639c29391e1461078557610251565b80636de9f32b1461060857806370a0823114610633578063715018a614610670578063740d73f31461068757806377bf1411146106b057610251565b80632ad4bfab116101d25780634f6ccce7116101965780634f6ccce7146104e4578063528173a61461052157806355f804b31461054c578063571dff3b146105755780636352211e146105a05780636c0360eb146105dd57610251565b80632ad4bfab146104155780632f745c591461043e5780633ccfd60b1461047b5780633fd173661461049257806342842e0e146104bb57610251565b806311efbc971161021957806311efbc971461034f57806314fcdf491461037a57806318160ddd1461039657806318308a58146103c157806323b872dd146103ec57610251565b806301ffc9a714610256578063052939051461029357806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906138ae565b61097e565b60405161028a919061456e565b60405180910390f35b34801561029f57600080fd5b506102a8610ac8565b6040516102b5919061456e565b60405180910390f35b3480156102ca57600080fd5b506102d3610adb565b6040516102e09190614589565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613941565b610b6d565b60405161031d9190614507565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613831565b610bf2565b005b34801561035b57600080fd5b50610364610d0b565b604051610371919061492b565b60405180910390f35b610394600480360381019061038f9190613941565b610d11565b005b3480156103a257600080fd5b506103ab610f0f565b6040516103b8919061492b565b60405180910390f35b3480156103cd57600080fd5b506103d6610f18565b6040516103e3919061456e565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e919061372b565b610f2b565b005b34801561042157600080fd5b5061043c60048036038101906104379190613941565b610f3b565b005b34801561044a57600080fd5b5061046560048036038101906104609190613831565b610fc1565b604051610472919061492b565b60405180910390f35b34801561048757600080fd5b506104906111bf565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613941565b61127b565b005b3480156104c757600080fd5b506104e260048036038101906104dd919061372b565b611301565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613941565b611321565b604051610518919061492b565b60405180910390f35b34801561052d57600080fd5b50610536611374565b604051610543919061492b565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613900565b61137a565b005b34801561058157600080fd5b5061058a611410565b604051610597919061492b565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613941565b611416565b6040516105d49190614507565b60405180910390f35b3480156105e957600080fd5b506105f261142c565b6040516105ff9190614589565b60405180910390f35b34801561061457600080fd5b5061061d6114ba565b60405161062a919061492b565b60405180910390f35b34801561063f57600080fd5b5061065a600480360381019061065591906136c6565b6114c0565b604051610667919061492b565b60405180910390f35b34801561067c57600080fd5b506106856115a9565b005b34801561069357600080fd5b506106ae60048036038101906106a9919061386d565b6116e6565b005b3480156106bc57600080fd5b506106d760048036038101906106d291906136c6565b611820565b6040516106e4919061456e565b60405180910390f35b3480156106f957600080fd5b5061070261188a565b60405161070f919061492b565b60405180910390f35b34801561072457600080fd5b5061072d611890565b60405161073a9190614507565b60405180910390f35b34801561074f57600080fd5b506107586118ba565b6040516107659190614589565b60405180910390f35b34801561077a57600080fd5b5061078361194c565b005b34801561079157600080fd5b506107ac60048036038101906107a79190613941565b6119f4565b005b3480156107ba57600080fd5b506107d560048036038101906107d091906137f5565b611a7a565b005b3480156107e357600080fd5b506107ec611bfb565b005b61080860048036038101906108039190613941565b611ca3565b005b34801561081657600080fd5b50610831600480360381019061082c919061377a565b611f84565b005b34801561083f57600080fd5b5061085a60048036038101906108559190613941565b611fe0565b005b34801561086857600080fd5b50610883600480360381019061087e9190613941565b612066565b6040516108909190614589565b60405180910390f35b3480156108a557600080fd5b506108ae612103565b6040516108bb919061492b565b60405180910390f35b3480156108d057600080fd5b506108d9612109565b6040516108e6919061492b565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613941565b61210f565b005b34801561092457600080fd5b5061093f600480360381019061093a91906136ef565b6121a8565b60405161094c919061456e565b60405180910390f35b34801561096157600080fd5b5061097c600480360381019061097791906136c6565b61223c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac15750610ac0826123e8565b5b9050919050565b600e60009054906101000a900460ff1681565b606060018054610aea90614ca0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1690614ca0565b8015610b635780601f10610b3857610100808354040283529160200191610b63565b820191906000526020600020905b815481529060010190602001808311610b4657829003601f168201915b5050505050905090565b6000610b7882612452565b610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906148eb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bfd82611416565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c65906147eb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c8d61245f565b73ffffffffffffffffffffffffffffffffffffffff161480610cbc5750610cbb81610cb661245f565b6121a8565b5b610cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf2906146cb565b60405180910390fd5b610d06838383612467565b505050565b600c5481565b600e60009054906101000a900460ff16610d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d579061462b565b60405180910390fd5b600081118015610d725750600b548111155b610d7b57600080fd5b600d5481601054610d8c9190614a8c565b1115610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc4906145cb565b60405180910390fd5b80600954610ddb9190614ae2565b341015610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e14906146ab565b60405180910390fd5b600b5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6b9190614a8c565b1115610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea3906147cb565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610efb9190614a8c565b92505081905550610f0c3382612519565b50565b60008054905090565b600e60019054906101000a900460ff1681565b610f36838383612537565b505050565b610f4361245f565b73ffffffffffffffffffffffffffffffffffffffff16610f61611890565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae9061472b565b60405180910390fd5b80600a8190555050565b6000610fcc836114c0565b821061100d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611004906145ab565b60405180910390fd5b6000611017610f0f565b905060008060005b8381101561117d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461111157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611169578684141561115a5781955050505050506111b9565b838061116590614cd2565b9450505b50808061117590614cd2565b91505061101f565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b0906148ab565b60405180910390fd5b92915050565b6111c761245f565b73ffffffffffffffffffffffffffffffffffffffff166111e5611890565b73ffffffffffffffffffffffffffffffffffffffff161461123b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112329061472b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061127957600080fd5b565b61128361245f565b73ffffffffffffffffffffffffffffffffffffffff166112a1611890565b73ffffffffffffffffffffffffffffffffffffffff16146112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee9061472b565b60405180910390fd5b8060098190555050565b61131c83838360405180602001604052806000815250611f84565b505050565b600061132b610f0f565b821061136c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113639061464b565b60405180910390fd5b819050919050565b600d5481565b61138261245f565b73ffffffffffffffffffffffffffffffffffffffff166113a0611890565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed9061472b565b60405180910390fd5b80600f908051906020019061140c92919061341a565b5050565b600b5481565b600061142182612af0565b600001519050919050565b600f805461143990614ca0565b80601f016020809104026020016040519081016040528092919081815260200182805461146590614ca0565b80156114b25780601f10611487576101008083540402835291602001916114b2565b820191906000526020600020905b81548152906001019060200180831161149557829003601f168201915b505050505081565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611528906146eb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6115b161245f565b73ffffffffffffffffffffffffffffffffffffffff166115cf611890565b73ffffffffffffffffffffffffffffffffffffffff1614611625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161c9061472b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116ee61245f565b73ffffffffffffffffffffffffffffffffffffffff1661170c611890565b73ffffffffffffffffffffffffffffffffffffffff1614611762576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117599061472b565b60405180910390fd5b60005b815181101561181c576001601260008484815181106117ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550808061181490614cd2565b915050611765565b5050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16156118805760019050611885565b600090505b919050565b60095481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546118c990614ca0565b80601f01602080910402602001604051908101604052809291908181526020018280546118f590614ca0565b80156119425780601f1061191757610100808354040283529160200191611942565b820191906000526020600020905b81548152906001019060200180831161192557829003601f168201915b5050505050905090565b61195461245f565b73ffffffffffffffffffffffffffffffffffffffff16611972611890565b73ffffffffffffffffffffffffffffffffffffffff16146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061472b565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6119fc61245f565b73ffffffffffffffffffffffffffffffffffffffff16611a1a611890565b73ffffffffffffffffffffffffffffffffffffffff1614611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a679061472b565b60405180910390fd5b80600c8190555050565b611a8261245f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061476b565b60405180910390fd5b8060066000611afd61245f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611baa61245f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bef919061456e565b60405180910390a35050565b611c0361245f565b73ffffffffffffffffffffffffffffffffffffffff16611c21611890565b73ffffffffffffffffffffffffffffffffffffffff1614611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e9061472b565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600e60019054906101000a900460ff16611cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce99061468b565b60405180910390fd5b60011515601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16151514611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7f9061484b565b60405180910390fd5b600081118015611da75750600d5481601054611da49190614a8c565b11155b611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd9061488b565b60405180910390fd5b600c5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611e379190614a8c565b1115611e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6f906147ab565b60405180910390fd5b80600a54611e869190614ae2565b341015611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf906146ab565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f179190614a8c565b9250508190555080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611f709190614a8c565b92505081905550611f813382612519565b50565b611f8f848484612537565b611f9b84848484612cf3565b611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd19061480b565b60405180910390fd5b50505050565b611fe861245f565b73ffffffffffffffffffffffffffffffffffffffff16612006611890565b73ffffffffffffffffffffffffffffffffffffffff161461205c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120539061472b565b60405180910390fd5b80600b8190555050565b606061207182612452565b6120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a79061474b565b60405180910390fd5b60006120ba612e8a565b905060008151116120da57604051806020016040528060008152506120fb565b806040516020016120eb91906144f0565b6040516020818303038152906040525b915050919050565b600a5481565b60075481565b61211761245f565b73ffffffffffffffffffffffffffffffffffffffff16612135611890565b73ffffffffffffffffffffffffffffffffffffffff161461218b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121829061472b565b60405180910390fd5b612193610f0f565b811161219e57600080fd5b80600d8190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61224461245f565b73ffffffffffffffffffffffffffffffffffffffff16612262611890565b73ffffffffffffffffffffffffffffffffffffffff16146122b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122af9061472b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231f906145eb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612533828260405180602001604052806000815250612f1c565b5050565b600061254282612af0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661256961245f565b73ffffffffffffffffffffffffffffffffffffffff1614806125c5575061258e61245f565b73ffffffffffffffffffffffffffffffffffffffff166125ad84610b6d565b73ffffffffffffffffffffffffffffffffffffffff16145b806125e157506125e082600001516125db61245f565b6121a8565b5b905080612623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261a9061478b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268c9061470b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc9061466b565b60405180910390fd5b61271285858560016133fb565b6127226000848460000151612467565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166127909190614b3c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128349190614a46565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461293a9190614a8c565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a80576129b081612452565b15612a7f576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ae88686866001613401565b505050505050565b612af86134a0565b612b0182612452565b612b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b379061460b565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612ba45760017f000000000000000000000000000000000000000000000000000000000000000084612b979190614b70565b612ba19190614a8c565b90505b60008390505b818110612cb2576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c9e57809350505050612cee565b508080612caa90614c76565b915050612baa565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce5906148cb565b60405180910390fd5b919050565b6000612d148473ffffffffffffffffffffffffffffffffffffffff16613407565b15612e7d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d3d61245f565b8786866040518563ffffffff1660e01b8152600401612d5f9493929190614522565b602060405180830381600087803b158015612d7957600080fd5b505af1925050508015612daa57506040513d601f19601f82011682018060405250810190612da791906138d7565b60015b612e2d573d8060008114612dda576040519150601f19603f3d011682016040523d82523d6000602084013e612ddf565b606091505b50600081511415612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c9061480b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e82565b600190505b949350505050565b6060600f8054612e9990614ca0565b80601f0160208091040260200160405190810160405280929190818152602001828054612ec590614ca0565b8015612f125780601f10612ee757610100808354040283529160200191612f12565b820191906000526020600020905b815481529060010190602001808311612ef557829003601f168201915b5050505050905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f899061486b565b60405180910390fd5b612f9b81612452565b15612fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd29061482b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083111561303e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130359061490b565b60405180910390fd5b61304b60008583866133fb565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516131489190614a46565b6fffffffffffffffffffffffffffffffff16815260200185836020015161316f9190614a46565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156133de57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461337e6000888488612cf3565b6133bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b49061480b565b60405180910390fd5b81806133c890614cd2565b92505080806133d690614cd2565b91505061330d565b50806000819055506133f36000878588613401565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b82805461342690614ca0565b90600052602060002090601f016020900481019282613448576000855561348f565b82601f1061346157805160ff191683800117855561348f565b8280016001018555821561348f579182015b8281111561348e578251825591602001919060010190613473565b5b50905061349c91906134da565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156134f35760008160009055506001016134db565b5090565b600061350a61350584614977565b614946565b9050808382526020820190508285602086028201111561352957600080fd5b60005b85811015613559578161353f88826135df565b84526020840193506020830192505060018101905061352c565b5050509392505050565b6000613576613571846149a3565b614946565b90508281526020810184848401111561358e57600080fd5b613599848285614c34565b509392505050565b60006135b46135af846149d3565b614946565b9050828152602081018484840111156135cc57600080fd5b6135d7848285614c34565b509392505050565b6000813590506135ee81614db9565b92915050565b600082601f83011261360557600080fd5b81356136158482602086016134f7565b91505092915050565b60008135905061362d81614dd0565b92915050565b60008135905061364281614de7565b92915050565b60008151905061365781614de7565b92915050565b600082601f83011261366e57600080fd5b813561367e848260208601613563565b91505092915050565b600082601f83011261369857600080fd5b81356136a88482602086016135a1565b91505092915050565b6000813590506136c081614dfe565b92915050565b6000602082840312156136d857600080fd5b60006136e6848285016135df565b91505092915050565b6000806040838503121561370257600080fd5b6000613710858286016135df565b9250506020613721858286016135df565b9150509250929050565b60008060006060848603121561374057600080fd5b600061374e868287016135df565b935050602061375f868287016135df565b9250506040613770868287016136b1565b9150509250925092565b6000806000806080858703121561379057600080fd5b600061379e878288016135df565b94505060206137af878288016135df565b93505060406137c0878288016136b1565b925050606085013567ffffffffffffffff8111156137dd57600080fd5b6137e98782880161365d565b91505092959194509250565b6000806040838503121561380857600080fd5b6000613816858286016135df565b92505060206138278582860161361e565b9150509250929050565b6000806040838503121561384457600080fd5b6000613852858286016135df565b9250506020613863858286016136b1565b9150509250929050565b60006020828403121561387f57600080fd5b600082013567ffffffffffffffff81111561389957600080fd5b6138a5848285016135f4565b91505092915050565b6000602082840312156138c057600080fd5b60006138ce84828501613633565b91505092915050565b6000602082840312156138e957600080fd5b60006138f784828501613648565b91505092915050565b60006020828403121561391257600080fd5b600082013567ffffffffffffffff81111561392c57600080fd5b61393884828501613687565b91505092915050565b60006020828403121561395357600080fd5b6000613961848285016136b1565b91505092915050565b61397381614ba4565b82525050565b61398281614bb6565b82525050565b600061399382614a03565b61399d8185614a19565b93506139ad818560208601614c43565b6139b681614da8565b840191505092915050565b60006139cc82614a0e565b6139d68185614a2a565b93506139e6818560208601614c43565b6139ef81614da8565b840191505092915050565b6000613a0582614a0e565b613a0f8185614a3b565b9350613a1f818560208601614c43565b80840191505092915050565b6000613a38602283614a2a565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a9e602b83614a2a565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66207469636b6574730000000000000000000000000000000000000000006020830152604082019050919050565b6000613b04602683614a2a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b6a602a83614a2a565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bd0603383614a2a565b91507f506c65617365207761697420756e74696c20746865205075626c69632073616c60008301527f652069732061637469766520746f206d696e74000000000000000000000000006020830152604082019050919050565b6000613c36602383614a2a565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9c602583614a2a565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d02602883614a2a565b91507f506c65617365207761697420756e74696c20746865205072654d696e7420686160008301527f7320626567756e210000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d68603283614a2a565b91507f4554482076616c75652073656e7420697320746f6f206c6974746c6520666f7260008301527f2074686973206d616e79207469636b65747300000000000000000000000000006020830152604082019050919050565b6000613dce603983614a2a565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613e34602b83614a2a565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000613e9a602683614a2a565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f00602083614a2a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613f40602f83614a2a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613fa6601a83614a2a565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000613fe6603283614a2a565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061404c603383614a2a565b91507f546869732057616c6c65742068617320616c7265616479206d696e746564206960008301527f7473207265736572766564207469636b657473000000000000000000000000006020830152604082019050919050565b60006140b2602483614a2a565b91507f7468697320776f756c6420657863656564206d696e74206d617820616c6c6f7760008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614118602283614a2a565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061417e603383614a2a565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006141e4601d83614a2a565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b6000614224602883614a2a565b91507f546869732057616c6c6574206973206e6f742061626c65206d696e7420666f7260008301527f2070726573616c650000000000000000000000000000000000000000000000006020830152604082019050919050565b600061428a602183614a2a565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142f0603383614a2a565b91507f507572636861736520776f756c64206578636565642063757272656e74206d6160008301527f7820737570706c79206f66207469636b657473000000000000000000000000006020830152604082019050919050565b6000614356602e83614a2a565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006143bc602f83614a2a565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614422602d83614a2a565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614488602283614a2a565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6144ea81614c2a565b82525050565b60006144fc82846139fa565b915081905092915050565b600060208201905061451c600083018461396a565b92915050565b6000608082019050614537600083018761396a565b614544602083018661396a565b61455160408301856144e1565b81810360608301526145638184613988565b905095945050505050565b60006020820190506145836000830184613979565b92915050565b600060208201905081810360008301526145a381846139c1565b905092915050565b600060208201905081810360008301526145c481613a2b565b9050919050565b600060208201905081810360008301526145e481613a91565b9050919050565b6000602082019050818103600083015261460481613af7565b9050919050565b6000602082019050818103600083015261462481613b5d565b9050919050565b6000602082019050818103600083015261464481613bc3565b9050919050565b6000602082019050818103600083015261466481613c29565b9050919050565b6000602082019050818103600083015261468481613c8f565b9050919050565b600060208201905081810360008301526146a481613cf5565b9050919050565b600060208201905081810360008301526146c481613d5b565b9050919050565b600060208201905081810360008301526146e481613dc1565b9050919050565b6000602082019050818103600083015261470481613e27565b9050919050565b6000602082019050818103600083015261472481613e8d565b9050919050565b6000602082019050818103600083015261474481613ef3565b9050919050565b6000602082019050818103600083015261476481613f33565b9050919050565b6000602082019050818103600083015261478481613f99565b9050919050565b600060208201905081810360008301526147a481613fd9565b9050919050565b600060208201905081810360008301526147c48161403f565b9050919050565b600060208201905081810360008301526147e4816140a5565b9050919050565b600060208201905081810360008301526148048161410b565b9050919050565b6000602082019050818103600083015261482481614171565b9050919050565b60006020820190508181036000830152614844816141d7565b9050919050565b6000602082019050818103600083015261486481614217565b9050919050565b600060208201905081810360008301526148848161427d565b9050919050565b600060208201905081810360008301526148a4816142e3565b9050919050565b600060208201905081810360008301526148c481614349565b9050919050565b600060208201905081810360008301526148e4816143af565b9050919050565b6000602082019050818103600083015261490481614415565b9050919050565b600060208201905081810360008301526149248161447b565b9050919050565b600060208201905061494060008301846144e1565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561496d5761496c614d79565b5b8060405250919050565b600067ffffffffffffffff82111561499257614991614d79565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149be576149bd614d79565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156149ee576149ed614d79565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a5182614bee565b9150614a5c83614bee565b9250826fffffffffffffffffffffffffffffffff03821115614a8157614a80614d1b565b5b828201905092915050565b6000614a9782614c2a565b9150614aa283614c2a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ad757614ad6614d1b565b5b828201905092915050565b6000614aed82614c2a565b9150614af883614c2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3157614b30614d1b565b5b828202905092915050565b6000614b4782614bee565b9150614b5283614bee565b925082821015614b6557614b64614d1b565b5b828203905092915050565b6000614b7b82614c2a565b9150614b8683614c2a565b925082821015614b9957614b98614d1b565b5b828203905092915050565b6000614baf82614c0a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c61578082015181840152602081019050614c46565b83811115614c70576000848401525b50505050565b6000614c8182614c2a565b91506000821415614c9557614c94614d1b565b5b600182039050919050565b60006002820490506001821680614cb857607f821691505b60208210811415614ccc57614ccb614d4a565b5b50919050565b6000614cdd82614c2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d1057614d0f614d1b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614dc281614ba4565b8114614dcd57600080fd5b50565b614dd981614bb6565b8114614de457600080fd5b50565b614df081614bc2565b8114614dfb57600080fd5b50565b614e0781614c2a565b8114614e1257600080fd5b5056fea2646970667358221220a3ea1ae6ff35caf3ce3d02e358f13d433a93bb9b10178d4061316be7d76765cb64736f6c6343000800003368747470733a2f2f697066732e696f2f697066732f516d4e6f4b4a726b35664c62614731746158763173596e7576334150724d734d73394a5859615171466a54745855

Deployed Bytecode

0x6080604052600436106102515760003560e01c80636de9f32b11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461085c578063cd82737614610899578063d7224ba0146108c4578063dd764566146108ef578063e985e9c514610918578063f2fde38b1461095557610251565b8063a22cb465146107ae578063a31a13eb146107d7578063af27073e146107ee578063b88d4fde1461080a578063bab910621461083357610251565b80637a3f451e116100fd5780637a3f451e146106ed5780638da5cb5b1461071857806395d89b411461074357806396f8f6dd1461076e5780639c29391e1461078557610251565b80636de9f32b1461060857806370a0823114610633578063715018a614610670578063740d73f31461068757806377bf1411146106b057610251565b80632ad4bfab116101d25780634f6ccce7116101965780634f6ccce7146104e4578063528173a61461052157806355f804b31461054c578063571dff3b146105755780636352211e146105a05780636c0360eb146105dd57610251565b80632ad4bfab146104155780632f745c591461043e5780633ccfd60b1461047b5780633fd173661461049257806342842e0e146104bb57610251565b806311efbc971161021957806311efbc971461034f57806314fcdf491461037a57806318160ddd1461039657806318308a58146103c157806323b872dd146103ec57610251565b806301ffc9a714610256578063052939051461029357806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906138ae565b61097e565b60405161028a919061456e565b60405180910390f35b34801561029f57600080fd5b506102a8610ac8565b6040516102b5919061456e565b60405180910390f35b3480156102ca57600080fd5b506102d3610adb565b6040516102e09190614589565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613941565b610b6d565b60405161031d9190614507565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613831565b610bf2565b005b34801561035b57600080fd5b50610364610d0b565b604051610371919061492b565b60405180910390f35b610394600480360381019061038f9190613941565b610d11565b005b3480156103a257600080fd5b506103ab610f0f565b6040516103b8919061492b565b60405180910390f35b3480156103cd57600080fd5b506103d6610f18565b6040516103e3919061456e565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e919061372b565b610f2b565b005b34801561042157600080fd5b5061043c60048036038101906104379190613941565b610f3b565b005b34801561044a57600080fd5b5061046560048036038101906104609190613831565b610fc1565b604051610472919061492b565b60405180910390f35b34801561048757600080fd5b506104906111bf565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613941565b61127b565b005b3480156104c757600080fd5b506104e260048036038101906104dd919061372b565b611301565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613941565b611321565b604051610518919061492b565b60405180910390f35b34801561052d57600080fd5b50610536611374565b604051610543919061492b565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613900565b61137a565b005b34801561058157600080fd5b5061058a611410565b604051610597919061492b565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613941565b611416565b6040516105d49190614507565b60405180910390f35b3480156105e957600080fd5b506105f261142c565b6040516105ff9190614589565b60405180910390f35b34801561061457600080fd5b5061061d6114ba565b60405161062a919061492b565b60405180910390f35b34801561063f57600080fd5b5061065a600480360381019061065591906136c6565b6114c0565b604051610667919061492b565b60405180910390f35b34801561067c57600080fd5b506106856115a9565b005b34801561069357600080fd5b506106ae60048036038101906106a9919061386d565b6116e6565b005b3480156106bc57600080fd5b506106d760048036038101906106d291906136c6565b611820565b6040516106e4919061456e565b60405180910390f35b3480156106f957600080fd5b5061070261188a565b60405161070f919061492b565b60405180910390f35b34801561072457600080fd5b5061072d611890565b60405161073a9190614507565b60405180910390f35b34801561074f57600080fd5b506107586118ba565b6040516107659190614589565b60405180910390f35b34801561077a57600080fd5b5061078361194c565b005b34801561079157600080fd5b506107ac60048036038101906107a79190613941565b6119f4565b005b3480156107ba57600080fd5b506107d560048036038101906107d091906137f5565b611a7a565b005b3480156107e357600080fd5b506107ec611bfb565b005b61080860048036038101906108039190613941565b611ca3565b005b34801561081657600080fd5b50610831600480360381019061082c919061377a565b611f84565b005b34801561083f57600080fd5b5061085a60048036038101906108559190613941565b611fe0565b005b34801561086857600080fd5b50610883600480360381019061087e9190613941565b612066565b6040516108909190614589565b60405180910390f35b3480156108a557600080fd5b506108ae612103565b6040516108bb919061492b565b60405180910390f35b3480156108d057600080fd5b506108d9612109565b6040516108e6919061492b565b60405180910390f35b3480156108fb57600080fd5b5061091660048036038101906109119190613941565b61210f565b005b34801561092457600080fd5b5061093f600480360381019061093a91906136ef565b6121a8565b60405161094c919061456e565b60405180910390f35b34801561096157600080fd5b5061097c600480360381019061097791906136c6565b61223c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac15750610ac0826123e8565b5b9050919050565b600e60009054906101000a900460ff1681565b606060018054610aea90614ca0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1690614ca0565b8015610b635780601f10610b3857610100808354040283529160200191610b63565b820191906000526020600020905b815481529060010190602001808311610b4657829003601f168201915b5050505050905090565b6000610b7882612452565b610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906148eb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bfd82611416565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c65906147eb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c8d61245f565b73ffffffffffffffffffffffffffffffffffffffff161480610cbc5750610cbb81610cb661245f565b6121a8565b5b610cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf2906146cb565b60405180910390fd5b610d06838383612467565b505050565b600c5481565b600e60009054906101000a900460ff16610d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d579061462b565b60405180910390fd5b600081118015610d725750600b548111155b610d7b57600080fd5b600d5481601054610d8c9190614a8c565b1115610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc4906145cb565b60405180910390fd5b80600954610ddb9190614ae2565b341015610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e14906146ab565b60405180910390fd5b600b5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6b9190614a8c565b1115610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea3906147cb565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610efb9190614a8c565b92505081905550610f0c3382612519565b50565b60008054905090565b600e60019054906101000a900460ff1681565b610f36838383612537565b505050565b610f4361245f565b73ffffffffffffffffffffffffffffffffffffffff16610f61611890565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae9061472b565b60405180910390fd5b80600a8190555050565b6000610fcc836114c0565b821061100d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611004906145ab565b60405180910390fd5b6000611017610f0f565b905060008060005b8381101561117d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461111157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611169578684141561115a5781955050505050506111b9565b838061116590614cd2565b9450505b50808061117590614cd2565b91505061101f565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b0906148ab565b60405180910390fd5b92915050565b6111c761245f565b73ffffffffffffffffffffffffffffffffffffffff166111e5611890565b73ffffffffffffffffffffffffffffffffffffffff161461123b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112329061472b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061127957600080fd5b565b61128361245f565b73ffffffffffffffffffffffffffffffffffffffff166112a1611890565b73ffffffffffffffffffffffffffffffffffffffff16146112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee9061472b565b60405180910390fd5b8060098190555050565b61131c83838360405180602001604052806000815250611f84565b505050565b600061132b610f0f565b821061136c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113639061464b565b60405180910390fd5b819050919050565b600d5481565b61138261245f565b73ffffffffffffffffffffffffffffffffffffffff166113a0611890565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed9061472b565b60405180910390fd5b80600f908051906020019061140c92919061341a565b5050565b600b5481565b600061142182612af0565b600001519050919050565b600f805461143990614ca0565b80601f016020809104026020016040519081016040528092919081815260200182805461146590614ca0565b80156114b25780601f10611487576101008083540402835291602001916114b2565b820191906000526020600020905b81548152906001019060200180831161149557829003601f168201915b505050505081565b60105481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611528906146eb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6115b161245f565b73ffffffffffffffffffffffffffffffffffffffff166115cf611890565b73ffffffffffffffffffffffffffffffffffffffff1614611625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161c9061472b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116ee61245f565b73ffffffffffffffffffffffffffffffffffffffff1661170c611890565b73ffffffffffffffffffffffffffffffffffffffff1614611762576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117599061472b565b60405180910390fd5b60005b815181101561181c576001601260008484815181106117ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908315150217905550808061181490614cd2565b915050611765565b5050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16156118805760019050611885565b600090505b919050565b60095481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546118c990614ca0565b80601f01602080910402602001604051908101604052809291908181526020018280546118f590614ca0565b80156119425780601f1061191757610100808354040283529160200191611942565b820191906000526020600020905b81548152906001019060200180831161192557829003601f168201915b5050505050905090565b61195461245f565b73ffffffffffffffffffffffffffffffffffffffff16611972611890565b73ffffffffffffffffffffffffffffffffffffffff16146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061472b565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6119fc61245f565b73ffffffffffffffffffffffffffffffffffffffff16611a1a611890565b73ffffffffffffffffffffffffffffffffffffffff1614611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a679061472b565b60405180910390fd5b80600c8190555050565b611a8261245f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061476b565b60405180910390fd5b8060066000611afd61245f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611baa61245f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bef919061456e565b60405180910390a35050565b611c0361245f565b73ffffffffffffffffffffffffffffffffffffffff16611c21611890565b73ffffffffffffffffffffffffffffffffffffffff1614611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e9061472b565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600e60019054906101000a900460ff16611cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce99061468b565b60405180910390fd5b60011515601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16151514611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7f9061484b565b60405180910390fd5b600081118015611da75750600d5481601054611da49190614a8c565b11155b611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd9061488b565b60405180910390fd5b600c5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611e379190614a8c565b1115611e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6f906147ab565b60405180910390fd5b80600a54611e869190614ae2565b341015611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf906146ab565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f179190614a8c565b9250508190555080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254611f709190614a8c565b92505081905550611f813382612519565b50565b611f8f848484612537565b611f9b84848484612cf3565b611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd19061480b565b60405180910390fd5b50505050565b611fe861245f565b73ffffffffffffffffffffffffffffffffffffffff16612006611890565b73ffffffffffffffffffffffffffffffffffffffff161461205c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120539061472b565b60405180910390fd5b80600b8190555050565b606061207182612452565b6120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a79061474b565b60405180910390fd5b60006120ba612e8a565b905060008151116120da57604051806020016040528060008152506120fb565b806040516020016120eb91906144f0565b6040516020818303038152906040525b915050919050565b600a5481565b60075481565b61211761245f565b73ffffffffffffffffffffffffffffffffffffffff16612135611890565b73ffffffffffffffffffffffffffffffffffffffff161461218b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121829061472b565b60405180910390fd5b612193610f0f565b811161219e57600080fd5b80600d8190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61224461245f565b73ffffffffffffffffffffffffffffffffffffffff16612262611890565b73ffffffffffffffffffffffffffffffffffffffff16146122b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122af9061472b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231f906145eb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612533828260405180602001604052806000815250612f1c565b5050565b600061254282612af0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661256961245f565b73ffffffffffffffffffffffffffffffffffffffff1614806125c5575061258e61245f565b73ffffffffffffffffffffffffffffffffffffffff166125ad84610b6d565b73ffffffffffffffffffffffffffffffffffffffff16145b806125e157506125e082600001516125db61245f565b6121a8565b5b905080612623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261a9061478b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268c9061470b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc9061466b565b60405180910390fd5b61271285858560016133fb565b6127226000848460000151612467565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166127909190614b3c565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128349190614a46565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461293a9190614a8c565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a80576129b081612452565b15612a7f576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ae88686866001613401565b505050505050565b612af86134a0565b612b0182612452565b612b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b379061460b565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000188310612ba45760017f000000000000000000000000000000000000000000000000000000000000001884612b979190614b70565b612ba19190614a8c565b90505b60008390505b818110612cb2576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c9e57809350505050612cee565b508080612caa90614c76565b915050612baa565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce5906148cb565b60405180910390fd5b919050565b6000612d148473ffffffffffffffffffffffffffffffffffffffff16613407565b15612e7d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d3d61245f565b8786866040518563ffffffff1660e01b8152600401612d5f9493929190614522565b602060405180830381600087803b158015612d7957600080fd5b505af1925050508015612daa57506040513d601f19601f82011682018060405250810190612da791906138d7565b60015b612e2d573d8060008114612dda576040519150601f19603f3d011682016040523d82523d6000602084013e612ddf565b606091505b50600081511415612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c9061480b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e82565b600190505b949350505050565b6060600f8054612e9990614ca0565b80601f0160208091040260200160405190810160405280929190818152602001828054612ec590614ca0565b8015612f125780601f10612ee757610100808354040283529160200191612f12565b820191906000526020600020905b815481529060010190602001808311612ef557829003601f168201915b5050505050905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f899061486b565b60405180910390fd5b612f9b81612452565b15612fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd29061482b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000001883111561303e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130359061490b565b60405180910390fd5b61304b60008583866133fb565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516131489190614a46565b6fffffffffffffffffffffffffffffffff16815260200185836020015161316f9190614a46565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156133de57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461337e6000888488612cf3565b6133bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b49061480b565b60405180910390fd5b81806133c890614cd2565b92505080806133d690614cd2565b91505061330d565b50806000819055506133f36000878588613401565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b82805461342690614ca0565b90600052602060002090601f016020900481019282613448576000855561348f565b82601f1061346157805160ff191683800117855561348f565b8280016001018555821561348f579182015b8281111561348e578251825591602001919060010190613473565b5b50905061349c91906134da565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156134f35760008160009055506001016134db565b5090565b600061350a61350584614977565b614946565b9050808382526020820190508285602086028201111561352957600080fd5b60005b85811015613559578161353f88826135df565b84526020840193506020830192505060018101905061352c565b5050509392505050565b6000613576613571846149a3565b614946565b90508281526020810184848401111561358e57600080fd5b613599848285614c34565b509392505050565b60006135b46135af846149d3565b614946565b9050828152602081018484840111156135cc57600080fd5b6135d7848285614c34565b509392505050565b6000813590506135ee81614db9565b92915050565b600082601f83011261360557600080fd5b81356136158482602086016134f7565b91505092915050565b60008135905061362d81614dd0565b92915050565b60008135905061364281614de7565b92915050565b60008151905061365781614de7565b92915050565b600082601f83011261366e57600080fd5b813561367e848260208601613563565b91505092915050565b600082601f83011261369857600080fd5b81356136a88482602086016135a1565b91505092915050565b6000813590506136c081614dfe565b92915050565b6000602082840312156136d857600080fd5b60006136e6848285016135df565b91505092915050565b6000806040838503121561370257600080fd5b6000613710858286016135df565b9250506020613721858286016135df565b9150509250929050565b60008060006060848603121561374057600080fd5b600061374e868287016135df565b935050602061375f868287016135df565b9250506040613770868287016136b1565b9150509250925092565b6000806000806080858703121561379057600080fd5b600061379e878288016135df565b94505060206137af878288016135df565b93505060406137c0878288016136b1565b925050606085013567ffffffffffffffff8111156137dd57600080fd5b6137e98782880161365d565b91505092959194509250565b6000806040838503121561380857600080fd5b6000613816858286016135df565b92505060206138278582860161361e565b9150509250929050565b6000806040838503121561384457600080fd5b6000613852858286016135df565b9250506020613863858286016136b1565b9150509250929050565b60006020828403121561387f57600080fd5b600082013567ffffffffffffffff81111561389957600080fd5b6138a5848285016135f4565b91505092915050565b6000602082840312156138c057600080fd5b60006138ce84828501613633565b91505092915050565b6000602082840312156138e957600080fd5b60006138f784828501613648565b91505092915050565b60006020828403121561391257600080fd5b600082013567ffffffffffffffff81111561392c57600080fd5b61393884828501613687565b91505092915050565b60006020828403121561395357600080fd5b6000613961848285016136b1565b91505092915050565b61397381614ba4565b82525050565b61398281614bb6565b82525050565b600061399382614a03565b61399d8185614a19565b93506139ad818560208601614c43565b6139b681614da8565b840191505092915050565b60006139cc82614a0e565b6139d68185614a2a565b93506139e6818560208601614c43565b6139ef81614da8565b840191505092915050565b6000613a0582614a0e565b613a0f8185614a3b565b9350613a1f818560208601614c43565b80840191505092915050565b6000613a38602283614a2a565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a9e602b83614a2a565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66207469636b6574730000000000000000000000000000000000000000006020830152604082019050919050565b6000613b04602683614a2a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b6a602a83614a2a565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bd0603383614a2a565b91507f506c65617365207761697420756e74696c20746865205075626c69632073616c60008301527f652069732061637469766520746f206d696e74000000000000000000000000006020830152604082019050919050565b6000613c36602383614a2a565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9c602583614a2a565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d02602883614a2a565b91507f506c65617365207761697420756e74696c20746865205072654d696e7420686160008301527f7320626567756e210000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d68603283614a2a565b91507f4554482076616c75652073656e7420697320746f6f206c6974746c6520666f7260008301527f2074686973206d616e79207469636b65747300000000000000000000000000006020830152604082019050919050565b6000613dce603983614a2a565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613e34602b83614a2a565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000613e9a602683614a2a565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f00602083614a2a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613f40602f83614a2a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613fa6601a83614a2a565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000613fe6603283614a2a565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061404c603383614a2a565b91507f546869732057616c6c65742068617320616c7265616479206d696e746564206960008301527f7473207265736572766564207469636b657473000000000000000000000000006020830152604082019050919050565b60006140b2602483614a2a565b91507f7468697320776f756c6420657863656564206d696e74206d617820616c6c6f7760008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614118602283614a2a565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061417e603383614a2a565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006141e4601d83614a2a565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b6000614224602883614a2a565b91507f546869732057616c6c6574206973206e6f742061626c65206d696e7420666f7260008301527f2070726573616c650000000000000000000000000000000000000000000000006020830152604082019050919050565b600061428a602183614a2a565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142f0603383614a2a565b91507f507572636861736520776f756c64206578636565642063757272656e74206d6160008301527f7820737570706c79206f66207469636b657473000000000000000000000000006020830152604082019050919050565b6000614356602e83614a2a565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006143bc602f83614a2a565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614422602d83614a2a565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614488602283614a2a565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6144ea81614c2a565b82525050565b60006144fc82846139fa565b915081905092915050565b600060208201905061451c600083018461396a565b92915050565b6000608082019050614537600083018761396a565b614544602083018661396a565b61455160408301856144e1565b81810360608301526145638184613988565b905095945050505050565b60006020820190506145836000830184613979565b92915050565b600060208201905081810360008301526145a381846139c1565b905092915050565b600060208201905081810360008301526145c481613a2b565b9050919050565b600060208201905081810360008301526145e481613a91565b9050919050565b6000602082019050818103600083015261460481613af7565b9050919050565b6000602082019050818103600083015261462481613b5d565b9050919050565b6000602082019050818103600083015261464481613bc3565b9050919050565b6000602082019050818103600083015261466481613c29565b9050919050565b6000602082019050818103600083015261468481613c8f565b9050919050565b600060208201905081810360008301526146a481613cf5565b9050919050565b600060208201905081810360008301526146c481613d5b565b9050919050565b600060208201905081810360008301526146e481613dc1565b9050919050565b6000602082019050818103600083015261470481613e27565b9050919050565b6000602082019050818103600083015261472481613e8d565b9050919050565b6000602082019050818103600083015261474481613ef3565b9050919050565b6000602082019050818103600083015261476481613f33565b9050919050565b6000602082019050818103600083015261478481613f99565b9050919050565b600060208201905081810360008301526147a481613fd9565b9050919050565b600060208201905081810360008301526147c48161403f565b9050919050565b600060208201905081810360008301526147e4816140a5565b9050919050565b600060208201905081810360008301526148048161410b565b9050919050565b6000602082019050818103600083015261482481614171565b9050919050565b60006020820190508181036000830152614844816141d7565b9050919050565b6000602082019050818103600083015261486481614217565b9050919050565b600060208201905081810360008301526148848161427d565b9050919050565b600060208201905081810360008301526148a4816142e3565b9050919050565b600060208201905081810360008301526148c481614349565b9050919050565b600060208201905081810360008301526148e4816143af565b9050919050565b6000602082019050818103600083015261490481614415565b9050919050565b600060208201905081810360008301526149248161447b565b9050919050565b600060208201905061494060008301846144e1565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561496d5761496c614d79565b5b8060405250919050565b600067ffffffffffffffff82111561499257614991614d79565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149be576149bd614d79565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156149ee576149ed614d79565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a5182614bee565b9150614a5c83614bee565b9250826fffffffffffffffffffffffffffffffff03821115614a8157614a80614d1b565b5b828201905092915050565b6000614a9782614c2a565b9150614aa283614c2a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ad757614ad6614d1b565b5b828201905092915050565b6000614aed82614c2a565b9150614af883614c2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3157614b30614d1b565b5b828202905092915050565b6000614b4782614bee565b9150614b5283614bee565b925082821015614b6557614b64614d1b565b5b828203905092915050565b6000614b7b82614c2a565b9150614b8683614c2a565b925082821015614b9957614b98614d1b565b5b828203905092915050565b6000614baf82614c0a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c61578082015181840152602081019050614c46565b83811115614c70576000848401525b50505050565b6000614c8182614c2a565b91506000821415614c9557614c94614d1b565b5b600182039050919050565b60006002820490506001821680614cb857607f821691505b60208210811415614ccc57614ccb614d4a565b5b50919050565b6000614cdd82614c2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d1057614d0f614d1b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614dc281614ba4565b8114614dcd57600080fd5b50565b614dd981614bb6565b8114614de457600080fd5b50565b614df081614bc2565b8114614dfb57600080fd5b50565b614e0781614c2a565b8114614e1257600080fd5b5056fea2646970667358221220a3ea1ae6ff35caf3ce3d02e358f13d433a93bb9b10178d4061316be7d76765cb64736f6c63430008000033

Deployed Bytecode Sourcemap

42519:11208:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28579:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42762:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30540:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32215:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31736:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42691:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51946:692;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26935:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42803:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33242:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53043:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27643:864;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50795:108;;;;;;;;;;;;;:::i;:::-;;52868:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33475:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27112:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42730:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52762:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42653:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30349:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42846:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42946:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29065:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5263:148;;;;;;;;;;;;;:::i;:::-;;50573:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50335:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42567:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4612:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30709:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50911:93;;;;;;;;;;;;;:::i;:::-;;53581:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32579:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51012:101;;;;;;;;;;;;;:::i;:::-;;51121:817;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33723:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53446:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30884:448;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42617:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38604:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53226:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32961;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5566:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28579:422;28726:4;28783:25;28768:40;;;:11;:40;;;;:105;;;;28840:33;28825:48;;;:11;:48;;;;28768:105;:172;;;;28905:35;28890:50;;;:11;:50;;;;28768:172;:225;;;;28957:36;28981:11;28957:23;:36::i;:::-;28768:225;28748:245;;28579:422;;;:::o;42762:34::-;;;;;;;;;;;;;:::o;30540:100::-;30594:13;30627:5;30620:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30540:100;:::o;32215:292::-;32319:7;32366:16;32374:7;32366;:16::i;:::-;32344:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32475:15;:24;32491:7;32475:24;;;;;;;;;;;;;;;;;;;;;32468:31;;32215:292;;;:::o;31736:413::-;31809:13;31825:24;31841:7;31825:15;:24::i;:::-;31809:40;;31874:5;31868:11;;:2;:11;;;;31860:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31969:5;31953:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31978:37;31995:5;32002:12;:10;:12::i;:::-;31978:16;:37::i;:::-;31953:62;31931:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;32113:28;32122:2;32126:7;32135:5;32113:8;:28::i;:::-;31736:413;;;:::o;42691:32::-;;;;:::o;51946:692::-;52024:14;;;;;;;;;;;52016:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;52130:1;52113:14;:18;:54;;;;;52153:14;;52135;:32;;52113:54;52105:63;;;;;;52220:6;;52202:14;52187:12;;:29;;;;:::i;:::-;:39;;52179:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;52317:14;52306:8;;:25;;;;:::i;:::-;52293:9;:38;;52285:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;52462:14;;52441;52407:19;:31;52427:10;52407:31;;;;;;;;;;;;;;;;:48;;;;:::i;:::-;52405:71;;52397:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;52566:14;52531:19;:31;52551:10;52531:31;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;52593:37;52603:10;52615:14;52593:9;:37::i;:::-;51946:692;:::o;26935:100::-;26988:7;27015:12;;27008:19;;26935:100;:::o;42803:36::-;;;;;;;;;;;;;:::o;33242:162::-;33368:28;33378:4;33384:2;33388:7;33368:9;:28::i;:::-;33242:162;;;:::o;53043:177::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53202:10:::1;53189;:23;;;;53043:177:::0;:::o;27643:864::-;27768:7;27809:16;27819:5;27809:9;:16::i;:::-;27801:5;:24;27793:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27875:22;27900:13;:11;:13::i;:::-;27875:38;;27924:19;27958:25;28012:9;28007:426;28031:14;28027:1;:18;28007:426;;;28067:31;28101:11;:14;28113:1;28101:14;;;;;;;;;;;28067:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28160:1;28134:28;;:9;:14;;;:28;;;28130:103;;28203:9;:14;;;28183:34;;28130:103;28272:5;28251:26;;:17;:26;;;28247:175;;;28317:5;28302:11;:20;28298:77;;;28354:1;28347:8;;;;;;;;;28298:77;28393:13;;;;;:::i;:::-;;;;28247:175;28007:426;28047:3;;;;;:::i;:::-;;;;28007:426;;;;28443:56;;;;;;;;;;:::i;:::-;;;;;;;;27643:864;;;;;:::o;50795:108::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50855:10:::1;50847:24;;:47;50872:21;50847:47;;;;;;;;;;;;;;;;;;;;;;;50839:56;;;::::0;::::1;;50795:108::o:0;52868:169::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53021:8:::1;53010;:19;;;;52868:169:::0;:::o;33475:177::-;33605:39;33622:4;33628:2;33632:7;33605:39;;;;;;;;;;;;:16;:39::i;:::-;33475:177;;;:::o;27112:228::-;27215:7;27256:13;:11;:13::i;:::-;27248:5;:21;27240:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;27327:5;27320:12;;27112:228;;;:::o;42730:25::-;;;;:::o;52762:100::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52844:10:::1;52834:7;:20;;;;;;;;;;;;:::i;:::-;;52762:100:::0;:::o;42653:31::-;;;;:::o;30349:124::-;30413:7;30440:20;30452:7;30440:11;:20::i;:::-;:25;;;30433:32;;30349:124;;;:::o;42846:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42946:31::-;;;;:::o;29065:258::-;29129:7;29188:1;29171:19;;:5;:19;;;;29149:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;29287:12;:19;29300:5;29287:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29279:36;;29272:43;;29065:258;;;:::o;5263:148::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5370:1:::1;5333:40;;5354:6;;;;;;;;;;;5333:40;;;;;;;;;;;;5401:1;5384:6;;:19;;;;;;;;;;;;;;;;;;5263:148::o:0;50573:214::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50662:9:::1;50657:115;50679:13;:20;50677:1;:22;50657:115;;;50756:4;50719:9;:27;50729:13;50743:1;50729:16;;;;;;;;;;;;;;;;;;;;;;50719:27;;;;;;;;;;;;;;;:34;;;:41;;;;;;;;;;;;;;;;;;50700:3;;;;;:::i;:::-;;;;50657:115;;;;50573:214:::0;:::o;50335:230::-;50412:4;50438:9;:21;50448:10;50438:21;;;;;;;;;;;;;;;:28;;;;;;;;;;;;50434:124;;;50489:4;50482:11;;;;50434:124;50541:5;50534:12;;50335:230;;;;:::o;42567:43::-;;;;:::o;4612:87::-;4658:7;4685:6;;;;;;;;;;;4678:13;;4612:87;:::o;30709:104::-;30765:13;30798:7;30791:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30709:104;:::o;50911:93::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50982:14:::1;;;;;;;;;;;50981:15;50964:14;;:32;;;;;;;;;;;;;;;;;;50911:93::o:0;53581:137::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53691:19:::1;53672:16;:38;;;;53581:137:::0;:::o;32579:311::-;32709:12;:10;:12::i;:::-;32697:24;;:8;:24;;;;32689:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32810:8;32765:18;:32;32784:12;:10;:12::i;:::-;32765:32;;;;;;;;;;;;;;;:42;32798:8;32765:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32863:8;32834:48;;32849:12;:10;:12::i;:::-;32834:48;;;32873:8;32834:48;;;;;;:::i;:::-;;;;;;;;32579:311;;:::o;51012:101::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51088:17:::1;;;;;;;;;;;51087:18;51067:17;;:38;;;;;;;;;;;;;;;;;;51012:101::o:0;51121:817::-;51199:17;;;;;;;;;;;51191:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51312:4;51280:36;;:9;:21;51290:10;51280:21;;;;;;;;;;;;;;;:28;;;;;;;;;;;;:36;;;51272:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;51398:1;51381:14;:18;:61;;;;;51436:6;;51418:14;51403:12;;:29;;;;:::i;:::-;:39;;51381:61;51373:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;51572:16;;51554:14;51517:9;:21;51527:10;51517:21;;;;;;;;;;;;;;;:34;;;:51;;;;:::i;:::-;:71;;51509:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;51688:14;51675:10;;:27;;;;:::i;:::-;51662:9;:40;;51654:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51803:14;51768:19;:31;51788:10;51768:31;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;51866:14;51828:9;:21;51838:10;51828:21;;;;;;;;;;;;;;;:34;;;:52;;;;;;;:::i;:::-;;;;;;;;51893:37;51903:10;51915:14;51893:9;:37::i;:::-;51121:817;:::o;33723:355::-;33882:28;33892:4;33898:2;33902:7;33882:9;:28::i;:::-;33943:48;33966:4;33972:2;33976:7;33985:5;33943:22;:48::i;:::-;33921:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;33723:355;;;;:::o;53446:129::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53550:17:::1;53533:14;:34;;;;53446:129:::0;:::o;30884:448::-;31002:13;31055:16;31063:7;31055;:16::i;:::-;31033:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;31159:21;31183:10;:8;:10::i;:::-;31159:34;;31248:1;31230:7;31224:21;:25;:100;;;;;;;;;;;;;;;;;31293:7;31276:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;31224:100;31204:120;;;30884:448;;;:::o;42617:29::-;;;;:::o;38604:43::-;;;;:::o;53226:214::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53389:13:::1;:11;:13::i;:::-;53377:9;:25;53369:34;;;::::0;::::1;;53423:9;53414:6;:18;;;;53226:214:::0;:::o;32961:::-;33103:4;33132:18;:25;33151:5;33132:25;;;;;;;;;;;;;;;:35;33158:8;33132:35;;;;;;;;;;;;;;;;;;;;;;;;;33125:42;;32961:214;;;;:::o;5566:244::-;4843:12;:10;:12::i;:::-;4832:23;;:7;:5;:7::i;:::-;:23;;;4824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5675:1:::1;5655:22;;:8;:22;;;;5647:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5765:8;5736:38;;5757:6;;;;;;;;;;;5736:38;;;;;;;;;;;;5794:8;5785:6;;:17;;;;;;;;;;;;;;;;;;5566:244:::0;:::o;24353:157::-;24438:4;24477:25;24462:40;;;:11;:40;;;;24455:47;;24353:157;;;:::o;34333:111::-;34390:4;34424:12;;34414:7;:22;34407:29;;34333:111;;;:::o;601:98::-;654:7;681:10;674:17;;601:98;:::o;38400:196::-;38542:2;38515:15;:24;38531:7;38515:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38580:7;38576:2;38560:28;;38569:5;38560:28;;;;;;;;;;;;38400:196;;;:::o;34452:104::-;34521:27;34531:2;34535:8;34521:27;;;;;;;;;;;;:9;:27::i;:::-;34452:104;;:::o;36573:1709::-;36688:35;36726:20;36738:7;36726:11;:20::i;:::-;36688:58;;36759:22;36801:13;:18;;;36785:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;36860:12;:10;:12::i;:::-;36836:36;;:20;36848:7;36836:11;:20::i;:::-;:36;;;36785:87;:154;;;;36889:50;36906:13;:18;;;36926:12;:10;:12::i;:::-;36889:16;:50::i;:::-;36785:154;36759:181;;36975:17;36953:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37127:4;37105:26;;:13;:18;;;:26;;;37083:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;37230:1;37216:16;;:2;:16;;;;37208:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37287:43;37309:4;37315:2;37319:7;37328:1;37287:21;:43::i;:::-;37395:49;37412:1;37416:7;37425:13;:18;;;37395:8;:49::i;:::-;37487:1;37457:12;:18;37470:4;37457:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37527:1;37499:12;:16;37512:2;37499:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37562:43;;;;;;;;37577:2;37562:43;;;;;;37588:15;37562:43;;;;;37539:11;:20;37551:7;37539:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37845:19;37877:1;37867:7;:11;;;;:::i;:::-;37845:33;;37934:1;37893:43;;:11;:24;37905:11;37893:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37889:288;;;37957:20;37965:11;37957:7;:20::i;:::-;37953:213;;;38025:125;;;;;;;;38062:13;:18;;;38025:125;;;;;;38103:13;:28;;;38025:125;;;;;37998:11;:24;38010:11;37998:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37953:213;37889:288;38213:7;38209:2;38194:27;;38203:4;38194:27;;;;;;;;;;;;38232:42;38253:4;38259:2;38263:7;38272:1;38232:20;:42::i;:::-;36573:1709;;;;;;:::o;29605:682::-;29693:21;;:::i;:::-;29740:16;29748:7;29740;:16::i;:::-;29732:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29816:26;29868:12;29857:7;:23;29853:103;;29943:1;29928:12;29918:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;29897:47;;29853:103;29973:12;29988:7;29973:22;;29968:242;30005:18;29997:4;:26;29968:242;;30048:31;30082:11;:17;30094:4;30082:17;;;;;;;;;;;30048:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30144:1;30118:28;;:9;:14;;;:28;;;30114:85;;30174:9;30167:16;;;;;;;30114:85;29968:242;30025:6;;;;;:::i;:::-;;;;29968:242;;;;30222:57;;;;;;;;;;:::i;:::-;;;;;;;;29605:682;;;;:::o;40275:985::-;40430:4;40451:15;:2;:13;;;:15::i;:::-;40447:806;;;40520:2;40504:36;;;40563:12;:10;:12::i;:::-;40598:4;40625:7;40655:5;40504:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40483:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40883:1;40866:6;:13;:18;40862:321;;;40909:109;;;;;;;;;;:::i;:::-;;;;;;;;40862:321;41133:6;41127:13;41118:6;41114:2;41110:15;41103:38;40483:715;40753:45;;;40743:55;;;:6;:55;;;;40736:62;;;;;40447:806;41237:4;41230:11;;40275:985;;;;;;;:::o;52646:108::-;52706:13;52739:7;52732:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52646:108;:::o;34919:1400::-;35042:20;35065:12;;35042:35;;35110:1;35096:16;;:2;:16;;;;35088:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35295:21;35303:12;35295:7;:21::i;:::-;35294:22;35286:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35381:12;35369:8;:24;;35361:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35445:61;35475:1;35479:2;35483:12;35497:8;35445:21;:61::i;:::-;35519:30;35552:12;:16;35565:2;35552:16;;;;;;;;;;;;;;;35519:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35598:135;;;;;;;;35654:8;35624:11;:19;;;:39;;;;:::i;:::-;35598:135;;;;;;35713:8;35678:11;:24;;;:44;;;;:::i;:::-;35598:135;;;;;35579:12;:16;35592:2;35579:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35772:43;;;;;;;;35787:2;35772:43;;;;;;35798:15;35772:43;;;;;35744:11;:25;35756:12;35744:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35828:20;35851:12;35828:35;;35881:9;35876:325;35900:8;35896:1;:12;35876:325;;;35960:12;35956:2;35935:38;;35952:1;35935:38;;;;;;;;;;;;36014:59;36045:1;36049:2;36053:12;36067:5;36014:22;:59::i;:::-;35988:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;36175:14;;;;;:::i;:::-;;;;35910:3;;;;;:::i;:::-;;;;35876:325;;;;36228:12;36213;:27;;;;36251:60;36280:1;36284:2;36288:12;36302:8;36251:20;:60::i;:::-;34919:1400;;;;;;:::o;41748:159::-;;;;;:::o;42319:158::-;;;;;:::o;14355:422::-;14415:4;14623:12;14734:7;14722:20;14714:28;;14768:1;14761:4;:8;14754:15;;;14355:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:262::-;;3086:2;3074:9;3065:7;3061:23;3057:32;3054:2;;;3102:1;3099;3092:12;3054:2;3145:1;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3116:117;3044:196;;;;:::o;3246:407::-;;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3387:1;3384;3377:12;3339:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3557:2;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3528:118;3329:324;;;;;:::o;3659:552::-;;;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3987:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3958:118;4115:2;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4086:118;3759:452;;;;;:::o;4217:809::-;;;;;4385:3;4373:9;4364:7;4360:23;4356:33;4353:2;;;4402:1;4399;4392:12;4353:2;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4856:2;4845:9;4841:18;4828:32;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4799:220;4343:683;;;;;;;:::o;5032:401::-;;;5154:2;5142:9;5133:7;5129:23;5125:32;5122:2;;;5170:1;5167;5160:12;5122:2;5213:1;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5184:117;5340:2;5366:50;5408:7;5399:6;5388:9;5384:22;5366:50;:::i;:::-;5356:60;;5311:115;5112:321;;;;;:::o;5439:407::-;;;5564:2;5552:9;5543:7;5539:23;5535:32;5532:2;;;5580:1;5577;5570:12;5532:2;5623:1;5648:53;5693:7;5684:6;5673:9;5669:22;5648:53;:::i;:::-;5638:63;;5594:117;5750:2;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5721:118;5522:324;;;;;:::o;5852:405::-;;5985:2;5973:9;5964:7;5960:23;5956:32;5953:2;;;6001:1;5998;5991:12;5953:2;6072:1;6061:9;6057:17;6044:31;6102:18;6094:6;6091:30;6088:2;;;6134:1;6131;6124:12;6088:2;6162:78;6232:7;6223:6;6212:9;6208:22;6162:78;:::i;:::-;6152:88;;6015:235;5943:314;;;;:::o;6263:260::-;;6370:2;6358:9;6349:7;6345:23;6341:32;6338:2;;;6386:1;6383;6376:12;6338:2;6429:1;6454:52;6498:7;6489:6;6478:9;6474:22;6454:52;:::i;:::-;6444:62;;6400:116;6328:195;;;;:::o;6529:282::-;;6647:2;6635:9;6626:7;6622:23;6618:32;6615:2;;;6663:1;6660;6653:12;6615:2;6706:1;6731:63;6786:7;6777:6;6766:9;6762:22;6731:63;:::i;:::-;6721:73;;6677:127;6605:206;;;;:::o;6817:375::-;;6935:2;6923:9;6914:7;6910:23;6906:32;6903:2;;;6951:1;6948;6941:12;6903:2;7022:1;7011:9;7007:17;6994:31;7052:18;7044:6;7041:30;7038:2;;;7084:1;7081;7074:12;7038:2;7112:63;7167:7;7158:6;7147:9;7143:22;7112:63;:::i;:::-;7102:73;;6965:220;6893:299;;;;:::o;7198:262::-;;7306:2;7294:9;7285:7;7281:23;7277:32;7274:2;;;7322:1;7319;7312:12;7274:2;7365:1;7390:53;7435:7;7426:6;7415:9;7411:22;7390:53;:::i;:::-;7380:63;;7336:117;7264:196;;;;:::o;7466:118::-;7553:24;7571:5;7553:24;:::i;:::-;7548:3;7541:37;7531:53;;:::o;7590:109::-;7671:21;7686:5;7671:21;:::i;:::-;7666:3;7659:34;7649:50;;:::o;7705:360::-;;7819:38;7851:5;7819:38;:::i;:::-;7873:70;7936:6;7931:3;7873:70;:::i;:::-;7866:77;;7952:52;7997:6;7992:3;7985:4;7978:5;7974:16;7952:52;:::i;:::-;8029:29;8051:6;8029:29;:::i;:::-;8024:3;8020:39;8013:46;;7795:270;;;;;:::o;8071:364::-;;8187:39;8220:5;8187:39;:::i;:::-;8242:71;8306:6;8301:3;8242:71;:::i;:::-;8235:78;;8322:52;8367:6;8362:3;8355:4;8348:5;8344:16;8322:52;:::i;:::-;8399:29;8421:6;8399:29;:::i;:::-;8394:3;8390:39;8383:46;;8163:272;;;;;:::o;8441:377::-;;8575:39;8608:5;8575:39;:::i;:::-;8630:89;8712:6;8707:3;8630:89;:::i;:::-;8623:96;;8728:52;8773:6;8768:3;8761:4;8754:5;8750:16;8728:52;:::i;:::-;8805:6;8800:3;8796:16;8789:23;;8551:267;;;;;:::o;8824:366::-;;8987:67;9051:2;9046:3;8987:67;:::i;:::-;8980:74;;9084:34;9080:1;9075:3;9071:11;9064:55;9150:4;9145:2;9140:3;9136:12;9129:26;9181:2;9176:3;9172:12;9165:19;;8970:220;;;:::o;9196:375::-;;9359:67;9423:2;9418:3;9359:67;:::i;:::-;9352:74;;9456:34;9452:1;9447:3;9443:11;9436:55;9522:13;9517:2;9512:3;9508:12;9501:35;9562:2;9557:3;9553:12;9546:19;;9342:229;;;:::o;9577:370::-;;9740:67;9804:2;9799:3;9740:67;:::i;:::-;9733:74;;9837:34;9833:1;9828:3;9824:11;9817:55;9903:8;9898:2;9893:3;9889:12;9882:30;9938:2;9933:3;9929:12;9922:19;;9723:224;;;:::o;9953:374::-;;10116:67;10180:2;10175:3;10116:67;:::i;:::-;10109:74;;10213:34;10209:1;10204:3;10200:11;10193:55;10279:12;10274:2;10269:3;10265:12;10258:34;10318:2;10313:3;10309:12;10302:19;;10099:228;;;:::o;10333:383::-;;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10593:34;10589:1;10584:3;10580:11;10573:55;10659:21;10654:2;10649:3;10645:12;10638:43;10707:2;10702:3;10698:12;10691:19;;10479:237;;;:::o;10722:367::-;;10885:67;10949:2;10944:3;10885:67;:::i;:::-;10878:74;;10982:34;10978:1;10973:3;10969:11;10962:55;11048:5;11043:2;11038:3;11034:12;11027:27;11080:2;11075:3;11071:12;11064:19;;10868:221;;;:::o;11095:369::-;;11258:67;11322:2;11317:3;11258:67;:::i;:::-;11251:74;;11355:34;11351:1;11346:3;11342:11;11335:55;11421:7;11416:2;11411:3;11407:12;11400:29;11455:2;11450:3;11446:12;11439:19;;11241:223;;;:::o;11470:372::-;;11633:67;11697:2;11692:3;11633:67;:::i;:::-;11626:74;;11730:34;11726:1;11721:3;11717:11;11710:55;11796:10;11791:2;11786:3;11782:12;11775:32;11833:2;11828:3;11824:12;11817:19;;11616:226;;;:::o;11848:382::-;;12011:67;12075:2;12070:3;12011:67;:::i;:::-;12004:74;;12108:34;12104:1;12099:3;12095:11;12088:55;12174:20;12169:2;12164:3;12160:12;12153:42;12221:2;12216:3;12212:12;12205:19;;11994:236;;;:::o;12236:389::-;;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12496:34;12492:1;12487:3;12483:11;12476:55;12562:27;12557:2;12552:3;12548:12;12541:49;12616:2;12611:3;12607:12;12600:19;;12382:243;;;:::o;12631:375::-;;12794:67;12858:2;12853:3;12794:67;:::i;:::-;12787:74;;12891:34;12887:1;12882:3;12878:11;12871:55;12957:13;12952:2;12947:3;12943:12;12936:35;12997:2;12992:3;12988:12;12981:19;;12777:229;;;:::o;13012:370::-;;13175:67;13239:2;13234:3;13175:67;:::i;:::-;13168:74;;13272:34;13268:1;13263:3;13259:11;13252:55;13338:8;13333:2;13328:3;13324:12;13317:30;13373:2;13368:3;13364:12;13357:19;;13158:224;;;:::o;13388:330::-;;13551:67;13615:2;13610:3;13551:67;:::i;:::-;13544:74;;13648:34;13644:1;13639:3;13635:11;13628:55;13709:2;13704:3;13700:12;13693:19;;13534:184;;;:::o;13724:379::-;;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13984:34;13980:1;13975:3;13971:11;13964:55;14050:17;14045:2;14040:3;14036:12;14029:39;14094:2;14089:3;14085:12;14078:19;;13870:233;;;:::o;14109:324::-;;14272:67;14336:2;14331:3;14272:67;:::i;:::-;14265:74;;14369:28;14365:1;14360:3;14356:11;14349:49;14424:2;14419:3;14415:12;14408:19;;14255:178;;;:::o;14439:382::-;;14602:67;14666:2;14661:3;14602:67;:::i;:::-;14595:74;;14699:34;14695:1;14690:3;14686:11;14679:55;14765:20;14760:2;14755:3;14751:12;14744:42;14812:2;14807:3;14803:12;14796:19;;14585:236;;;:::o;14827:383::-;;14990:67;15054:2;15049:3;14990:67;:::i;:::-;14983:74;;15087:34;15083:1;15078:3;15074:11;15067:55;15153:21;15148:2;15143:3;15139:12;15132:43;15201:2;15196:3;15192:12;15185:19;;14973:237;;;:::o;15216:368::-;;15379:67;15443:2;15438:3;15379:67;:::i;:::-;15372:74;;15476:34;15472:1;15467:3;15463:11;15456:55;15542:6;15537:2;15532:3;15528:12;15521:28;15575:2;15570:3;15566:12;15559:19;;15362:222;;;:::o;15590:366::-;;15753:67;15817:2;15812:3;15753:67;:::i;:::-;15746:74;;15850:34;15846:1;15841:3;15837:11;15830:55;15916:4;15911:2;15906:3;15902:12;15895:26;15947:2;15942:3;15938:12;15931:19;;15736:220;;;:::o;15962:383::-;;16125:67;16189:2;16184:3;16125:67;:::i;:::-;16118:74;;16222:34;16218:1;16213:3;16209:11;16202:55;16288:21;16283:2;16278:3;16274:12;16267:43;16336:2;16331:3;16327:12;16320:19;;16108:237;;;:::o;16351:327::-;;16514:67;16578:2;16573:3;16514:67;:::i;:::-;16507:74;;16611:31;16607:1;16602:3;16598:11;16591:52;16669:2;16664:3;16660:12;16653:19;;16497:181;;;:::o;16684:372::-;;16847:67;16911:2;16906:3;16847:67;:::i;:::-;16840:74;;16944:34;16940:1;16935:3;16931:11;16924:55;17010:10;17005:2;17000:3;16996:12;16989:32;17047:2;17042:3;17038:12;17031:19;;16830:226;;;:::o;17062:365::-;;17225:67;17289:2;17284:3;17225:67;:::i;:::-;17218:74;;17322:34;17318:1;17313:3;17309:11;17302:55;17388:3;17383:2;17378:3;17374:12;17367:25;17418:2;17413:3;17409:12;17402:19;;17208:219;;;:::o;17433:383::-;;17596:67;17660:2;17655:3;17596:67;:::i;:::-;17589:74;;17693:34;17689:1;17684:3;17680:11;17673:55;17759:21;17754:2;17749:3;17745:12;17738:43;17807:2;17802:3;17798:12;17791:19;;17579:237;;;:::o;17822:378::-;;17985:67;18049:2;18044:3;17985:67;:::i;:::-;17978:74;;18082:34;18078:1;18073:3;18069:11;18062:55;18148:16;18143:2;18138:3;18134:12;18127:38;18191:2;18186:3;18182:12;18175:19;;17968:232;;;:::o;18206:379::-;;18369:67;18433:2;18428:3;18369:67;:::i;:::-;18362:74;;18466:34;18462:1;18457:3;18453:11;18446:55;18532:17;18527:2;18522:3;18518:12;18511:39;18576:2;18571:3;18567:12;18560:19;;18352:233;;;:::o;18591:377::-;;18754:67;18818:2;18813:3;18754:67;:::i;:::-;18747:74;;18851:34;18847:1;18842:3;18838:11;18831:55;18917:15;18912:2;18907:3;18903:12;18896:37;18959:2;18954:3;18950:12;18943:19;;18737:231;;;:::o;18974:366::-;;19137:67;19201:2;19196:3;19137:67;:::i;:::-;19130:74;;19234:34;19230:1;19225:3;19221:11;19214:55;19300:4;19295:2;19290:3;19286:12;19279:26;19331:2;19326:3;19322:12;19315:19;;19120:220;;;:::o;19346:118::-;19433:24;19451:5;19433:24;:::i;:::-;19428:3;19421:37;19411:53;;:::o;19470:275::-;;19624:95;19715:3;19706:6;19624:95;:::i;:::-;19617:102;;19736:3;19729:10;;19606:139;;;;:::o;19751:222::-;;19882:2;19871:9;19867:18;19859:26;;19895:71;19963:1;19952:9;19948:17;19939:6;19895:71;:::i;:::-;19849:124;;;;:::o;19979:640::-;;20212:3;20201:9;20197:19;20189:27;;20226:71;20294:1;20283:9;20279:17;20270:6;20226:71;:::i;:::-;20307:72;20375:2;20364:9;20360:18;20351:6;20307:72;:::i;:::-;20389;20457:2;20446:9;20442:18;20433:6;20389:72;:::i;:::-;20508:9;20502:4;20498:20;20493:2;20482:9;20478:18;20471:48;20536:76;20607:4;20598:6;20536:76;:::i;:::-;20528:84;;20179:440;;;;;;;:::o;20625:210::-;;20750:2;20739:9;20735:18;20727:26;;20763:65;20825:1;20814:9;20810:17;20801:6;20763:65;:::i;:::-;20717:118;;;;:::o;20841:313::-;;20992:2;20981:9;20977:18;20969:26;;21041:9;21035:4;21031:20;21027:1;21016:9;21012:17;21005:47;21069:78;21142:4;21133:6;21069:78;:::i;:::-;21061:86;;20959:195;;;;:::o;21160:419::-;;21364:2;21353:9;21349:18;21341:26;;21413:9;21407:4;21403:20;21399:1;21388:9;21384:17;21377:47;21441:131;21567:4;21441:131;:::i;:::-;21433:139;;21331:248;;;:::o;21585:419::-;;21789:2;21778:9;21774:18;21766:26;;21838:9;21832:4;21828:20;21824:1;21813:9;21809:17;21802:47;21866:131;21992:4;21866:131;:::i;:::-;21858:139;;21756:248;;;:::o;22010:419::-;;22214:2;22203:9;22199:18;22191:26;;22263:9;22257:4;22253:20;22249:1;22238:9;22234:17;22227:47;22291:131;22417:4;22291:131;:::i;:::-;22283:139;;22181:248;;;:::o;22435:419::-;;22639:2;22628:9;22624:18;22616:26;;22688:9;22682:4;22678:20;22674:1;22663:9;22659:17;22652:47;22716:131;22842:4;22716:131;:::i;:::-;22708:139;;22606:248;;;:::o;22860:419::-;;23064:2;23053:9;23049:18;23041:26;;23113:9;23107:4;23103:20;23099:1;23088:9;23084:17;23077:47;23141:131;23267:4;23141:131;:::i;:::-;23133:139;;23031:248;;;:::o;23285:419::-;;23489:2;23478:9;23474:18;23466:26;;23538:9;23532:4;23528:20;23524:1;23513:9;23509:17;23502:47;23566:131;23692:4;23566:131;:::i;:::-;23558:139;;23456:248;;;:::o;23710:419::-;;23914:2;23903:9;23899:18;23891:26;;23963:9;23957:4;23953:20;23949:1;23938:9;23934:17;23927:47;23991:131;24117:4;23991:131;:::i;:::-;23983:139;;23881:248;;;:::o;24135:419::-;;24339:2;24328:9;24324:18;24316:26;;24388:9;24382:4;24378:20;24374:1;24363:9;24359:17;24352:47;24416:131;24542:4;24416:131;:::i;:::-;24408:139;;24306:248;;;:::o;24560:419::-;;24764:2;24753:9;24749:18;24741:26;;24813:9;24807:4;24803:20;24799:1;24788:9;24784:17;24777:47;24841:131;24967:4;24841:131;:::i;:::-;24833:139;;24731:248;;;:::o;24985:419::-;;25189:2;25178:9;25174:18;25166:26;;25238:9;25232:4;25228:20;25224:1;25213:9;25209:17;25202:47;25266:131;25392:4;25266:131;:::i;:::-;25258:139;;25156:248;;;:::o;25410:419::-;;25614:2;25603:9;25599:18;25591:26;;25663:9;25657:4;25653:20;25649:1;25638:9;25634:17;25627:47;25691:131;25817:4;25691:131;:::i;:::-;25683:139;;25581:248;;;:::o;25835:419::-;;26039:2;26028:9;26024:18;26016:26;;26088:9;26082:4;26078:20;26074:1;26063:9;26059:17;26052:47;26116:131;26242:4;26116:131;:::i;:::-;26108:139;;26006:248;;;:::o;26260:419::-;;26464:2;26453:9;26449:18;26441:26;;26513:9;26507:4;26503:20;26499:1;26488:9;26484:17;26477:47;26541:131;26667:4;26541:131;:::i;:::-;26533:139;;26431:248;;;:::o;26685:419::-;;26889:2;26878:9;26874:18;26866:26;;26938:9;26932:4;26928:20;26924:1;26913:9;26909:17;26902:47;26966:131;27092:4;26966:131;:::i;:::-;26958:139;;26856:248;;;:::o;27110:419::-;;27314:2;27303:9;27299:18;27291:26;;27363:9;27357:4;27353:20;27349:1;27338:9;27334:17;27327:47;27391:131;27517:4;27391:131;:::i;:::-;27383:139;;27281:248;;;:::o;27535:419::-;;27739:2;27728:9;27724:18;27716:26;;27788:9;27782:4;27778:20;27774:1;27763:9;27759:17;27752:47;27816:131;27942:4;27816:131;:::i;:::-;27808:139;;27706:248;;;:::o;27960:419::-;;28164:2;28153:9;28149:18;28141:26;;28213:9;28207:4;28203:20;28199:1;28188:9;28184:17;28177:47;28241:131;28367:4;28241:131;:::i;:::-;28233:139;;28131:248;;;:::o;28385:419::-;;28589:2;28578:9;28574:18;28566:26;;28638:9;28632:4;28628:20;28624:1;28613:9;28609:17;28602:47;28666:131;28792:4;28666:131;:::i;:::-;28658:139;;28556:248;;;:::o;28810:419::-;;29014:2;29003:9;28999:18;28991:26;;29063:9;29057:4;29053:20;29049:1;29038:9;29034:17;29027:47;29091:131;29217:4;29091:131;:::i;:::-;29083:139;;28981:248;;;:::o;29235:419::-;;29439:2;29428:9;29424:18;29416:26;;29488:9;29482:4;29478:20;29474:1;29463:9;29459:17;29452:47;29516:131;29642:4;29516:131;:::i;:::-;29508:139;;29406:248;;;:::o;29660:419::-;;29864:2;29853:9;29849:18;29841:26;;29913:9;29907:4;29903:20;29899:1;29888:9;29884:17;29877:47;29941:131;30067:4;29941:131;:::i;:::-;29933:139;;29831:248;;;:::o;30085:419::-;;30289:2;30278:9;30274:18;30266:26;;30338:9;30332:4;30328:20;30324:1;30313:9;30309:17;30302:47;30366:131;30492:4;30366:131;:::i;:::-;30358:139;;30256:248;;;:::o;30510:419::-;;30714:2;30703:9;30699:18;30691:26;;30763:9;30757:4;30753:20;30749:1;30738:9;30734:17;30727:47;30791:131;30917:4;30791:131;:::i;:::-;30783:139;;30681:248;;;:::o;30935:419::-;;31139:2;31128:9;31124:18;31116:26;;31188:9;31182:4;31178:20;31174:1;31163:9;31159:17;31152:47;31216:131;31342:4;31216:131;:::i;:::-;31208:139;;31106:248;;;:::o;31360:419::-;;31564:2;31553:9;31549:18;31541:26;;31613:9;31607:4;31603:20;31599:1;31588:9;31584:17;31577:47;31641:131;31767:4;31641:131;:::i;:::-;31633:139;;31531:248;;;:::o;31785:419::-;;31989:2;31978:9;31974:18;31966:26;;32038:9;32032:4;32028:20;32024:1;32013:9;32009:17;32002:47;32066:131;32192:4;32066:131;:::i;:::-;32058:139;;31956:248;;;:::o;32210:419::-;;32414:2;32403:9;32399:18;32391:26;;32463:9;32457:4;32453:20;32449:1;32438:9;32434:17;32427:47;32491:131;32617:4;32491:131;:::i;:::-;32483:139;;32381:248;;;:::o;32635:419::-;;32839:2;32828:9;32824:18;32816:26;;32888:9;32882:4;32878:20;32874:1;32863:9;32859:17;32852:47;32916:131;33042:4;32916:131;:::i;:::-;32908:139;;32806:248;;;:::o;33060:222::-;;33191:2;33180:9;33176:18;33168:26;;33204:71;33272:1;33261:9;33257:17;33248:6;33204:71;:::i;:::-;33158:124;;;;:::o;33288:283::-;;33354:2;33348:9;33338:19;;33396:4;33388:6;33384:17;33503:6;33491:10;33488:22;33467:18;33455:10;33452:34;33449:62;33446:2;;;33514:18;;:::i;:::-;33446:2;33554:10;33550:2;33543:22;33328:243;;;;:::o;33577:311::-;;33744:18;33736:6;33733:30;33730:2;;;33766:18;;:::i;:::-;33730:2;33816:4;33808:6;33804:17;33796:25;;33876:4;33870;33866:15;33858:23;;33659:229;;;:::o;33894:331::-;;34045:18;34037:6;34034:30;34031:2;;;34067:18;;:::i;:::-;34031:2;34152:4;34148:9;34141:4;34133:6;34129:17;34125:33;34117:41;;34213:4;34207;34203:15;34195:23;;33960:265;;;:::o;34231:332::-;;34383:18;34375:6;34372:30;34369:2;;;34405:18;;:::i;:::-;34369:2;34490:4;34486:9;34479:4;34471:6;34467:17;34463:33;34455:41;;34551:4;34545;34541:15;34533:23;;34298:265;;;:::o;34569:98::-;;34654:5;34648:12;34638:22;;34627:40;;;:::o;34673:99::-;;34759:5;34753:12;34743:22;;34732:40;;;:::o;34778:168::-;;34895:6;34890:3;34883:19;34935:4;34930:3;34926:14;34911:29;;34873:73;;;;:::o;34952:169::-;;35070:6;35065:3;35058:19;35110:4;35105:3;35101:14;35086:29;;35048:73;;;;:::o;35127:148::-;;35266:3;35251:18;;35241:34;;;;:::o;35281:273::-;;35340:20;35358:1;35340:20;:::i;:::-;35335:25;;35374:20;35392:1;35374:20;:::i;:::-;35369:25;;35496:1;35460:34;35456:42;35453:1;35450:49;35447:2;;;35502:18;;:::i;:::-;35447:2;35546:1;35543;35539:9;35532:16;;35325:229;;;;:::o;35560:305::-;;35619:20;35637:1;35619:20;:::i;:::-;35614:25;;35653:20;35671:1;35653:20;:::i;:::-;35648:25;;35807:1;35739:66;35735:74;35732:1;35729:81;35726:2;;;35813:18;;:::i;:::-;35726:2;35857:1;35854;35850:9;35843:16;;35604:261;;;;:::o;35871:348::-;;35934:20;35952:1;35934:20;:::i;:::-;35929:25;;35968:20;35986:1;35968:20;:::i;:::-;35963:25;;36156:1;36088:66;36084:74;36081:1;36078:81;36073:1;36066:9;36059:17;36055:105;36052:2;;;36163:18;;:::i;:::-;36052:2;36211:1;36208;36204:9;36193:20;;35919:300;;;;:::o;36225:191::-;;36285:20;36303:1;36285:20;:::i;:::-;36280:25;;36319:20;36337:1;36319:20;:::i;:::-;36314:25;;36358:1;36355;36352:8;36349:2;;;36363:18;;:::i;:::-;36349:2;36408:1;36405;36401:9;36393:17;;36270:146;;;;:::o;36422:191::-;;36482:20;36500:1;36482:20;:::i;:::-;36477:25;;36516:20;36534:1;36516:20;:::i;:::-;36511:25;;36555:1;36552;36549:8;36546:2;;;36560:18;;:::i;:::-;36546:2;36605:1;36602;36598:9;36590:17;;36467:146;;;;:::o;36619:96::-;;36685:24;36703:5;36685:24;:::i;:::-;36674:35;;36664:51;;;:::o;36721:90::-;;36798:5;36791:13;36784:21;36773:32;;36763:48;;;:::o;36817:149::-;;36893:66;36886:5;36882:78;36871:89;;36861:105;;;:::o;36972:118::-;;37049:34;37042:5;37038:46;37027:57;;37017:73;;;:::o;37096:126::-;;37173:42;37166:5;37162:54;37151:65;;37141:81;;;:::o;37228:77::-;;37294:5;37283:16;;37273:32;;;:::o;37311:154::-;37395:6;37390:3;37385;37372:30;37457:1;37448:6;37443:3;37439:16;37432:27;37362:103;;;:::o;37471:307::-;37539:1;37549:113;37563:6;37560:1;37557:13;37549:113;;;37648:1;37643:3;37639:11;37633:18;37629:1;37624:3;37620:11;37613:39;37585:2;37582:1;37578:10;37573:15;;37549:113;;;37680:6;37677:1;37674:13;37671:2;;;37760:1;37751:6;37746:3;37742:16;37735:27;37671:2;37520:258;;;;:::o;37784:171::-;;37846:24;37864:5;37846:24;:::i;:::-;37837:33;;37892:4;37885:5;37882:15;37879:2;;;37900:18;;:::i;:::-;37879:2;37947:1;37940:5;37936:13;37929:20;;37827:128;;;:::o;37961:320::-;;38042:1;38036:4;38032:12;38022:22;;38089:1;38083:4;38079:12;38110:18;38100:2;;38166:4;38158:6;38154:17;38144:27;;38100:2;38228;38220:6;38217:14;38197:18;38194:38;38191:2;;;38247:18;;:::i;:::-;38191:2;38012:269;;;;:::o;38287:233::-;;38349:24;38367:5;38349:24;:::i;:::-;38340:33;;38395:66;38388:5;38385:77;38382:2;;;38465:18;;:::i;:::-;38382:2;38512:1;38505:5;38501:13;38494:20;;38330:190;;;:::o;38526:180::-;38574:77;38571:1;38564:88;38671:4;38668:1;38661:15;38695:4;38692:1;38685:15;38712:180;38760:77;38757:1;38750:88;38857:4;38854:1;38847:15;38881:4;38878:1;38871:15;38898:180;38946:77;38943:1;38936:88;39043:4;39040:1;39033:15;39067:4;39064:1;39057:15;39084:102;;39176:2;39172:7;39167:2;39160:5;39156:14;39152:28;39142:38;;39132:54;;;:::o;39192:122::-;39265:24;39283:5;39265:24;:::i;:::-;39258:5;39255:35;39245:2;;39304:1;39301;39294:12;39245:2;39235:79;:::o;39320:116::-;39390:21;39405:5;39390:21;:::i;:::-;39383:5;39380:32;39370:2;;39426:1;39423;39416:12;39370:2;39360:76;:::o;39442:120::-;39514:23;39531:5;39514:23;:::i;:::-;39507:5;39504:34;39494:2;;39552:1;39549;39542:12;39494:2;39484:78;:::o;39568:122::-;39641:24;39659:5;39641:24;:::i;:::-;39634:5;39631:35;39621:2;;39680:1;39677;39670:12;39621:2;39611:79;:::o

Swarm Source

ipfs://a3ea1ae6ff35caf3ce3d02e358f13d433a93bb9b10178d4061316be7d76765cb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.