ETH Price: $3,095.19 (+0.74%)
Gas: 4 Gwei

Token

0xCryptoPunks (0xCP)
 

Overview

Max Total Supply

1,423 0xCP

Holders

196

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 0xCP
0x3826d3ac5f495d3607935dbe2cb9e8b93de12c87
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
OxCryptoPunks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    function setRenounceOwnership(bool _state) external onlyOwner {
        wantToRenounceOwnership = _state;
    }

    /**
     * @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 {
        require(wantToRenounceOwnership, "Not allowed to renouce. Set variable!");
        _transferOwnership(address(0));
    }

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

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

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

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

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

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

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


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

pragma solidity ^0.8.0;

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

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


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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

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

// File: contracts/0xCryptoPunks.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    function totalSupply() public view returns (uint256) {
        return currentIndex;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        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);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

    unchecked {
        for (uint256 curr = tokenId; curr >= 0; 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, tokenId.toString())) : '';
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        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 Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
    unchecked {
        _addressData[to].balance += uint128(quantity);
        _addressData[to].numberMinted += uint128(quantity);

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

        uint256 updatedIndex = startTokenId;

        for (uint256 i; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            if (safe) {
                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);

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

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

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

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



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

    uint256 public PRICE = 20000000000000000; //0.02 eth
    uint128 public FREE_MINT_PRICE = 0; 
    uint256 public MAX_SUPPLY = 9999;
    uint256 public MAX_MINT_AMOUNT_PER_TX = 10;
    uint256 public FREE_MINT_IS_ALLOWED_UNTIL = 999; // Free mint is allowed until x mint

    bool public IS_SALE_ACTIVE = false;
    bool public REVEALED = false;

    string public URIPREFIX = "";
    string public URISUFFIX = ".json";
    string public HIDDENMETADATAURI = "";

    constructor() 
    ERC721A("0xCryptoPunks", "0xCP") {
        setHiddenMetadataUri("ipfs://QmSZHtu4SaWKTgBTYh9nBBtLDgMm9pJZTrP439wTEvUot1/");
    }

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

    function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );


    if (REVEALED == false) {
      return bytes(HIDDENMETADATAURI).length > 0
        ? string(abi.encodePacked(HIDDENMETADATAURI, _tokenId.toString(), ".json"))
        : "";
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), URISUFFIX))
        : "";
  }
    
    /** SETTERS **/
    function setPrice(uint256 customPrice) external onlyOwner {
        PRICE = customPrice;
    }

    function setLowerMaxSupply(uint256 newMaxSupply) external onlyOwner {
        require(newMaxSupply < MAX_SUPPLY, "Invalid new max supply");
        require(newMaxSupply >= currentIndex, "Invalid new max supply");
        MAX_SUPPLY = newMaxSupply;
    }

    function setMaxMintPerTx(uint256 maxMintPerTx) external onlyOwner {
        MAX_MINT_AMOUNT_PER_TX = maxMintPerTx;
    }

    function setSaleActive(bool saleIsActive) external onlyOwner {
        IS_SALE_ACTIVE = saleIsActive;
    }

    function setFreeMintAllowedUntil(uint256 freeMintIsAllowedUntil) external onlyOwner {
        FREE_MINT_IS_ALLOWED_UNTIL = freeMintIsAllowedUntil;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri) internal onlyOwner {
        HIDDENMETADATAURI = _hiddenMetadataUri;
     }

     function setExHiddenMetadataUri(string memory _hiddenMetadataUri) external onlyOwner {
        HIDDENMETADATAURI = _hiddenMetadataUri;
     }

     function setRevealed(bool _state) external onlyOwner {
        string memory currentBaseURI = _baseURI();
        require(bytes(currentBaseURI).length != 0, "Set the URIprefix before revealing the NFTs!");
        REVEALED = _state;
    }

    function setUriPrefix(string memory _uriPrefix) external onlyOwner {
        URIPREFIX = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) external onlyOwner {
        URISUFFIX = _uriSuffix;
    }

    /** MINT **/
    modifier mintCompliance(uint256 _mintAmount) {
        require(_mintAmount > 0 && _mintAmount <= MAX_MINT_AMOUNT_PER_TX, "Invalid mint amount or transaction maximum exceeded!");
        require(currentIndex + _mintAmount <= MAX_SUPPLY, "Max supply exceeded!");
        _;
    }

    function mint(uint256 _mintAmount) external payable mintCompliance(_mintAmount) nonReentrant {
        require(IS_SALE_ACTIVE, "Sale is not active!");

        uint256 price;

        if (currentIndex < FREE_MINT_IS_ALLOWED_UNTIL) {
            price = FREE_MINT_PRICE;        
        }
        else {
            price = _mintAmount * PRICE;
        }

        require(msg.value >= price, "Insufficient funds!");

        _safeMint(msg.sender, _mintAmount);
    }

    function mintOwner(address _to, uint256 _mintAmount) external mintCompliance(_mintAmount) onlyOwner {
        _safeMint(_to, _mintAmount);
    }

    function withdraw() external onlyOwner nonReentrant {
    // Transfer balance to the owner.
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os, "Transfer failed.");
    }
}

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":"FREE_MINT_IS_ALLOWED_UNTIL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_MINT_PRICE","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HIDDENMETADATAURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_SALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_AMOUNT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEALED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URIPREFIX","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URISUFFIX","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"_hiddenMetadataUri","type":"string"}],"name":"setExHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"freeMintIsAllowedUntil","type":"uint256"}],"name":"setFreeMintAllowedUntil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setLowerMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintPerTx","type":"uint256"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"customPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRenounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600760146101000a81548160ff02191690831515021790555066470de4df8200006009556000600a60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555061270f600b55600a600c556103e7600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555060405180602001604052806000815250600f9080519060200190620000d2929190620003f2565b506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506010908051906020019062000120929190620003f2565b50604051806020016040528060008152506011908051906020019062000148929190620003f2565b503480156200015657600080fd5b506040518060400160405280600d81526020017f307843727970746f50756e6b73000000000000000000000000000000000000008152506040518060400160405280600481526020017f30784350000000000000000000000000000000000000000000000000000000008152508160019080519060200190620001db929190620003f2565b508060029080519060200190620001f4929190620003f2565b505050620002176200020b6200024f60201b60201c565b6200025760201b60201c565b600160088190555062000249604051806060016040528060368152602001620050e2603691396200031d60201b60201c565b6200058a565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200032d6200024f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000353620003c860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a390620004c9565b60405180910390fd5b8060119080519060200190620003c4929190620003f2565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200040090620004fc565b90600052602060002090601f01602090048101928262000424576000855562000470565b82601f106200043f57805160ff191683800117855562000470565b8280016001018555821562000470579182015b828111156200046f57825182559160200191906001019062000452565b5b5090506200047f919062000483565b5090565b5b808211156200049e57600081600090555060010162000484565b5090565b6000620004b1602083620004eb565b9150620004be8262000561565b602082019050919050565b60006020820190508181036000830152620004e481620004a2565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200051557607f821691505b602082108114156200052c576200052b62000532565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614b48806200059a6000396000f3fe60806040526004361061023b5760003560e01c80637471e0d51161012e57806395d89b41116100ab578063b88d4fde1161006f578063b88d4fde14610816578063c87b56dd1461083f578063e0a808531461087c578063e985e9c5146108a5578063f2fde38b146108e25761023b565b806395d89b4114610752578063a0712d681461077d578063a094c5a114610799578063a22cb465146107c2578063a76a9587146107eb5761023b565b8063841718a6116100f2578063841718a6146106815780638b85e43d146106aa5780638d859f3e146106d35780638da5cb5b146106fe57806391b7f5ed146107295761023b565b80637471e0d5146105ae57806376d02b71146105d95780637c22ca23146106045780637ec4a6591461062f57806381fe8cfd146106585761023b565b80633ccfd60b116101bc578063561f28ce11610180578063561f28ce146104cb578063616cdb1e146104f45780636352211e1461051d57806370a082311461055a578063715018a6146105975761023b565b80633ccfd60b1461040c5780633fa1a1ce146104235780634065b85f1461044e578063408cbf941461047957806342842e0e146104a25761023b565b806309ef65271161020357806309ef65271461033957806316ba10e01461036457806318160ddd1461038d57806323b872dd146103b857806332cb6b0c146103e15761023b565b806301e981fb1461024057806301ffc9a71461026b57806306fdde03146102a8578063081812fc146102d3578063095ea7b314610310575b600080fd5b34801561024c57600080fd5b5061025561090b565b6040516102629190613bcd565b60405180910390f35b34801561027757600080fd5b50610292600480360381019061028d91906134f7565b610999565b60405161029f9190613bb2565b60405180910390f35b3480156102b457600080fd5b506102bd610a7b565b6040516102ca9190613bcd565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061359a565b610b0d565b6040516103079190613b4b565b60405180910390f35b34801561031c57600080fd5b506103376004803603810190610332919061348a565b610b92565b005b34801561034557600080fd5b5061034e610cab565b60405161035b9190613f2a565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613551565b610cb1565b005b34801561039957600080fd5b506103a2610d47565b6040516103af9190613f2a565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613374565b610d50565b005b3480156103ed57600080fd5b506103f6610d60565b6040516104039190613f2a565b60405180910390f35b34801561041857600080fd5b50610421610d66565b005b34801561042f57600080fd5b50610438610eee565b6040516104459190613bcd565b60405180910390f35b34801561045a57600080fd5b50610463610f7c565b6040516104709190613f2a565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b919061348a565b610f82565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613374565b6110b1565b005b3480156104d757600080fd5b506104f260048036038101906104ed91906134ca565b6110d1565b005b34801561050057600080fd5b5061051b6004803603810190610516919061359a565b61116a565b005b34801561052957600080fd5b50610544600480360381019061053f919061359a565b6111f0565b6040516105519190613b4b565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c9190613307565b611206565b60405161058e9190613f2a565b60405180910390f35b3480156105a357600080fd5b506105ac6112ef565b005b3480156105ba57600080fd5b506105c36113c6565b6040516105d09190613f0f565b60405180910390f35b3480156105e557600080fd5b506105ee6113e8565b6040516105fb9190613bb2565b60405180910390f35b34801561061057600080fd5b506106196113fb565b6040516106269190613bcd565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190613551565b611489565b005b34801561066457600080fd5b5061067f600480360381019061067a919061359a565b61151f565b005b34801561068d57600080fd5b506106a860048036038101906106a391906134ca565b61162e565b005b3480156106b657600080fd5b506106d160048036038101906106cc919061359a565b6116c7565b005b3480156106df57600080fd5b506106e861174d565b6040516106f59190613f2a565b60405180910390f35b34801561070a57600080fd5b50610713611753565b6040516107209190613b4b565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b919061359a565b61177d565b005b34801561075e57600080fd5b50610767611803565b6040516107749190613bcd565b60405180910390f35b6107976004803603810190610792919061359a565b611895565b005b3480156107a557600080fd5b506107c060048036038101906107bb9190613551565b611a87565b005b3480156107ce57600080fd5b506107e960048036038101906107e4919061344a565b611b1d565b005b3480156107f757600080fd5b50610800611c9e565b60405161080d9190613bb2565b60405180910390f35b34801561082257600080fd5b5061083d600480360381019061083891906133c7565b611cb1565b005b34801561084b57600080fd5b506108666004803603810190610861919061359a565b611d0d565b6040516108739190613bcd565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e91906134ca565b611e32565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190613334565b611f1d565b6040516108d99190613bb2565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190613307565b611fb1565b005b600f805461091890614216565b80601f016020809104026020016040519081016040528092919081815260200182805461094490614216565b80156109915780601f1061096657610100808354040283529160200191610991565b820191906000526020600020905b81548152906001019060200180831161097457829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a745750610a73826120a9565b5b9050919050565b606060018054610a8a90614216565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab690614216565b8015610b035780601f10610ad857610100808354040283529160200191610b03565b820191906000526020600020905b815481529060010190602001808311610ae657829003601f168201915b5050505050905090565b6000610b1882612113565b610b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4e90613eaf565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9d826111f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0590613daf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c2d612120565b73ffffffffffffffffffffffffffffffffffffffff161480610c5c5750610c5b81610c56612120565b611f1d565b5b610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290613c8f565b60405180910390fd5b610ca6838383612128565b505050565b600c5481565b610cb9612120565b73ffffffffffffffffffffffffffffffffffffffff16610cd7611753565b73ffffffffffffffffffffffffffffffffffffffff1614610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2490613cef565b60405180910390fd5b8060109080519060200190610d439291906130e1565b5050565b60008054905090565b610d5b8383836121da565b505050565b600b5481565b610d6e612120565b73ffffffffffffffffffffffffffffffffffffffff16610d8c611753565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990613cef565b60405180910390fd5b60026008541415610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90613e6f565b60405180910390fd5b60026008819055506000610e3a611753565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e5d90613b36565b60006040518083038185875af1925050503d8060008114610e9a576040519150601f19603f3d011682016040523d82523d6000602084013e610e9f565b606091505b5050905080610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda90613def565b60405180910390fd5b506001600881905550565b60108054610efb90614216565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2790614216565b8015610f745780601f10610f4957610100808354040283529160200191610f74565b820191906000526020600020905b815481529060010190602001808311610f5757829003601f168201915b505050505081565b600d5481565b80600081118015610f955750600c548111155b610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90613bef565b60405180910390fd5b600b5481600054610fe5919061402f565b1115611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90613dcf565b60405180910390fd5b61102e612120565b73ffffffffffffffffffffffffffffffffffffffff1661104c611753565b73ffffffffffffffffffffffffffffffffffffffff16146110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109990613cef565b60405180910390fd5b6110ac838361271a565b505050565b6110cc83838360405180602001604052806000815250611cb1565b505050565b6110d9612120565b73ffffffffffffffffffffffffffffffffffffffff166110f7611753565b73ffffffffffffffffffffffffffffffffffffffff161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613cef565b60405180910390fd5b80600760146101000a81548160ff02191690831515021790555050565b611172612120565b73ffffffffffffffffffffffffffffffffffffffff16611190611753565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613cef565b60405180910390fd5b80600c8190555050565b60006111fb82612738565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e90613caf565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112f7612120565b73ffffffffffffffffffffffffffffffffffffffff16611315611753565b73ffffffffffffffffffffffffffffffffffffffff161461136b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136290613cef565b60405180910390fd5b600760149054906101000a900460ff166113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b190613c2f565b60405180910390fd5b6113c460006128d2565b565b600a60009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900460ff1681565b6011805461140890614216565b80601f016020809104026020016040519081016040528092919081815260200182805461143490614216565b80156114815780601f1061145657610100808354040283529160200191611481565b820191906000526020600020905b81548152906001019060200180831161146457829003601f168201915b505050505081565b611491612120565b73ffffffffffffffffffffffffffffffffffffffff166114af611753565b73ffffffffffffffffffffffffffffffffffffffff1614611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc90613cef565b60405180910390fd5b80600f908051906020019061151b9291906130e1565b5050565b611527612120565b73ffffffffffffffffffffffffffffffffffffffff16611545611753565b73ffffffffffffffffffffffffffffffffffffffff161461159b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159290613cef565b60405180910390fd5b600b5481106115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690613d8f565b60405180910390fd5b600054811015611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613d8f565b60405180910390fd5b80600b8190555050565b611636612120565b73ffffffffffffffffffffffffffffffffffffffff16611654611753565b73ffffffffffffffffffffffffffffffffffffffff16146116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190613cef565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6116cf612120565b73ffffffffffffffffffffffffffffffffffffffff166116ed611753565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613cef565b60405180910390fd5b80600d8190555050565b60095481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611785612120565b73ffffffffffffffffffffffffffffffffffffffff166117a3611753565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090613cef565b60405180910390fd5b8060098190555050565b60606002805461181290614216565b80601f016020809104026020016040519081016040528092919081815260200182805461183e90614216565b801561188b5780601f106118605761010080835404028352916020019161188b565b820191906000526020600020905b81548152906001019060200180831161186e57829003601f168201915b5050505050905090565b806000811180156118a85750600c548111155b6118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90613bef565b60405180910390fd5b600b54816000546118f8919061402f565b1115611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090613dcf565b60405180910390fd5b6002600854141561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690613e6f565b60405180910390fd5b6002600881905550600e60009054906101000a900460ff166119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd90613d6f565b60405180910390fd5b6000600d546000541015611a1c57600a60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050611a2d565b60095483611a2a91906140b6565b90505b80341015611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790613ecf565b60405180910390fd5b611a7a338461271a565b5060016008819055505050565b611a8f612120565b73ffffffffffffffffffffffffffffffffffffffff16611aad611753565b73ffffffffffffffffffffffffffffffffffffffff1614611b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afa90613cef565b60405180910390fd5b8060119080519060200190611b199291906130e1565b5050565b611b25612120565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90613d2f565b60405180910390fd5b8060066000611ba0612120565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c4d612120565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c929190613bb2565b60405180910390a35050565b600e60019054906101000a900460ff1681565b611cbc8484846121da565b611cc884848484612998565b611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90613e0f565b60405180910390fd5b50505050565b6060611d1882612113565b611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90613d0f565b60405180910390fd5b60001515600e60019054906101000a900460ff1615151415611dd157600060118054611d8290614216565b905011611d9e5760405180602001604052806000815250611dca565b6011611da983612b2f565b604051602001611dba929190613b07565b6040516020818303038152906040525b9050611e2d565b6000611ddb612c90565b90506000815111611dfb5760405180602001604052806000815250611e29565b80611e0584612b2f565b6010604051602001611e1993929190613ad6565b6040516020818303038152906040525b9150505b919050565b611e3a612120565b73ffffffffffffffffffffffffffffffffffffffff16611e58611753565b73ffffffffffffffffffffffffffffffffffffffff1614611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590613cef565b60405180910390fd5b6000611eb8612c90565b9050600081511415611eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef690613eef565b60405180910390fd5b81600e60016101000a81548160ff0219169083151502179055505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fb9612120565b73ffffffffffffffffffffffffffffffffffffffff16611fd7611753565b73ffffffffffffffffffffffffffffffffffffffff161461202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490613cef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209490613c0f565b60405180910390fd5b6120a6816128d2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006121e582612738565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661220c612120565b73ffffffffffffffffffffffffffffffffffffffff1614806122685750612231612120565b73ffffffffffffffffffffffffffffffffffffffff1661225084610b0d565b73ffffffffffffffffffffffffffffffffffffffff16145b806122845750612283826000015161227e612120565b611f1d565b5b9050806122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd90613d4f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f90613ccf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90613c6f565b60405180910390fd5b6123b58585856001612d22565b6123c56000848460000151612128565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126aa5761260981612113565b156126a95782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127138585856001612d28565b5050505050565b612734828260405180602001604052806000815250612d2e565b5050565b612740613167565b61274982612113565b612788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277f90613c4f565b60405180910390fd5b60008290505b60008110612891576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146128825780925050506128cd565b5080806001900391505061278e565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c490613e8f565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006129b98473ffffffffffffffffffffffffffffffffffffffff16612d40565b15612b22578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e2612120565b8786866040518563ffffffff1660e01b8152600401612a049493929190613b66565b602060405180830381600087803b158015612a1e57600080fd5b505af1925050508015612a4f57506040513d601f19601f82011682018060405250810190612a4c9190613524565b60015b612ad2573d8060008114612a7f576040519150601f19603f3d011682016040523d82523d6000602084013e612a84565b606091505b50600081511415612aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac190613e0f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b27565b600190505b949350505050565b60606000821415612b77576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c8b565b600082905060005b60008214612ba9578080612b9290614279565b915050600a82612ba29190614085565b9150612b7f565b60008167ffffffffffffffff811115612bc557612bc46143af565b5b6040519080825280601f01601f191660200182016040528015612bf75781602001600182028036833780820191505090505b5090505b60008514612c8457600182612c109190614110565b9150600a85612c1f91906142c2565b6030612c2b919061402f565b60f81b818381518110612c4157612c40614380565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c7d9190614085565b9450612bfb565b8093505050505b919050565b6060600f8054612c9f90614216565b80601f0160208091040260200160405190810160405280929190818152602001828054612ccb90614216565b8015612d185780601f10612ced57610100808354040283529160200191612d18565b820191906000526020600020905b815481529060010190602001808311612cfb57829003601f168201915b5050505050905090565b50505050565b50505050565b612d3b8383836001612d63565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd090613e2f565b60405180910390fd5b6000841415612e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1490613e4f565b60405180910390fd5b612e2a6000868387612d22565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156130c457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156130af5761306f6000888488612998565b6130ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a590613e0f565b60405180910390fd5b5b81806001019250508080600101915050612ff8565b5080600081905550506130da6000868387612d28565b5050505050565b8280546130ed90614216565b90600052602060002090601f01602090048101928261310f5760008555613156565b82601f1061312857805160ff1916838001178555613156565b82800160010185558215613156579182015b8281111561315557825182559160200191906001019061313a565b5b50905061316391906131a1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156131ba5760008160009055506001016131a2565b5090565b60006131d16131cc84613f6a565b613f45565b9050828152602081018484840111156131ed576131ec6143e3565b5b6131f88482856141d4565b509392505050565b600061321361320e84613f9b565b613f45565b90508281526020810184848401111561322f5761322e6143e3565b5b61323a8482856141d4565b509392505050565b60008135905061325181614ab6565b92915050565b60008135905061326681614acd565b92915050565b60008135905061327b81614ae4565b92915050565b60008151905061329081614ae4565b92915050565b600082601f8301126132ab576132aa6143de565b5b81356132bb8482602086016131be565b91505092915050565b600082601f8301126132d9576132d86143de565b5b81356132e9848260208601613200565b91505092915050565b60008135905061330181614afb565b92915050565b60006020828403121561331d5761331c6143ed565b5b600061332b84828501613242565b91505092915050565b6000806040838503121561334b5761334a6143ed565b5b600061335985828601613242565b925050602061336a85828601613242565b9150509250929050565b60008060006060848603121561338d5761338c6143ed565b5b600061339b86828701613242565b93505060206133ac86828701613242565b92505060406133bd868287016132f2565b9150509250925092565b600080600080608085870312156133e1576133e06143ed565b5b60006133ef87828801613242565b945050602061340087828801613242565b9350506040613411878288016132f2565b925050606085013567ffffffffffffffff811115613432576134316143e8565b5b61343e87828801613296565b91505092959194509250565b60008060408385031215613461576134606143ed565b5b600061346f85828601613242565b925050602061348085828601613257565b9150509250929050565b600080604083850312156134a1576134a06143ed565b5b60006134af85828601613242565b92505060206134c0858286016132f2565b9150509250929050565b6000602082840312156134e0576134df6143ed565b5b60006134ee84828501613257565b91505092915050565b60006020828403121561350d5761350c6143ed565b5b600061351b8482850161326c565b91505092915050565b60006020828403121561353a576135396143ed565b5b600061354884828501613281565b91505092915050565b600060208284031215613567576135666143ed565b5b600082013567ffffffffffffffff811115613585576135846143e8565b5b613591848285016132c4565b91505092915050565b6000602082840312156135b0576135af6143ed565b5b60006135be848285016132f2565b91505092915050565b6135d081614144565b82525050565b6135df81614156565b82525050565b60006135f082613fe1565b6135fa8185613ff7565b935061360a8185602086016141e3565b613613816143f2565b840191505092915050565b600061362982613fec565b6136338185614013565b93506136438185602086016141e3565b61364c816143f2565b840191505092915050565b600061366282613fec565b61366c8185614024565b935061367c8185602086016141e3565b80840191505092915050565b6000815461369581614216565b61369f8186614024565b945060018216600081146136ba57600181146136cb576136fe565b60ff198316865281860193506136fe565b6136d485613fcc565b60005b838110156136f6578154818901526001820191506020810190506136d7565b838801955050505b50505092915050565b6000613714603483614013565b915061371f82614403565b604082019050919050565b6000613737602683614013565b915061374282614452565b604082019050919050565b600061375a602583614013565b9150613765826144a1565b604082019050919050565b600061377d602a83614013565b9150613788826144f0565b604082019050919050565b60006137a0602583614013565b91506137ab8261453f565b604082019050919050565b60006137c3603983614013565b91506137ce8261458e565b604082019050919050565b60006137e6602b83614013565b91506137f1826145dd565b604082019050919050565b6000613809602683614013565b91506138148261462c565b604082019050919050565b600061382c600583614024565b91506138378261467b565b600582019050919050565b600061384f602083614013565b915061385a826146a4565b602082019050919050565b6000613872602f83614013565b915061387d826146cd565b604082019050919050565b6000613895601a83614013565b91506138a08261471c565b602082019050919050565b60006138b8603283614013565b91506138c382614745565b604082019050919050565b60006138db601383614013565b91506138e682614794565b602082019050919050565b60006138fe601683614013565b9150613909826147bd565b602082019050919050565b6000613921602283614013565b915061392c826147e6565b604082019050919050565b6000613944600083614008565b915061394f82614835565b600082019050919050565b6000613967601483614013565b915061397282614838565b602082019050919050565b600061398a601083614013565b915061399582614861565b602082019050919050565b60006139ad603383614013565b91506139b88261488a565b604082019050919050565b60006139d0602183614013565b91506139db826148d9565b604082019050919050565b60006139f3602883614013565b91506139fe82614928565b604082019050919050565b6000613a16601f83614013565b9150613a2182614977565b602082019050919050565b6000613a39602f83614013565b9150613a44826149a0565b604082019050919050565b6000613a5c602d83614013565b9150613a67826149ef565b604082019050919050565b6000613a7f601383614013565b9150613a8a82614a3e565b602082019050919050565b6000613aa2602c83614013565b9150613aad82614a67565b604082019050919050565b613ac18161418e565b82525050565b613ad0816141ca565b82525050565b6000613ae28286613657565b9150613aee8285613657565b9150613afa8284613688565b9150819050949350505050565b6000613b138285613688565b9150613b1f8284613657565b9150613b2a8261381f565b91508190509392505050565b6000613b4182613937565b9150819050919050565b6000602082019050613b6060008301846135c7565b92915050565b6000608082019050613b7b60008301876135c7565b613b8860208301866135c7565b613b956040830185613ac7565b8181036060830152613ba781846135e5565b905095945050505050565b6000602082019050613bc760008301846135d6565b92915050565b60006020820190508181036000830152613be7818461361e565b905092915050565b60006020820190508181036000830152613c0881613707565b9050919050565b60006020820190508181036000830152613c288161372a565b9050919050565b60006020820190508181036000830152613c488161374d565b9050919050565b60006020820190508181036000830152613c6881613770565b9050919050565b60006020820190508181036000830152613c8881613793565b9050919050565b60006020820190508181036000830152613ca8816137b6565b9050919050565b60006020820190508181036000830152613cc8816137d9565b9050919050565b60006020820190508181036000830152613ce8816137fc565b9050919050565b60006020820190508181036000830152613d0881613842565b9050919050565b60006020820190508181036000830152613d2881613865565b9050919050565b60006020820190508181036000830152613d4881613888565b9050919050565b60006020820190508181036000830152613d68816138ab565b9050919050565b60006020820190508181036000830152613d88816138ce565b9050919050565b60006020820190508181036000830152613da8816138f1565b9050919050565b60006020820190508181036000830152613dc881613914565b9050919050565b60006020820190508181036000830152613de88161395a565b9050919050565b60006020820190508181036000830152613e088161397d565b9050919050565b60006020820190508181036000830152613e28816139a0565b9050919050565b60006020820190508181036000830152613e48816139c3565b9050919050565b60006020820190508181036000830152613e68816139e6565b9050919050565b60006020820190508181036000830152613e8881613a09565b9050919050565b60006020820190508181036000830152613ea881613a2c565b9050919050565b60006020820190508181036000830152613ec881613a4f565b9050919050565b60006020820190508181036000830152613ee881613a72565b9050919050565b60006020820190508181036000830152613f0881613a95565b9050919050565b6000602082019050613f246000830184613ab8565b92915050565b6000602082019050613f3f6000830184613ac7565b92915050565b6000613f4f613f60565b9050613f5b8282614248565b919050565b6000604051905090565b600067ffffffffffffffff821115613f8557613f846143af565b5b613f8e826143f2565b9050602081019050919050565b600067ffffffffffffffff821115613fb657613fb56143af565b5b613fbf826143f2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061403a826141ca565b9150614045836141ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561407a576140796142f3565b5b828201905092915050565b6000614090826141ca565b915061409b836141ca565b9250826140ab576140aa614322565b5b828204905092915050565b60006140c1826141ca565b91506140cc836141ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614105576141046142f3565b5b828202905092915050565b600061411b826141ca565b9150614126836141ca565b925082821015614139576141386142f3565b5b828203905092915050565b600061414f826141aa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142015780820151818401526020810190506141e6565b83811115614210576000848401525b50505050565b6000600282049050600182168061422e57607f821691505b6020821081141561424257614241614351565b5b50919050565b614251826143f2565b810181811067ffffffffffffffff821117156142705761426f6143af565b5b80604052505050565b6000614284826141ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142b7576142b66142f3565b5b600182019050919050565b60006142cd826141ca565b91506142d8836141ca565b9250826142e8576142e7614322565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e76616c6964206d696e7420616d6f756e74206f72207472616e736163746960008201527f6f6e206d6178696d756d20657863656564656421000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f77656420746f2072656e6f7563652e20536574207661726960008201527f61626c6521000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652100000000000000000000000000600082015250565b7f496e76616c6964206e6577206d617820737570706c7900000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b7f5365742074686520555249707265666978206265666f72652072657665616c6960008201527f6e6720746865204e465473210000000000000000000000000000000000000000602082015250565b614abf81614144565b8114614aca57600080fd5b50565b614ad681614156565b8114614ae157600080fd5b50565b614aed81614162565b8114614af857600080fd5b50565b614b04816141ca565b8114614b0f57600080fd5b5056fea264697066735822122092cb8be749ac04743980eb189109df1654748e6a58574dda47c4e9350526a21d64736f6c63430008070033697066733a2f2f516d535a487475345361574b546742545968396e4242744c44674d6d39704a5a54725034333977544576556f74312f

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80637471e0d51161012e57806395d89b41116100ab578063b88d4fde1161006f578063b88d4fde14610816578063c87b56dd1461083f578063e0a808531461087c578063e985e9c5146108a5578063f2fde38b146108e25761023b565b806395d89b4114610752578063a0712d681461077d578063a094c5a114610799578063a22cb465146107c2578063a76a9587146107eb5761023b565b8063841718a6116100f2578063841718a6146106815780638b85e43d146106aa5780638d859f3e146106d35780638da5cb5b146106fe57806391b7f5ed146107295761023b565b80637471e0d5146105ae57806376d02b71146105d95780637c22ca23146106045780637ec4a6591461062f57806381fe8cfd146106585761023b565b80633ccfd60b116101bc578063561f28ce11610180578063561f28ce146104cb578063616cdb1e146104f45780636352211e1461051d57806370a082311461055a578063715018a6146105975761023b565b80633ccfd60b1461040c5780633fa1a1ce146104235780634065b85f1461044e578063408cbf941461047957806342842e0e146104a25761023b565b806309ef65271161020357806309ef65271461033957806316ba10e01461036457806318160ddd1461038d57806323b872dd146103b857806332cb6b0c146103e15761023b565b806301e981fb1461024057806301ffc9a71461026b57806306fdde03146102a8578063081812fc146102d3578063095ea7b314610310575b600080fd5b34801561024c57600080fd5b5061025561090b565b6040516102629190613bcd565b60405180910390f35b34801561027757600080fd5b50610292600480360381019061028d91906134f7565b610999565b60405161029f9190613bb2565b60405180910390f35b3480156102b457600080fd5b506102bd610a7b565b6040516102ca9190613bcd565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061359a565b610b0d565b6040516103079190613b4b565b60405180910390f35b34801561031c57600080fd5b506103376004803603810190610332919061348a565b610b92565b005b34801561034557600080fd5b5061034e610cab565b60405161035b9190613f2a565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613551565b610cb1565b005b34801561039957600080fd5b506103a2610d47565b6040516103af9190613f2a565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613374565b610d50565b005b3480156103ed57600080fd5b506103f6610d60565b6040516104039190613f2a565b60405180910390f35b34801561041857600080fd5b50610421610d66565b005b34801561042f57600080fd5b50610438610eee565b6040516104459190613bcd565b60405180910390f35b34801561045a57600080fd5b50610463610f7c565b6040516104709190613f2a565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b919061348a565b610f82565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613374565b6110b1565b005b3480156104d757600080fd5b506104f260048036038101906104ed91906134ca565b6110d1565b005b34801561050057600080fd5b5061051b6004803603810190610516919061359a565b61116a565b005b34801561052957600080fd5b50610544600480360381019061053f919061359a565b6111f0565b6040516105519190613b4b565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c9190613307565b611206565b60405161058e9190613f2a565b60405180910390f35b3480156105a357600080fd5b506105ac6112ef565b005b3480156105ba57600080fd5b506105c36113c6565b6040516105d09190613f0f565b60405180910390f35b3480156105e557600080fd5b506105ee6113e8565b6040516105fb9190613bb2565b60405180910390f35b34801561061057600080fd5b506106196113fb565b6040516106269190613bcd565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190613551565b611489565b005b34801561066457600080fd5b5061067f600480360381019061067a919061359a565b61151f565b005b34801561068d57600080fd5b506106a860048036038101906106a391906134ca565b61162e565b005b3480156106b657600080fd5b506106d160048036038101906106cc919061359a565b6116c7565b005b3480156106df57600080fd5b506106e861174d565b6040516106f59190613f2a565b60405180910390f35b34801561070a57600080fd5b50610713611753565b6040516107209190613b4b565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b919061359a565b61177d565b005b34801561075e57600080fd5b50610767611803565b6040516107749190613bcd565b60405180910390f35b6107976004803603810190610792919061359a565b611895565b005b3480156107a557600080fd5b506107c060048036038101906107bb9190613551565b611a87565b005b3480156107ce57600080fd5b506107e960048036038101906107e4919061344a565b611b1d565b005b3480156107f757600080fd5b50610800611c9e565b60405161080d9190613bb2565b60405180910390f35b34801561082257600080fd5b5061083d600480360381019061083891906133c7565b611cb1565b005b34801561084b57600080fd5b506108666004803603810190610861919061359a565b611d0d565b6040516108739190613bcd565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e91906134ca565b611e32565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190613334565b611f1d565b6040516108d99190613bb2565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190613307565b611fb1565b005b600f805461091890614216565b80601f016020809104026020016040519081016040528092919081815260200182805461094490614216565b80156109915780601f1061096657610100808354040283529160200191610991565b820191906000526020600020905b81548152906001019060200180831161097457829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a745750610a73826120a9565b5b9050919050565b606060018054610a8a90614216565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab690614216565b8015610b035780601f10610ad857610100808354040283529160200191610b03565b820191906000526020600020905b815481529060010190602001808311610ae657829003601f168201915b5050505050905090565b6000610b1882612113565b610b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4e90613eaf565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9d826111f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0590613daf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c2d612120565b73ffffffffffffffffffffffffffffffffffffffff161480610c5c5750610c5b81610c56612120565b611f1d565b5b610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290613c8f565b60405180910390fd5b610ca6838383612128565b505050565b600c5481565b610cb9612120565b73ffffffffffffffffffffffffffffffffffffffff16610cd7611753565b73ffffffffffffffffffffffffffffffffffffffff1614610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2490613cef565b60405180910390fd5b8060109080519060200190610d439291906130e1565b5050565b60008054905090565b610d5b8383836121da565b505050565b600b5481565b610d6e612120565b73ffffffffffffffffffffffffffffffffffffffff16610d8c611753565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990613cef565b60405180910390fd5b60026008541415610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90613e6f565b60405180910390fd5b60026008819055506000610e3a611753565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e5d90613b36565b60006040518083038185875af1925050503d8060008114610e9a576040519150601f19603f3d011682016040523d82523d6000602084013e610e9f565b606091505b5050905080610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda90613def565b60405180910390fd5b506001600881905550565b60108054610efb90614216565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2790614216565b8015610f745780601f10610f4957610100808354040283529160200191610f74565b820191906000526020600020905b815481529060010190602001808311610f5757829003601f168201915b505050505081565b600d5481565b80600081118015610f955750600c548111155b610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90613bef565b60405180910390fd5b600b5481600054610fe5919061402f565b1115611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90613dcf565b60405180910390fd5b61102e612120565b73ffffffffffffffffffffffffffffffffffffffff1661104c611753565b73ffffffffffffffffffffffffffffffffffffffff16146110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109990613cef565b60405180910390fd5b6110ac838361271a565b505050565b6110cc83838360405180602001604052806000815250611cb1565b505050565b6110d9612120565b73ffffffffffffffffffffffffffffffffffffffff166110f7611753565b73ffffffffffffffffffffffffffffffffffffffff161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613cef565b60405180910390fd5b80600760146101000a81548160ff02191690831515021790555050565b611172612120565b73ffffffffffffffffffffffffffffffffffffffff16611190611753565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613cef565b60405180910390fd5b80600c8190555050565b60006111fb82612738565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e90613caf565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6112f7612120565b73ffffffffffffffffffffffffffffffffffffffff16611315611753565b73ffffffffffffffffffffffffffffffffffffffff161461136b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136290613cef565b60405180910390fd5b600760149054906101000a900460ff166113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b190613c2f565b60405180910390fd5b6113c460006128d2565b565b600a60009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900460ff1681565b6011805461140890614216565b80601f016020809104026020016040519081016040528092919081815260200182805461143490614216565b80156114815780601f1061145657610100808354040283529160200191611481565b820191906000526020600020905b81548152906001019060200180831161146457829003601f168201915b505050505081565b611491612120565b73ffffffffffffffffffffffffffffffffffffffff166114af611753565b73ffffffffffffffffffffffffffffffffffffffff1614611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc90613cef565b60405180910390fd5b80600f908051906020019061151b9291906130e1565b5050565b611527612120565b73ffffffffffffffffffffffffffffffffffffffff16611545611753565b73ffffffffffffffffffffffffffffffffffffffff161461159b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159290613cef565b60405180910390fd5b600b5481106115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690613d8f565b60405180910390fd5b600054811015611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90613d8f565b60405180910390fd5b80600b8190555050565b611636612120565b73ffffffffffffffffffffffffffffffffffffffff16611654611753565b73ffffffffffffffffffffffffffffffffffffffff16146116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190613cef565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6116cf612120565b73ffffffffffffffffffffffffffffffffffffffff166116ed611753565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613cef565b60405180910390fd5b80600d8190555050565b60095481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611785612120565b73ffffffffffffffffffffffffffffffffffffffff166117a3611753565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090613cef565b60405180910390fd5b8060098190555050565b60606002805461181290614216565b80601f016020809104026020016040519081016040528092919081815260200182805461183e90614216565b801561188b5780601f106118605761010080835404028352916020019161188b565b820191906000526020600020905b81548152906001019060200180831161186e57829003601f168201915b5050505050905090565b806000811180156118a85750600c548111155b6118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90613bef565b60405180910390fd5b600b54816000546118f8919061402f565b1115611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090613dcf565b60405180910390fd5b6002600854141561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690613e6f565b60405180910390fd5b6002600881905550600e60009054906101000a900460ff166119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd90613d6f565b60405180910390fd5b6000600d546000541015611a1c57600a60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050611a2d565b60095483611a2a91906140b6565b90505b80341015611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790613ecf565b60405180910390fd5b611a7a338461271a565b5060016008819055505050565b611a8f612120565b73ffffffffffffffffffffffffffffffffffffffff16611aad611753565b73ffffffffffffffffffffffffffffffffffffffff1614611b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afa90613cef565b60405180910390fd5b8060119080519060200190611b199291906130e1565b5050565b611b25612120565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90613d2f565b60405180910390fd5b8060066000611ba0612120565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c4d612120565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c929190613bb2565b60405180910390a35050565b600e60019054906101000a900460ff1681565b611cbc8484846121da565b611cc884848484612998565b611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90613e0f565b60405180910390fd5b50505050565b6060611d1882612113565b611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90613d0f565b60405180910390fd5b60001515600e60019054906101000a900460ff1615151415611dd157600060118054611d8290614216565b905011611d9e5760405180602001604052806000815250611dca565b6011611da983612b2f565b604051602001611dba929190613b07565b6040516020818303038152906040525b9050611e2d565b6000611ddb612c90565b90506000815111611dfb5760405180602001604052806000815250611e29565b80611e0584612b2f565b6010604051602001611e1993929190613ad6565b6040516020818303038152906040525b9150505b919050565b611e3a612120565b73ffffffffffffffffffffffffffffffffffffffff16611e58611753565b73ffffffffffffffffffffffffffffffffffffffff1614611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590613cef565b60405180910390fd5b6000611eb8612c90565b9050600081511415611eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef690613eef565b60405180910390fd5b81600e60016101000a81548160ff0219169083151502179055505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fb9612120565b73ffffffffffffffffffffffffffffffffffffffff16611fd7611753565b73ffffffffffffffffffffffffffffffffffffffff161461202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490613cef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209490613c0f565b60405180910390fd5b6120a6816128d2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006121e582612738565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661220c612120565b73ffffffffffffffffffffffffffffffffffffffff1614806122685750612231612120565b73ffffffffffffffffffffffffffffffffffffffff1661225084610b0d565b73ffffffffffffffffffffffffffffffffffffffff16145b806122845750612283826000015161227e612120565b611f1d565b5b9050806122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd90613d4f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f90613ccf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90613c6f565b60405180910390fd5b6123b58585856001612d22565b6123c56000848460000151612128565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126aa5761260981612113565b156126a95782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127138585856001612d28565b5050505050565b612734828260405180602001604052806000815250612d2e565b5050565b612740613167565b61274982612113565b612788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277f90613c4f565b60405180910390fd5b60008290505b60008110612891576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146128825780925050506128cd565b5080806001900391505061278e565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c490613e8f565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006129b98473ffffffffffffffffffffffffffffffffffffffff16612d40565b15612b22578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e2612120565b8786866040518563ffffffff1660e01b8152600401612a049493929190613b66565b602060405180830381600087803b158015612a1e57600080fd5b505af1925050508015612a4f57506040513d601f19601f82011682018060405250810190612a4c9190613524565b60015b612ad2573d8060008114612a7f576040519150601f19603f3d011682016040523d82523d6000602084013e612a84565b606091505b50600081511415612aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac190613e0f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b27565b600190505b949350505050565b60606000821415612b77576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c8b565b600082905060005b60008214612ba9578080612b9290614279565b915050600a82612ba29190614085565b9150612b7f565b60008167ffffffffffffffff811115612bc557612bc46143af565b5b6040519080825280601f01601f191660200182016040528015612bf75781602001600182028036833780820191505090505b5090505b60008514612c8457600182612c109190614110565b9150600a85612c1f91906142c2565b6030612c2b919061402f565b60f81b818381518110612c4157612c40614380565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c7d9190614085565b9450612bfb565b8093505050505b919050565b6060600f8054612c9f90614216565b80601f0160208091040260200160405190810160405280929190818152602001828054612ccb90614216565b8015612d185780601f10612ced57610100808354040283529160200191612d18565b820191906000526020600020905b815481529060010190602001808311612cfb57829003601f168201915b5050505050905090565b50505050565b50505050565b612d3b8383836001612d63565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd090613e2f565b60405180910390fd5b6000841415612e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1490613e4f565b60405180910390fd5b612e2a6000868387612d22565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156130c457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156130af5761306f6000888488612998565b6130ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a590613e0f565b60405180910390fd5b5b81806001019250508080600101915050612ff8565b5080600081905550506130da6000868387612d28565b5050505050565b8280546130ed90614216565b90600052602060002090601f01602090048101928261310f5760008555613156565b82601f1061312857805160ff1916838001178555613156565b82800160010185558215613156579182015b8281111561315557825182559160200191906001019061313a565b5b50905061316391906131a1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156131ba5760008160009055506001016131a2565b5090565b60006131d16131cc84613f6a565b613f45565b9050828152602081018484840111156131ed576131ec6143e3565b5b6131f88482856141d4565b509392505050565b600061321361320e84613f9b565b613f45565b90508281526020810184848401111561322f5761322e6143e3565b5b61323a8482856141d4565b509392505050565b60008135905061325181614ab6565b92915050565b60008135905061326681614acd565b92915050565b60008135905061327b81614ae4565b92915050565b60008151905061329081614ae4565b92915050565b600082601f8301126132ab576132aa6143de565b5b81356132bb8482602086016131be565b91505092915050565b600082601f8301126132d9576132d86143de565b5b81356132e9848260208601613200565b91505092915050565b60008135905061330181614afb565b92915050565b60006020828403121561331d5761331c6143ed565b5b600061332b84828501613242565b91505092915050565b6000806040838503121561334b5761334a6143ed565b5b600061335985828601613242565b925050602061336a85828601613242565b9150509250929050565b60008060006060848603121561338d5761338c6143ed565b5b600061339b86828701613242565b93505060206133ac86828701613242565b92505060406133bd868287016132f2565b9150509250925092565b600080600080608085870312156133e1576133e06143ed565b5b60006133ef87828801613242565b945050602061340087828801613242565b9350506040613411878288016132f2565b925050606085013567ffffffffffffffff811115613432576134316143e8565b5b61343e87828801613296565b91505092959194509250565b60008060408385031215613461576134606143ed565b5b600061346f85828601613242565b925050602061348085828601613257565b9150509250929050565b600080604083850312156134a1576134a06143ed565b5b60006134af85828601613242565b92505060206134c0858286016132f2565b9150509250929050565b6000602082840312156134e0576134df6143ed565b5b60006134ee84828501613257565b91505092915050565b60006020828403121561350d5761350c6143ed565b5b600061351b8482850161326c565b91505092915050565b60006020828403121561353a576135396143ed565b5b600061354884828501613281565b91505092915050565b600060208284031215613567576135666143ed565b5b600082013567ffffffffffffffff811115613585576135846143e8565b5b613591848285016132c4565b91505092915050565b6000602082840312156135b0576135af6143ed565b5b60006135be848285016132f2565b91505092915050565b6135d081614144565b82525050565b6135df81614156565b82525050565b60006135f082613fe1565b6135fa8185613ff7565b935061360a8185602086016141e3565b613613816143f2565b840191505092915050565b600061362982613fec565b6136338185614013565b93506136438185602086016141e3565b61364c816143f2565b840191505092915050565b600061366282613fec565b61366c8185614024565b935061367c8185602086016141e3565b80840191505092915050565b6000815461369581614216565b61369f8186614024565b945060018216600081146136ba57600181146136cb576136fe565b60ff198316865281860193506136fe565b6136d485613fcc565b60005b838110156136f6578154818901526001820191506020810190506136d7565b838801955050505b50505092915050565b6000613714603483614013565b915061371f82614403565b604082019050919050565b6000613737602683614013565b915061374282614452565b604082019050919050565b600061375a602583614013565b9150613765826144a1565b604082019050919050565b600061377d602a83614013565b9150613788826144f0565b604082019050919050565b60006137a0602583614013565b91506137ab8261453f565b604082019050919050565b60006137c3603983614013565b91506137ce8261458e565b604082019050919050565b60006137e6602b83614013565b91506137f1826145dd565b604082019050919050565b6000613809602683614013565b91506138148261462c565b604082019050919050565b600061382c600583614024565b91506138378261467b565b600582019050919050565b600061384f602083614013565b915061385a826146a4565b602082019050919050565b6000613872602f83614013565b915061387d826146cd565b604082019050919050565b6000613895601a83614013565b91506138a08261471c565b602082019050919050565b60006138b8603283614013565b91506138c382614745565b604082019050919050565b60006138db601383614013565b91506138e682614794565b602082019050919050565b60006138fe601683614013565b9150613909826147bd565b602082019050919050565b6000613921602283614013565b915061392c826147e6565b604082019050919050565b6000613944600083614008565b915061394f82614835565b600082019050919050565b6000613967601483614013565b915061397282614838565b602082019050919050565b600061398a601083614013565b915061399582614861565b602082019050919050565b60006139ad603383614013565b91506139b88261488a565b604082019050919050565b60006139d0602183614013565b91506139db826148d9565b604082019050919050565b60006139f3602883614013565b91506139fe82614928565b604082019050919050565b6000613a16601f83614013565b9150613a2182614977565b602082019050919050565b6000613a39602f83614013565b9150613a44826149a0565b604082019050919050565b6000613a5c602d83614013565b9150613a67826149ef565b604082019050919050565b6000613a7f601383614013565b9150613a8a82614a3e565b602082019050919050565b6000613aa2602c83614013565b9150613aad82614a67565b604082019050919050565b613ac18161418e565b82525050565b613ad0816141ca565b82525050565b6000613ae28286613657565b9150613aee8285613657565b9150613afa8284613688565b9150819050949350505050565b6000613b138285613688565b9150613b1f8284613657565b9150613b2a8261381f565b91508190509392505050565b6000613b4182613937565b9150819050919050565b6000602082019050613b6060008301846135c7565b92915050565b6000608082019050613b7b60008301876135c7565b613b8860208301866135c7565b613b956040830185613ac7565b8181036060830152613ba781846135e5565b905095945050505050565b6000602082019050613bc760008301846135d6565b92915050565b60006020820190508181036000830152613be7818461361e565b905092915050565b60006020820190508181036000830152613c0881613707565b9050919050565b60006020820190508181036000830152613c288161372a565b9050919050565b60006020820190508181036000830152613c488161374d565b9050919050565b60006020820190508181036000830152613c6881613770565b9050919050565b60006020820190508181036000830152613c8881613793565b9050919050565b60006020820190508181036000830152613ca8816137b6565b9050919050565b60006020820190508181036000830152613cc8816137d9565b9050919050565b60006020820190508181036000830152613ce8816137fc565b9050919050565b60006020820190508181036000830152613d0881613842565b9050919050565b60006020820190508181036000830152613d2881613865565b9050919050565b60006020820190508181036000830152613d4881613888565b9050919050565b60006020820190508181036000830152613d68816138ab565b9050919050565b60006020820190508181036000830152613d88816138ce565b9050919050565b60006020820190508181036000830152613da8816138f1565b9050919050565b60006020820190508181036000830152613dc881613914565b9050919050565b60006020820190508181036000830152613de88161395a565b9050919050565b60006020820190508181036000830152613e088161397d565b9050919050565b60006020820190508181036000830152613e28816139a0565b9050919050565b60006020820190508181036000830152613e48816139c3565b9050919050565b60006020820190508181036000830152613e68816139e6565b9050919050565b60006020820190508181036000830152613e8881613a09565b9050919050565b60006020820190508181036000830152613ea881613a2c565b9050919050565b60006020820190508181036000830152613ec881613a4f565b9050919050565b60006020820190508181036000830152613ee881613a72565b9050919050565b60006020820190508181036000830152613f0881613a95565b9050919050565b6000602082019050613f246000830184613ab8565b92915050565b6000602082019050613f3f6000830184613ac7565b92915050565b6000613f4f613f60565b9050613f5b8282614248565b919050565b6000604051905090565b600067ffffffffffffffff821115613f8557613f846143af565b5b613f8e826143f2565b9050602081019050919050565b600067ffffffffffffffff821115613fb657613fb56143af565b5b613fbf826143f2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061403a826141ca565b9150614045836141ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561407a576140796142f3565b5b828201905092915050565b6000614090826141ca565b915061409b836141ca565b9250826140ab576140aa614322565b5b828204905092915050565b60006140c1826141ca565b91506140cc836141ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614105576141046142f3565b5b828202905092915050565b600061411b826141ca565b9150614126836141ca565b925082821015614139576141386142f3565b5b828203905092915050565b600061414f826141aa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142015780820151818401526020810190506141e6565b83811115614210576000848401525b50505050565b6000600282049050600182168061422e57607f821691505b6020821081141561424257614241614351565b5b50919050565b614251826143f2565b810181811067ffffffffffffffff821117156142705761426f6143af565b5b80604052505050565b6000614284826141ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142b7576142b66142f3565b5b600182019050919050565b60006142cd826141ca565b91506142d8836141ca565b9250826142e8576142e7614322565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e76616c6964206d696e7420616d6f756e74206f72207472616e736163746960008201527f6f6e206d6178696d756d20657863656564656421000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f77656420746f2072656e6f7563652e20536574207661726960008201527f61626c6521000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652100000000000000000000000000600082015250565b7f496e76616c6964206e6577206d617820737570706c7900000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b7f5365742074686520555249707265666978206265666f72652072657665616c6960008201527f6e6720746865204e465473210000000000000000000000000000000000000000602082015250565b614abf81614144565b8114614aca57600080fd5b50565b614ad681614156565b8114614ae157600080fd5b50565b614aed81614162565b8114614af857600080fd5b50565b614b04816141ca565b8114614b0f57600080fd5b5056fea264697066735822122092cb8be749ac04743980eb189109df1654748e6a58574dda47c4e9350526a21d64736f6c63430008070033

Deployed Bytecode Sourcemap

40512:4258:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40972:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27606:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29381:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30943:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30464:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40752:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43481:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27443:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31819:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40713:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44546:221;;;;;;;;;;;;;:::i;:::-;;41007:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40801:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44392:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32052:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7019:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42404:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29190:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27963:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7696:187;;;;;;;;;;;;;:::i;:::-;;40671:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40894;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41047:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43365:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42139:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42534:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42651:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40613:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6924:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42035:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29550:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43904:480;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42963:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31229:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40935:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32300:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41389:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43115:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31588:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8038:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40972:28;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27606:293::-;27708:4;27756:25;27741:40;;;:11;:40;;;;:101;;;;27809:33;27794:48;;;:11;:48;;;;27741:101;:150;;;;27855:36;27879:11;27855:23;:36::i;:::-;27741:150;27725:166;;27606:293;;;:::o;29381:100::-;29435:13;29468:5;29461:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29381:100;:::o;30943:214::-;31011:7;31039:16;31047:7;31039;:16::i;:::-;31031:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31125:15;:24;31141:7;31125:24;;;;;;;;;;;;;;;;;;;;;31118:31;;30943:214;;;:::o;30464:413::-;30537:13;30553:24;30569:7;30553:15;:24::i;:::-;30537:40;;30602:5;30596:11;;:2;:11;;;;30588:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30697:5;30681:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30706:37;30723:5;30730:12;:10;:12::i;:::-;30706:16;:37::i;:::-;30681:62;30659:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;30841:28;30850:2;30854:7;30863:5;30841:8;:28::i;:::-;30526:351;30464:413;;:::o;40752:42::-;;;;:::o;43481:108::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43571:10:::1;43559:9;:22;;;;;;;;;;;;:::i;:::-;;43481:108:::0;:::o;27443:91::-;27487:7;27514:12;;27507:19;;27443:91;:::o;31819:162::-;31945:28;31955:4;31961:2;31965:7;31945:9;:28::i;:::-;31819:162;;;:::o;40713:32::-;;;;:::o;44546:221::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1:::1;2445:7;;:19;;2437:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1;2578:7;:18;;;;44649:7:::2;44670;:5;:7::i;:::-;44662:21;;44691;44662:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44648:69;;;44736:2;44728:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;44598:169;1803:1:::1;2757:7;:22;;;;44546:221::o:0;41007:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40801:47::-;;;;:::o;44392:146::-;44469:11;43693:1;43679:11;:15;:56;;;;;43713:22;;43698:11;:37;;43679:56;43671:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;43841:10;;43826:11;43811:12;;:26;;;;:::i;:::-;:40;;43803:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7276:12:::1;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44503:27:::2;44513:3;44518:11;44503:9;:27::i;:::-;44392:146:::0;;;:::o;32052:177::-;32182:39;32199:4;32205:2;32209:7;32182:39;;;;;;;;;;;;:16;:39::i;:::-;32052:177;;;:::o;7019:113::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7118:6:::1;7092:23;;:32;;;;;;;;;;;;;;;;;;7019:113:::0;:::o;42404:122::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42506:12:::1;42481:22;:37;;;;42404:122:::0;:::o;29190:124::-;29254:7;29281:20;29293:7;29281:11;:20::i;:::-;:25;;;29274:32;;29190:124;;;:::o;27963:221::-;28027:7;28072:1;28055:19;;:5;:19;;;;28047:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28148:12;:19;28161:5;28148:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28140:36;;28133:43;;27963:221;;;:::o;7696:187::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7769:23:::1;;;;;;;;;;;7761:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7845:30;7872:1;7845:18;:30::i;:::-;7696:187::o:0;40671:34::-;;;;;;;;;;;;;:::o;40894:::-;;;;;;;;;;;;;:::o;41047:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43365:108::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43455:10:::1;43443:9;:22;;;;;;;;;;;;:::i;:::-;;43365:108:::0;:::o;42139:257::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42241:10:::1;;42226:12;:25;42218:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;42313:12;;42297;:28;;42289:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;42376:12;42363:10;:25;;;;42139:257:::0;:::o;42534:109::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42623:12:::1;42606:14;;:29;;;;;;;;;;;;;;;;;;42534:109:::0;:::o;42651:154::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42775:22:::1;42746:26;:51;;;;42651:154:::0;:::o;40613:40::-;;;;:::o;6924:87::-;6970:7;6997:6;;;;;;;;;;;6990:13;;6924:87;:::o;42035:96::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42112:11:::1;42104:5;:19;;;;42035:96:::0;:::o;29550:104::-;29606:13;29639:7;29632:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29550:104;:::o;43904:480::-;43971:11;43693:1;43679:11;:15;:56;;;;;43713:22;;43698:11;:37;;43679:56;43671:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;43841:10;;43826:11;43811:12;;:26;;;;:::i;:::-;:40;;43803:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1:::1;2445:7;;:19;;2437:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1;2578:7;:18;;;;44016:14:::2;;;;;;;;;;;44008:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;44067:13;44112:26;;44097:12;;:41;44093:174;;;44163:15;;;;;;;;;;;44155:23;;;;44093:174;;;44250:5;;44236:11;:19;;;;:::i;:::-;44228:27;;44093:174;44300:5;44287:9;:18;;44279:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;44342:34;44352:10;44364:11;44342:9;:34::i;:::-;43997:387;1803:1:::1;2757:7;:22;;;;43904:480:::0;;:::o;42963:143::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43079:18:::1;43059:17;:38;;;;;;;;;;;;:::i;:::-;;42963:143:::0;:::o;31229:288::-;31336:12;:10;:12::i;:::-;31324:24;;:8;:24;;;;31316:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31437:8;31392:18;:32;31411:12;:10;:12::i;:::-;31392:32;;;;;;;;;;;;;;;:42;31425:8;31392:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31490:8;31461:48;;31476:12;:10;:12::i;:::-;31461:48;;;31500:8;31461:48;;;;;;:::i;:::-;;;;;;;;31229:288;;:::o;40935:28::-;;;;;;;;;;;;;:::o;32300:355::-;32459:28;32469:4;32475:2;32479:7;32459:9;:28::i;:::-;32520:48;32543:4;32549:2;32553:7;32562:5;32520:22;:48::i;:::-;32498:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;32300:355;;;;:::o;41389:613::-;41488:13;41529:17;41537:8;41529:7;:17::i;:::-;41513:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;41638:5;41626:17;;:8;;;;;;;;;;;:17;;;41622:181;;;41695:1;41667:17;41661:31;;;;;:::i;:::-;;;:35;:134;;;;;;;;;;;;;;;;;41732:17;41751:19;:8;:17;:19::i;:::-;41715:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41661:134;41654:141;;;;41622:181;41811:28;41842:10;:8;:10::i;:::-;41811:41;;41897:1;41872:14;41866:28;:32;:130;;;;;;;;;;;;;;;;;41934:14;41950:19;:8;:17;:19::i;:::-;41971:9;41917:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41866:130;41859:137;;;41389:613;;;;:::o;43115:242::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43179:28:::1;43210:10;:8;:10::i;:::-;43179:41;;43271:1;43245:14;43239:28;:33;;43231:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;43343:6;43332:8;;:17;;;;;;;;;;;;;;;;;;43168:189;43115:242:::0;:::o;31588:164::-;31685:4;31709:18;:25;31728:5;31709:25;;;;;;;;;;;;;;;:35;31735:8;31709:35;;;;;;;;;;;;;;;;;;;;;;;;;31702:42;;31588:164;;;;:::o;8038:201::-;7276:12;:10;:12::i;:::-;7265:23;;:7;:5;:7::i;:::-;:23;;;7257:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8147:1:::1;8127:22;;:8;:22;;;;8119:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8203:28;8222:8;8203:18;:28::i;:::-;8038:201:::0;:::o;19913:157::-;19998:4;20037:25;20022:40;;;:11;:40;;;;20015:47;;19913:157;;;:::o;32910:113::-;32967:4;33002:12;;32992:7;:22;32984:31;;32910:113;;;:::o;5597:98::-;5650:7;5677:10;5670:17;;5597:98;:::o;37692:196::-;37834:2;37807:15;:24;37823:7;37807:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37872:7;37868:2;37852:28;;37861:5;37852:28;;;;;;;;;;;;37692:196;;;:::o;35640:1934::-;35755:35;35793:20;35805:7;35793:11;:20::i;:::-;35755:58;;35826:22;35868:13;:18;;;35852:34;;:12;:10;:12::i;:::-;:34;;;:83;;;;35923:12;:10;:12::i;:::-;35899:36;;:20;35911:7;35899:11;:20::i;:::-;:36;;;35852:83;:146;;;;35948:50;35965:13;:18;;;35985:12;:10;:12::i;:::-;35948:16;:50::i;:::-;35852:146;35826:173;;36020:17;36012:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;36135:4;36113:26;;:13;:18;;;:26;;;36105:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;36215:1;36201:16;;:2;:16;;;;36193:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;36272:43;36294:4;36300:2;36304:7;36313:1;36272:21;:43::i;:::-;36380:49;36397:1;36401:7;36410:13;:18;;;36380:8;:49::i;:::-;36747:1;36717:12;:18;36730:4;36717:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36787:1;36759:12;:16;36772:2;36759:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36829:2;36801:11;:20;36813:7;36801:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;36887:15;36842:11;:20;36854:7;36842:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;37143:19;37175:1;37165:7;:11;37143:33;;37232:1;37191:43;;:11;:24;37203:11;37191:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37187:275;;;37255:20;37263:11;37255:7;:20::i;:::-;37251:200;;;37328:13;:18;;;37296:11;:24;37308:11;37296:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;37407:13;:28;;;37365:11;:24;37377:11;37365:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;37251:200;37187:275;36696:773;37505:7;37501:2;37486:27;;37495:4;37486:27;;;;;;;;;;;;37524:42;37545:4;37551:2;37555:7;37564:1;37524:20;:42::i;:::-;35744:1830;;35640:1934;;;:::o;33031:104::-;33100:27;33110:2;33114:8;33100:27;;;;;;;;;;;;:9;:27::i;:::-;33031:104;;:::o;28623:505::-;28684:21;;:::i;:::-;28726:16;28734:7;28726;:16::i;:::-;28718:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28824:12;28839:7;28824:22;;28819:225;28856:1;28848:4;:9;28819:225;;28882:31;28916:11;:17;28928:4;28916:17;;;;;;;;;;;28882:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28978:1;28952:28;;:9;:14;;;:28;;;28948:85;;29008:9;29001:16;;;;;;28948:85;28867:177;28859:6;;;;;;;;28819:225;;;;29063:57;;;;;;;;;;:::i;:::-;;;;;;;;28623:505;;;;:::o;8399:191::-;8473:16;8492:6;;;;;;;;;;;8473:25;;8518:8;8509:6;;:17;;;;;;;;;;;;;;;;;;8573:8;8542:40;;8563:8;8542:40;;;;;;;;;;;;8462:128;8399:191;:::o;38453:804::-;38608:4;38629:15;:2;:13;;;:15::i;:::-;38625:625;;;38681:2;38665:36;;;38702:12;:10;:12::i;:::-;38716:4;38722:7;38731:5;38665:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38661:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38928:1;38911:6;:13;:18;38907:273;;;38954:61;;;;;;;;;;:::i;:::-;;;;;;;;38907:273;39130:6;39124:13;39115:6;39111:2;39107:15;39100:38;38661:534;38798:45;;;38788:55;;;:6;:55;;;;38781:62;;;;;38625:625;39234:4;39227:11;;38453:804;;;;;;;:::o;3159:723::-;3215:13;3445:1;3436:5;:10;3432:53;;;3463:10;;;;;;;;;;;;;;;;;;;;;3432:53;3495:12;3510:5;3495:20;;3526:14;3551:78;3566:1;3558:4;:9;3551:78;;3584:8;;;;;:::i;:::-;;;;3615:2;3607:10;;;;;:::i;:::-;;;3551:78;;;3639:19;3671:6;3661:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3639:39;;3689:154;3705:1;3696:5;:10;3689:154;;3733:1;3723:11;;;;;:::i;:::-;;;3800:2;3792:5;:10;;;;:::i;:::-;3779:2;:24;;;;:::i;:::-;3766:39;;3749:6;3756;3749:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3829:2;3820:11;;;;;:::i;:::-;;;3689:154;;;3867:6;3853:21;;;;;3159:723;;;;:::o;41271:110::-;41331:13;41364:9;41357:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41271:110;:::o;39745:159::-;;;;;:::o;40316:158::-;;;;;:::o;33498:163::-;33621:32;33627:2;33631:8;33641:5;33648:4;33621:5;:32::i;:::-;33498:163;;;:::o;9830:326::-;9890:4;10147:1;10125:7;:19;;;:23;10118:30;;9830:326;;;:::o;33920:1466::-;34059:20;34082:12;;34059:35;;34127:1;34113:16;;:2;:16;;;;34105:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34198:1;34186:8;:13;;34178:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34257:61;34287:1;34291:2;34295:12;34309:8;34257:21;:61::i;:::-;34624:8;34588:12;:16;34601:2;34588:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34685:8;34644:12;:16;34657:2;34644:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34740:2;34707:11;:25;34719:12;34707:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34803:15;34753:11;:25;34765:12;34753:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34832:20;34855:12;34832:35;;34885:9;34880:379;34900:8;34896:1;:12;34880:379;;;34960:12;34956:2;34935:38;;34952:1;34935:38;;;;;;;;;;;;34992:4;34988:229;;;35047:59;35078:1;35082:2;35086:12;35100:5;35047:22;:59::i;:::-;35017:184;;;;;;;;;;;;:::i;:::-;;;;;;;;;34988:229;35233:14;;;;;;;34910:3;;;;;;;34880:379;;;;35286:12;35271;:27;;;;34567:739;35318:60;35347:1;35351:2;35355:12;35369:8;35318:20;:60::i;:::-;34048:1338;33920:1466;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8869:845::-;8972:3;9009:5;9003:12;9038:36;9064:9;9038:36;:::i;:::-;9090:89;9172:6;9167:3;9090:89;:::i;:::-;9083:96;;9210:1;9199:9;9195:17;9226:1;9221:137;;;;9372:1;9367:341;;;;9188:520;;9221:137;9305:4;9301:9;9290;9286:25;9281:3;9274:38;9341:6;9336:3;9332:16;9325:23;;9221:137;;9367:341;9434:38;9466:5;9434:38;:::i;:::-;9494:1;9508:154;9522:6;9519:1;9516:13;9508:154;;;9596:7;9590:14;9586:1;9581:3;9577:11;9570:35;9646:1;9637:7;9633:15;9622:26;;9544:4;9541:1;9537:12;9532:17;;9508:154;;;9691:6;9686:3;9682:16;9675:23;;9374:334;;9188:520;;8976:738;;8869:845;;;;:::o;9720:366::-;9862:3;9883:67;9947:2;9942:3;9883:67;:::i;:::-;9876:74;;9959:93;10048:3;9959:93;:::i;:::-;10077:2;10072:3;10068:12;10061:19;;9720:366;;;:::o;10092:::-;10234:3;10255:67;10319:2;10314:3;10255:67;:::i;:::-;10248:74;;10331:93;10420:3;10331:93;:::i;:::-;10449:2;10444:3;10440:12;10433:19;;10092:366;;;:::o;10464:::-;10606:3;10627:67;10691:2;10686:3;10627:67;:::i;:::-;10620:74;;10703:93;10792:3;10703:93;:::i;:::-;10821:2;10816:3;10812:12;10805:19;;10464:366;;;:::o;10836:::-;10978:3;10999:67;11063:2;11058:3;10999:67;:::i;:::-;10992:74;;11075:93;11164:3;11075:93;:::i;:::-;11193:2;11188:3;11184:12;11177:19;;10836:366;;;:::o;11208:::-;11350:3;11371:67;11435:2;11430:3;11371:67;:::i;:::-;11364:74;;11447:93;11536:3;11447:93;:::i;:::-;11565:2;11560:3;11556:12;11549:19;;11208:366;;;:::o;11580:::-;11722:3;11743:67;11807:2;11802:3;11743:67;:::i;:::-;11736:74;;11819:93;11908:3;11819:93;:::i;:::-;11937:2;11932:3;11928:12;11921:19;;11580:366;;;:::o;11952:::-;12094:3;12115:67;12179:2;12174:3;12115:67;:::i;:::-;12108:74;;12191:93;12280:3;12191:93;:::i;:::-;12309:2;12304:3;12300:12;12293:19;;11952:366;;;:::o;12324:::-;12466:3;12487:67;12551:2;12546:3;12487:67;:::i;:::-;12480:74;;12563:93;12652:3;12563:93;:::i;:::-;12681:2;12676:3;12672:12;12665:19;;12324:366;;;:::o;12696:400::-;12856:3;12877:84;12959:1;12954:3;12877:84;:::i;:::-;12870:91;;12970:93;13059:3;12970:93;:::i;:::-;13088:1;13083:3;13079:11;13072:18;;12696:400;;;:::o;13102:366::-;13244:3;13265:67;13329:2;13324:3;13265:67;:::i;:::-;13258:74;;13341:93;13430:3;13341:93;:::i;:::-;13459:2;13454:3;13450:12;13443:19;;13102:366;;;:::o;13474:::-;13616:3;13637:67;13701:2;13696:3;13637:67;:::i;:::-;13630:74;;13713:93;13802:3;13713:93;:::i;:::-;13831:2;13826:3;13822:12;13815:19;;13474:366;;;:::o;13846:::-;13988:3;14009:67;14073:2;14068:3;14009:67;:::i;:::-;14002:74;;14085:93;14174:3;14085:93;:::i;:::-;14203:2;14198:3;14194:12;14187:19;;13846:366;;;:::o;14218:::-;14360:3;14381:67;14445:2;14440:3;14381:67;:::i;:::-;14374:74;;14457:93;14546:3;14457:93;:::i;:::-;14575:2;14570:3;14566:12;14559:19;;14218:366;;;:::o;14590:::-;14732:3;14753:67;14817:2;14812:3;14753:67;:::i;:::-;14746:74;;14829:93;14918:3;14829:93;:::i;:::-;14947:2;14942:3;14938:12;14931:19;;14590:366;;;:::o;14962:::-;15104:3;15125:67;15189:2;15184:3;15125:67;:::i;:::-;15118:74;;15201:93;15290:3;15201:93;:::i;:::-;15319:2;15314:3;15310:12;15303:19;;14962:366;;;:::o;15334:::-;15476:3;15497:67;15561:2;15556:3;15497:67;:::i;:::-;15490:74;;15573:93;15662:3;15573:93;:::i;:::-;15691:2;15686:3;15682:12;15675:19;;15334:366;;;:::o;15706:398::-;15865:3;15886:83;15967:1;15962:3;15886:83;:::i;:::-;15879:90;;15978:93;16067:3;15978:93;:::i;:::-;16096:1;16091:3;16087:11;16080:18;;15706:398;;;:::o;16110:366::-;16252:3;16273:67;16337:2;16332:3;16273:67;:::i;:::-;16266:74;;16349:93;16438:3;16349:93;:::i;:::-;16467:2;16462:3;16458:12;16451:19;;16110:366;;;:::o;16482:::-;16624:3;16645:67;16709:2;16704:3;16645:67;:::i;:::-;16638:74;;16721:93;16810:3;16721:93;:::i;:::-;16839:2;16834:3;16830:12;16823:19;;16482:366;;;:::o;16854:::-;16996:3;17017:67;17081:2;17076:3;17017:67;:::i;:::-;17010:74;;17093:93;17182:3;17093:93;:::i;:::-;17211:2;17206:3;17202:12;17195:19;;16854:366;;;:::o;17226:::-;17368:3;17389:67;17453:2;17448:3;17389:67;:::i;:::-;17382:74;;17465:93;17554:3;17465:93;:::i;:::-;17583:2;17578:3;17574:12;17567:19;;17226:366;;;:::o;17598:::-;17740:3;17761:67;17825:2;17820:3;17761:67;:::i;:::-;17754:74;;17837:93;17926:3;17837:93;:::i;:::-;17955:2;17950:3;17946:12;17939:19;;17598:366;;;:::o;17970:::-;18112:3;18133:67;18197:2;18192:3;18133:67;:::i;:::-;18126:74;;18209:93;18298:3;18209:93;:::i;:::-;18327:2;18322:3;18318:12;18311:19;;17970:366;;;:::o;18342:::-;18484:3;18505:67;18569:2;18564:3;18505:67;:::i;:::-;18498:74;;18581:93;18670:3;18581:93;:::i;:::-;18699:2;18694:3;18690:12;18683:19;;18342:366;;;:::o;18714:::-;18856:3;18877:67;18941:2;18936:3;18877:67;:::i;:::-;18870:74;;18953:93;19042:3;18953:93;:::i;:::-;19071:2;19066:3;19062:12;19055:19;;18714:366;;;:::o;19086:::-;19228:3;19249:67;19313:2;19308:3;19249:67;:::i;:::-;19242:74;;19325:93;19414:3;19325:93;:::i;:::-;19443:2;19438:3;19434:12;19427:19;;19086:366;;;:::o;19458:::-;19600:3;19621:67;19685:2;19680:3;19621:67;:::i;:::-;19614:74;;19697:93;19786:3;19697:93;:::i;:::-;19815:2;19810:3;19806:12;19799:19;;19458:366;;;:::o;19830:118::-;19917:24;19935:5;19917:24;:::i;:::-;19912:3;19905:37;19830:118;;:::o;19954:::-;20041:24;20059:5;20041:24;:::i;:::-;20036:3;20029:37;19954:118;;:::o;20078:589::-;20303:3;20325:95;20416:3;20407:6;20325:95;:::i;:::-;20318:102;;20437:95;20528:3;20519:6;20437:95;:::i;:::-;20430:102;;20549:92;20637:3;20628:6;20549:92;:::i;:::-;20542:99;;20658:3;20651:10;;20078:589;;;;;;:::o;20673:695::-;20951:3;20973:92;21061:3;21052:6;20973:92;:::i;:::-;20966:99;;21082:95;21173:3;21164:6;21082:95;:::i;:::-;21075:102;;21194:148;21338:3;21194:148;:::i;:::-;21187:155;;21359:3;21352:10;;20673:695;;;;;:::o;21374:379::-;21558:3;21580:147;21723:3;21580:147;:::i;:::-;21573:154;;21744:3;21737:10;;21374:379;;;:::o;21759:222::-;21852:4;21890:2;21879:9;21875:18;21867:26;;21903:71;21971:1;21960:9;21956:17;21947:6;21903:71;:::i;:::-;21759:222;;;;:::o;21987:640::-;22182:4;22220:3;22209:9;22205:19;22197:27;;22234:71;22302:1;22291:9;22287:17;22278:6;22234:71;:::i;:::-;22315:72;22383:2;22372:9;22368:18;22359:6;22315:72;:::i;:::-;22397;22465:2;22454:9;22450:18;22441:6;22397:72;:::i;:::-;22516:9;22510:4;22506:20;22501:2;22490:9;22486:18;22479:48;22544:76;22615:4;22606:6;22544:76;:::i;:::-;22536:84;;21987:640;;;;;;;:::o;22633:210::-;22720:4;22758:2;22747:9;22743:18;22735:26;;22771:65;22833:1;22822:9;22818:17;22809:6;22771:65;:::i;:::-;22633:210;;;;:::o;22849:313::-;22962:4;23000:2;22989:9;22985:18;22977:26;;23049:9;23043:4;23039:20;23035:1;23024:9;23020:17;23013:47;23077:78;23150:4;23141:6;23077:78;:::i;:::-;23069:86;;22849:313;;;;:::o;23168:419::-;23334:4;23372:2;23361:9;23357:18;23349:26;;23421:9;23415:4;23411:20;23407:1;23396:9;23392:17;23385:47;23449:131;23575:4;23449:131;:::i;:::-;23441:139;;23168:419;;;:::o;23593:::-;23759:4;23797:2;23786:9;23782:18;23774:26;;23846:9;23840:4;23836:20;23832:1;23821:9;23817:17;23810:47;23874:131;24000:4;23874:131;:::i;:::-;23866:139;;23593:419;;;:::o;24018:::-;24184:4;24222:2;24211:9;24207:18;24199:26;;24271:9;24265:4;24261:20;24257:1;24246:9;24242:17;24235:47;24299:131;24425:4;24299:131;:::i;:::-;24291:139;;24018:419;;;:::o;24443:::-;24609:4;24647:2;24636:9;24632:18;24624:26;;24696:9;24690:4;24686:20;24682:1;24671:9;24667:17;24660:47;24724:131;24850:4;24724:131;:::i;:::-;24716:139;;24443:419;;;:::o;24868:::-;25034:4;25072:2;25061:9;25057:18;25049:26;;25121:9;25115:4;25111:20;25107:1;25096:9;25092:17;25085:47;25149:131;25275:4;25149:131;:::i;:::-;25141:139;;24868:419;;;:::o;25293:::-;25459:4;25497:2;25486:9;25482:18;25474:26;;25546:9;25540:4;25536:20;25532:1;25521:9;25517:17;25510:47;25574:131;25700:4;25574:131;:::i;:::-;25566:139;;25293:419;;;:::o;25718:::-;25884:4;25922:2;25911:9;25907:18;25899:26;;25971:9;25965:4;25961:20;25957:1;25946:9;25942:17;25935:47;25999:131;26125:4;25999:131;:::i;:::-;25991:139;;25718:419;;;:::o;26143:::-;26309:4;26347:2;26336:9;26332:18;26324:26;;26396:9;26390:4;26386:20;26382:1;26371:9;26367:17;26360:47;26424:131;26550:4;26424:131;:::i;:::-;26416:139;;26143:419;;;:::o;26568:::-;26734:4;26772:2;26761:9;26757:18;26749:26;;26821:9;26815:4;26811:20;26807:1;26796:9;26792:17;26785:47;26849:131;26975:4;26849:131;:::i;:::-;26841:139;;26568:419;;;:::o;26993:::-;27159:4;27197:2;27186:9;27182:18;27174:26;;27246:9;27240:4;27236:20;27232:1;27221:9;27217:17;27210:47;27274:131;27400:4;27274:131;:::i;:::-;27266:139;;26993:419;;;:::o;27418:::-;27584:4;27622:2;27611:9;27607:18;27599:26;;27671:9;27665:4;27661:20;27657:1;27646:9;27642:17;27635:47;27699:131;27825:4;27699:131;:::i;:::-;27691:139;;27418:419;;;:::o;27843:::-;28009:4;28047:2;28036:9;28032:18;28024:26;;28096:9;28090:4;28086:20;28082:1;28071:9;28067:17;28060:47;28124:131;28250:4;28124:131;:::i;:::-;28116:139;;27843:419;;;:::o;28268:::-;28434:4;28472:2;28461:9;28457:18;28449:26;;28521:9;28515:4;28511:20;28507:1;28496:9;28492:17;28485:47;28549:131;28675:4;28549:131;:::i;:::-;28541:139;;28268:419;;;:::o;28693:::-;28859:4;28897:2;28886:9;28882:18;28874:26;;28946:9;28940:4;28936:20;28932:1;28921:9;28917:17;28910:47;28974:131;29100:4;28974:131;:::i;:::-;28966:139;;28693:419;;;:::o;29118:::-;29284:4;29322:2;29311:9;29307:18;29299:26;;29371:9;29365:4;29361:20;29357:1;29346:9;29342:17;29335:47;29399:131;29525:4;29399:131;:::i;:::-;29391:139;;29118:419;;;:::o;29543:::-;29709:4;29747:2;29736:9;29732:18;29724:26;;29796:9;29790:4;29786:20;29782:1;29771:9;29767:17;29760:47;29824:131;29950:4;29824:131;:::i;:::-;29816:139;;29543:419;;;:::o;29968:::-;30134:4;30172:2;30161:9;30157:18;30149:26;;30221:9;30215:4;30211:20;30207:1;30196:9;30192:17;30185:47;30249:131;30375:4;30249:131;:::i;:::-;30241:139;;29968:419;;;:::o;30393:::-;30559:4;30597:2;30586:9;30582:18;30574:26;;30646:9;30640:4;30636:20;30632:1;30621:9;30617:17;30610:47;30674:131;30800:4;30674:131;:::i;:::-;30666:139;;30393:419;;;:::o;30818:::-;30984:4;31022:2;31011:9;31007:18;30999:26;;31071:9;31065:4;31061:20;31057:1;31046:9;31042:17;31035:47;31099:131;31225:4;31099:131;:::i;:::-;31091:139;;30818:419;;;:::o;31243:::-;31409:4;31447:2;31436:9;31432:18;31424:26;;31496:9;31490:4;31486:20;31482:1;31471:9;31467:17;31460:47;31524:131;31650:4;31524:131;:::i;:::-;31516:139;;31243:419;;;:::o;31668:::-;31834:4;31872:2;31861:9;31857:18;31849:26;;31921:9;31915:4;31911:20;31907:1;31896:9;31892:17;31885:47;31949:131;32075:4;31949:131;:::i;:::-;31941:139;;31668:419;;;:::o;32093:::-;32259:4;32297:2;32286:9;32282:18;32274:26;;32346:9;32340:4;32336:20;32332:1;32321:9;32317:17;32310:47;32374:131;32500:4;32374:131;:::i;:::-;32366:139;;32093:419;;;:::o;32518:::-;32684:4;32722:2;32711:9;32707:18;32699:26;;32771:9;32765:4;32761:20;32757:1;32746:9;32742:17;32735:47;32799:131;32925:4;32799:131;:::i;:::-;32791:139;;32518:419;;;:::o;32943:::-;33109:4;33147:2;33136:9;33132:18;33124:26;;33196:9;33190:4;33186:20;33182:1;33171:9;33167:17;33160:47;33224:131;33350:4;33224:131;:::i;:::-;33216:139;;32943:419;;;:::o;33368:::-;33534:4;33572:2;33561:9;33557:18;33549:26;;33621:9;33615:4;33611:20;33607:1;33596:9;33592:17;33585:47;33649:131;33775:4;33649:131;:::i;:::-;33641:139;;33368:419;;;:::o;33793:222::-;33886:4;33924:2;33913:9;33909:18;33901:26;;33937:71;34005:1;33994:9;33990:17;33981:6;33937:71;:::i;:::-;33793:222;;;;:::o;34021:::-;34114:4;34152:2;34141:9;34137:18;34129:26;;34165:71;34233:1;34222:9;34218:17;34209:6;34165:71;:::i;:::-;34021:222;;;;:::o;34249:129::-;34283:6;34310:20;;:::i;:::-;34300:30;;34339:33;34367:4;34359:6;34339:33;:::i;:::-;34249:129;;;:::o;34384:75::-;34417:6;34450:2;34444:9;34434:19;;34384:75;:::o;34465:307::-;34526:4;34616:18;34608:6;34605:30;34602:56;;;34638:18;;:::i;:::-;34602:56;34676:29;34698:6;34676:29;:::i;:::-;34668:37;;34760:4;34754;34750:15;34742:23;;34465:307;;;:::o;34778:308::-;34840:4;34930:18;34922:6;34919:30;34916:56;;;34952:18;;:::i;:::-;34916:56;34990:29;35012:6;34990:29;:::i;:::-;34982:37;;35074:4;35068;35064:15;35056:23;;34778:308;;;:::o;35092:141::-;35141:4;35164:3;35156:11;;35187:3;35184:1;35177:14;35221:4;35218:1;35208:18;35200:26;;35092:141;;;:::o;35239:98::-;35290:6;35324:5;35318:12;35308:22;;35239:98;;;:::o;35343:99::-;35395:6;35429:5;35423:12;35413:22;;35343:99;;;:::o;35448:168::-;35531:11;35565:6;35560:3;35553:19;35605:4;35600:3;35596:14;35581:29;;35448:168;;;;:::o;35622:147::-;35723:11;35760:3;35745:18;;35622:147;;;;:::o;35775:169::-;35859:11;35893:6;35888:3;35881:19;35933:4;35928:3;35924:14;35909:29;;35775:169;;;;:::o;35950:148::-;36052:11;36089:3;36074:18;;35950:148;;;;:::o;36104:305::-;36144:3;36163:20;36181:1;36163:20;:::i;:::-;36158:25;;36197:20;36215:1;36197:20;:::i;:::-;36192:25;;36351:1;36283:66;36279:74;36276:1;36273:81;36270:107;;;36357:18;;:::i;:::-;36270:107;36401:1;36398;36394:9;36387:16;;36104:305;;;;:::o;36415:185::-;36455:1;36472:20;36490:1;36472:20;:::i;:::-;36467:25;;36506:20;36524:1;36506:20;:::i;:::-;36501:25;;36545:1;36535:35;;36550:18;;:::i;:::-;36535:35;36592:1;36589;36585:9;36580:14;;36415:185;;;;:::o;36606:348::-;36646:7;36669:20;36687:1;36669:20;:::i;:::-;36664:25;;36703:20;36721:1;36703:20;:::i;:::-;36698:25;;36891:1;36823:66;36819:74;36816:1;36813:81;36808:1;36801:9;36794:17;36790:105;36787:131;;;36898:18;;:::i;:::-;36787:131;36946:1;36943;36939:9;36928:20;;36606:348;;;;:::o;36960:191::-;37000:4;37020:20;37038:1;37020:20;:::i;:::-;37015:25;;37054:20;37072:1;37054:20;:::i;:::-;37049:25;;37093:1;37090;37087:8;37084:34;;;37098:18;;:::i;:::-;37084:34;37143:1;37140;37136:9;37128:17;;36960:191;;;;:::o;37157:96::-;37194:7;37223:24;37241:5;37223:24;:::i;:::-;37212:35;;37157:96;;;:::o;37259:90::-;37293:7;37336:5;37329:13;37322:21;37311:32;;37259:90;;;:::o;37355:149::-;37391:7;37431:66;37424:5;37420:78;37409:89;;37355:149;;;:::o;37510:118::-;37547:7;37587:34;37580:5;37576:46;37565:57;;37510:118;;;:::o;37634:126::-;37671:7;37711:42;37704:5;37700:54;37689:65;;37634:126;;;:::o;37766:77::-;37803:7;37832:5;37821:16;;37766:77;;;:::o;37849:154::-;37933:6;37928:3;37923;37910:30;37995:1;37986:6;37981:3;37977:16;37970:27;37849:154;;;:::o;38009:307::-;38077:1;38087:113;38101:6;38098:1;38095:13;38087:113;;;38186:1;38181:3;38177:11;38171:18;38167:1;38162:3;38158:11;38151:39;38123:2;38120:1;38116:10;38111:15;;38087:113;;;38218:6;38215:1;38212:13;38209:101;;;38298:1;38289:6;38284:3;38280:16;38273:27;38209:101;38058:258;38009:307;;;:::o;38322:320::-;38366:6;38403:1;38397:4;38393:12;38383:22;;38450:1;38444:4;38440:12;38471:18;38461:81;;38527:4;38519:6;38515:17;38505:27;;38461:81;38589:2;38581:6;38578:14;38558:18;38555:38;38552:84;;;38608:18;;:::i;:::-;38552:84;38373:269;38322:320;;;:::o;38648:281::-;38731:27;38753:4;38731:27;:::i;:::-;38723:6;38719:40;38861:6;38849:10;38846:22;38825:18;38813:10;38810:34;38807:62;38804:88;;;38872:18;;:::i;:::-;38804:88;38912:10;38908:2;38901:22;38691:238;38648:281;;:::o;38935:233::-;38974:3;38997:24;39015:5;38997:24;:::i;:::-;38988:33;;39043:66;39036:5;39033:77;39030:103;;;39113:18;;:::i;:::-;39030:103;39160:1;39153:5;39149:13;39142:20;;38935:233;;;:::o;39174:176::-;39206:1;39223:20;39241:1;39223:20;:::i;:::-;39218:25;;39257:20;39275:1;39257:20;:::i;:::-;39252:25;;39296:1;39286:35;;39301:18;;:::i;:::-;39286:35;39342:1;39339;39335:9;39330:14;;39174:176;;;;:::o;39356:180::-;39404:77;39401:1;39394:88;39501:4;39498:1;39491:15;39525:4;39522:1;39515:15;39542:180;39590:77;39587:1;39580:88;39687:4;39684:1;39677:15;39711:4;39708:1;39701:15;39728:180;39776:77;39773:1;39766:88;39873:4;39870:1;39863:15;39897:4;39894:1;39887:15;39914:180;39962:77;39959:1;39952:88;40059:4;40056:1;40049:15;40083:4;40080:1;40073:15;40100:180;40148:77;40145:1;40138:88;40245:4;40242:1;40235:15;40269:4;40266:1;40259:15;40286:117;40395:1;40392;40385:12;40409:117;40518:1;40515;40508:12;40532:117;40641:1;40638;40631:12;40655:117;40764:1;40761;40754:12;40778:102;40819:6;40870:2;40866:7;40861:2;40854:5;40850:14;40846:28;40836:38;;40778:102;;;:::o;40886:239::-;41026:34;41022:1;41014:6;41010:14;41003:58;41095:22;41090:2;41082:6;41078:15;41071:47;40886:239;:::o;41131:225::-;41271:34;41267:1;41259:6;41255:14;41248:58;41340:8;41335:2;41327:6;41323:15;41316:33;41131:225;:::o;41362:224::-;41502:34;41498:1;41490:6;41486:14;41479:58;41571:7;41566:2;41558:6;41554:15;41547:32;41362:224;:::o;41592:229::-;41732:34;41728:1;41720:6;41716:14;41709:58;41801:12;41796:2;41788:6;41784:15;41777:37;41592:229;:::o;41827:224::-;41967:34;41963:1;41955:6;41951:14;41944:58;42036:7;42031:2;42023:6;42019:15;42012:32;41827:224;:::o;42057:244::-;42197:34;42193:1;42185:6;42181:14;42174:58;42266:27;42261:2;42253:6;42249:15;42242:52;42057:244;:::o;42307:230::-;42447:34;42443:1;42435:6;42431:14;42424:58;42516:13;42511:2;42503:6;42499:15;42492:38;42307:230;:::o;42543:225::-;42683:34;42679:1;42671:6;42667:14;42660:58;42752:8;42747:2;42739:6;42735:15;42728:33;42543:225;:::o;42774:155::-;42914:7;42910:1;42902:6;42898:14;42891:31;42774:155;:::o;42935:182::-;43075:34;43071:1;43063:6;43059:14;43052:58;42935:182;:::o;43123:234::-;43263:34;43259:1;43251:6;43247:14;43240:58;43332:17;43327:2;43319:6;43315:15;43308:42;43123:234;:::o;43363:176::-;43503:28;43499:1;43491:6;43487:14;43480:52;43363:176;:::o;43545:237::-;43685:34;43681:1;43673:6;43669:14;43662:58;43754:20;43749:2;43741:6;43737:15;43730:45;43545:237;:::o;43788:169::-;43928:21;43924:1;43916:6;43912:14;43905:45;43788:169;:::o;43963:172::-;44103:24;44099:1;44091:6;44087:14;44080:48;43963:172;:::o;44141:221::-;44281:34;44277:1;44269:6;44265:14;44258:58;44350:4;44345:2;44337:6;44333:15;44326:29;44141:221;:::o;44368:114::-;;:::o;44488:170::-;44628:22;44624:1;44616:6;44612:14;44605:46;44488:170;:::o;44664:166::-;44804:18;44800:1;44792:6;44788:14;44781:42;44664:166;:::o;44836:238::-;44976:34;44972:1;44964:6;44960:14;44953:58;45045:21;45040:2;45032:6;45028:15;45021:46;44836:238;:::o;45080:220::-;45220:34;45216:1;45208:6;45204:14;45197:58;45289:3;45284:2;45276:6;45272:15;45265:28;45080:220;:::o;45306:227::-;45446:34;45442:1;45434:6;45430:14;45423:58;45515:10;45510:2;45502:6;45498:15;45491:35;45306:227;:::o;45539:181::-;45679:33;45675:1;45667:6;45663:14;45656:57;45539:181;:::o;45726:234::-;45866:34;45862:1;45854:6;45850:14;45843:58;45935:17;45930:2;45922:6;45918:15;45911:42;45726:234;:::o;45966:232::-;46106:34;46102:1;46094:6;46090:14;46083:58;46175:15;46170:2;46162:6;46158:15;46151:40;45966:232;:::o;46204:169::-;46344:21;46340:1;46332:6;46328:14;46321:45;46204:169;:::o;46379:231::-;46519:34;46515:1;46507:6;46503:14;46496:58;46588:14;46583:2;46575:6;46571:15;46564:39;46379:231;:::o;46616:122::-;46689:24;46707:5;46689:24;:::i;:::-;46682:5;46679:35;46669:63;;46728:1;46725;46718:12;46669:63;46616:122;:::o;46744:116::-;46814:21;46829:5;46814:21;:::i;:::-;46807:5;46804:32;46794:60;;46850:1;46847;46840:12;46794:60;46744:116;:::o;46866:120::-;46938:23;46955:5;46938:23;:::i;:::-;46931:5;46928:34;46918:62;;46976:1;46973;46966:12;46918:62;46866:120;:::o;46992:122::-;47065:24;47083:5;47065:24;:::i;:::-;47058:5;47055:35;47045:63;;47104:1;47101;47094:12;47045:63;46992:122;:::o

Swarm Source

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