ETH Price: $3,045.71 (+4.41%)

Token

PHAPE PRIME (PHAPE)
 

Overview

Max Total Supply

3,524 PHAPE

Holders

326

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
20 PHAPE
0x188af0036a0a9ba37d56b2c4816361e9f45a60a2
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:
PHAPE

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

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

    /**
     * @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 {
        _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 v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (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: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.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, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/PHAPE.sol


pragma solidity ^0.8.2;




contract PHAPE is ERC721, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    string _baseUri;
    string _contractUri;

    uint256 public constant MAX_SUPPLY = 8192;
    uint256 public price = 0.02 ether;
    uint256 public maxFreeMint = 2000;
    uint256 public maxMintPerTransaction = 20;
    bool public isSalesActive = false;

    mapping(address => uint256) public addressToFreeMinted;

    constructor() ERC721("PHAPE PRIME", "PHAPE") {
        _contractUri = "ipfs://QmZMbqKLbm4e9vXGXCNWxTC6yjQzuVE5nj9EA2EtAEkfeq";
    }

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

    function mint(uint256 quantity) external payable {
        require(isSalesActive, "sale is not active");
        require(quantity <= maxMintPerTransaction, "max mints per transaction exceeded");
        require(totalSupply() + quantity <= MAX_SUPPLY, "sold out");
        if (totalSupply() + quantity > maxFreeMint) {
            require(msg.value >= price * quantity, "ether send is under price");
        }
        for (uint256 i = 0; i < quantity; i++) {
            safeMint(msg.sender);
        }
    }

    function safeMint(address to) internal {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
    }

    function totalSupply() public view returns (uint256) {
        return _tokenIdCounter.current();
    }

    function contractURI() public view returns (string memory) {
        return _contractUri;
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner {
        _baseUri = newBaseURI;
    }

    function setContractURI(string memory newContractURI) external onlyOwner {
        _contractUri = newContractURI;
    }

    function toggleSales() external onlyOwner {
        isSalesActive = !isSalesActive;
    }

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

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

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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSalesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266470de4df820000600a556107d0600b556014600c556000600d60006101000a81548160ff0219169083151502179055503480156200004257600080fd5b506040518060400160405280600b81526020017f5048415045205052494d450000000000000000000000000000000000000000008152506040518060400160405280600581526020017f50484150450000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c792919062000209565b508060019080519060200190620000e092919062000209565b50505062000103620000f76200013b60201b60201c565b6200014360201b60201c565b60405180606001604052806035815260200162003bcb60359139600990805190602001906200013492919062000209565b506200031e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021790620002b9565b90600052602060002090601f0160209004810192826200023b576000855562000287565b82601f106200025657805160ff191683800117855562000287565b8280016001018555821562000287579182015b828111156200028657825182559160200191906001019062000269565b5b5090506200029691906200029a565b5090565b5b80821115620002b55760008160009055506001016200029b565b5090565b60006002820490506001821680620002d257607f821691505b60208210811415620002e957620002e8620002ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61389d806200032e6000396000f3fe6080604052600436106101cd5760003560e01c80638da5cb5b116100f7578063a591252d11610095578063dbd30ae011610064578063dbd30ae014610655578063e8a3d4851461066c578063e985e9c514610697578063f2fde38b146106d4576101cd565b8063a591252d14610599578063b88d4fde146105c4578063c87b56dd146105ed578063daa81cdd1461062a576101cd565b806395d89b41116100d157806395d89b41146104fe578063a035b1fe14610529578063a0712d6814610554578063a22cb46514610570576101cd565b80638da5cb5b1461048157806391b7f5ed146104ac578063938e3d7b146104d5576101cd565b806332cb6b0c1161016f57806370a082311161013e57806370a08231146103d9578063715018a6146104165780637fc461891461042d578063853828b61461046a576101cd565b806332cb6b0c1461031f57806342842e0e1461034a57806355f804b3146103735780636352211e1461039c576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806318160ddd146102cb57806323b872dd146102f6576101cd565b806301f56997146101d257806301ffc9a7146101fd57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101e76106fd565b6040516101f49190612e4c565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f91906126a8565b610703565b6040516102319190612b8f565b60405180910390f35b34801561024657600080fd5b5061024f6107e5565b60405161025c9190612baa565b60405180910390f35b34801561027157600080fd5b5061028c6004803603810190610287919061274b565b610877565b6040516102999190612b28565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612668565b6108fc565b005b3480156102d757600080fd5b506102e0610a14565b6040516102ed9190612e4c565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612552565b610a25565b005b34801561032b57600080fd5b50610334610a85565b6040516103419190612e4c565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612552565b610a8b565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612702565b610aab565b005b3480156103a857600080fd5b506103c360048036038101906103be919061274b565b610b41565b6040516103d09190612b28565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb91906124e5565b610bf3565b60405161040d9190612e4c565b60405180910390f35b34801561042257600080fd5b5061042b610cab565b005b34801561043957600080fd5b50610454600480360381019061044f91906124e5565b610d33565b6040516104619190612e4c565b60405180910390f35b34801561047657600080fd5b5061047f610d4b565b005b34801561048d57600080fd5b50610496610e07565b6040516104a39190612b28565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce919061274b565b610e31565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190612702565b610eb7565b005b34801561050a57600080fd5b50610513610f4d565b6040516105209190612baa565b60405180910390f35b34801561053557600080fd5b5061053e610fdf565b60405161054b9190612e4c565b60405180910390f35b61056e6004803603810190610569919061274b565b610fe5565b005b34801561057c57600080fd5b5061059760048036038101906105929190612628565b611168565b005b3480156105a557600080fd5b506105ae61117e565b6040516105bb9190612e4c565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e691906125a5565b611184565b005b3480156105f957600080fd5b50610614600480360381019061060f919061274b565b6111e6565b6040516106219190612baa565b60405180910390f35b34801561063657600080fd5b5061063f61128d565b60405161064c9190612b8f565b60405180910390f35b34801561066157600080fd5b5061066a6112a0565b005b34801561067857600080fd5b50610681611348565b60405161068e9190612baa565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190612512565b6113da565b6040516106cb9190612b8f565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f691906124e5565b61146e565b005b600c5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ce57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107de57506107dd82611566565b5b9050919050565b6060600080546107f4906130fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610820906130fc565b801561086d5780601f106108425761010080835404028352916020019161086d565b820191906000526020600020905b81548152906001019060200180831161085057829003601f168201915b5050505050905090565b6000610882826115d0565b6108c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b890612d8c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090782610b41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90612e0c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661099761163c565b73ffffffffffffffffffffffffffffffffffffffff1614806109c657506109c5816109c061163c565b6113da565b5b610a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90612ccc565b60405180910390fd5b610a0f8383611644565b505050565b6000610a2060076116fd565b905090565b610a36610a3061163c565b8261170b565b610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90612e2c565b60405180910390fd5b610a808383836117e9565b505050565b61200081565b610aa683838360405180602001604052806000815250611184565b505050565b610ab361163c565b73ffffffffffffffffffffffffffffffffffffffff16610ad1610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90612dac565b60405180910390fd5b8060089080519060200190610b3d9291906122f9565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190612d2c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90612d0c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cb361163c565b73ffffffffffffffffffffffffffffffffffffffff16610cd1610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90612dac565b60405180910390fd5b610d316000611a45565b565b600e6020528060005260406000206000915090505481565b610d5361163c565b73ffffffffffffffffffffffffffffffffffffffff16610d71610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90612dac565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610e0557600080fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e3961163c565b73ffffffffffffffffffffffffffffffffffffffff16610e57610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea490612dac565b60405180910390fd5b80600a8190555050565b610ebf61163c565b73ffffffffffffffffffffffffffffffffffffffff16610edd610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90612dac565b60405180910390fd5b8060099080519060200190610f499291906122f9565b5050565b606060018054610f5c906130fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f88906130fc565b8015610fd55780601f10610faa57610100808354040283529160200191610fd5565b820191906000526020600020905b815481529060010190602001808311610fb857829003601f168201915b5050505050905090565b600a5481565b600d60009054906101000a900460ff16611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90612cac565b60405180910390fd5b600c54811115611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090612d6c565b60405180910390fd5b61200081611085610a14565b61108f9190612f31565b11156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790612c8c565b60405180910390fd5b600b54816110dc610a14565b6110e69190612f31565b111561113d5780600a546110fa9190612fb8565b34101561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612cec565b60405180910390fd5b5b60005b818110156111645761115133611b0b565b808061115c9061315f565b915050611140565b5050565b61117a61117361163c565b8383611b31565b5050565b600b5481565b61119561118f61163c565b8361170b565b6111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90612e2c565b60405180910390fd5b6111e084848484611c9e565b50505050565b60606111f1826115d0565b611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790612dec565b60405180910390fd5b600061123a611cfa565b9050600081511161125a5760405180602001604052806000815250611285565b8061126484611d8c565b604051602001611275929190612b04565b6040516020818303038152906040525b915050919050565b600d60009054906101000a900460ff1681565b6112a861163c565b73ffffffffffffffffffffffffffffffffffffffff166112c6610e07565b73ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390612dac565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b606060098054611357906130fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611383906130fc565b80156113d05780601f106113a5576101008083540402835291602001916113d0565b820191906000526020600020905b8154815290600101906020018083116113b357829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61147661163c565b73ffffffffffffffffffffffffffffffffffffffff16611494610e07565b73ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190612dac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561155a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155190612bec565b60405180910390fd5b61156381611a45565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116b783610b41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611716826115d0565b611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c90612c6c565b60405180910390fd5b600061176083610b41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117cf57508373ffffffffffffffffffffffffffffffffffffffff166117b784610877565b73ffffffffffffffffffffffffffffffffffffffff16145b806117e057506117df81856113da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661180982610b41565b73ffffffffffffffffffffffffffffffffffffffff161461185f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185690612dcc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c690612c2c565b60405180910390fd5b6118da838383611eed565b6118e5600082611644565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119359190613012565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198c9190612f31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611b1760076116fd565b9050611b236007611ef2565b611b2d8282611f08565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790612c4c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c919190612b8f565b60405180910390a3505050565b611ca98484846117e9565b611cb584848484611f26565b611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb90612bcc565b60405180910390fd5b50505050565b606060088054611d09906130fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611d35906130fc565b8015611d825780601f10611d5757610100808354040283529160200191611d82565b820191906000526020600020905b815481529060010190602001808311611d6557829003601f168201915b5050505050905090565b60606000821415611dd4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ee8565b600082905060005b60008214611e06578080611def9061315f565b915050600a82611dff9190612f87565b9150611ddc565b60008167ffffffffffffffff811115611e2257611e21613295565b5b6040519080825280601f01601f191660200182016040528015611e545781602001600182028036833780820191505090505b5090505b60008514611ee157600182611e6d9190613012565b9150600a85611e7c91906131a8565b6030611e889190612f31565b60f81b818381518110611e9e57611e9d613266565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611eda9190612f87565b9450611e58565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b611f228282604051806020016040528060008152506120bd565b5050565b6000611f478473ffffffffffffffffffffffffffffffffffffffff16612118565b156120b0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f7061163c565b8786866040518563ffffffff1660e01b8152600401611f929493929190612b43565b602060405180830381600087803b158015611fac57600080fd5b505af1925050508015611fdd57506040513d601f19601f82011682018060405250810190611fda91906126d5565b60015b612060573d806000811461200d576040519150601f19603f3d011682016040523d82523d6000602084013e612012565b606091505b50600081511415612058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204f90612bcc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506120b5565b600190505b949350505050565b6120c7838361212b565b6120d46000848484611f26565b612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210a90612bcc565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561219b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219290612d4c565b60405180910390fd5b6121a4816115d0565b156121e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121db90612c0c565b60405180910390fd5b6121f060008383611eed565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122409190612f31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612305906130fc565b90600052602060002090601f016020900481019282612327576000855561236e565b82601f1061234057805160ff191683800117855561236e565b8280016001018555821561236e579182015b8281111561236d578251825591602001919060010190612352565b5b50905061237b919061237f565b5090565b5b80821115612398576000816000905550600101612380565b5090565b60006123af6123aa84612e8c565b612e67565b9050828152602081018484840111156123cb576123ca6132c9565b5b6123d68482856130ba565b509392505050565b60006123f16123ec84612ebd565b612e67565b90508281526020810184848401111561240d5761240c6132c9565b5b6124188482856130ba565b509392505050565b60008135905061242f8161380b565b92915050565b60008135905061244481613822565b92915050565b60008135905061245981613839565b92915050565b60008151905061246e81613839565b92915050565b600082601f830112612489576124886132c4565b5b813561249984826020860161239c565b91505092915050565b600082601f8301126124b7576124b66132c4565b5b81356124c78482602086016123de565b91505092915050565b6000813590506124df81613850565b92915050565b6000602082840312156124fb576124fa6132d3565b5b600061250984828501612420565b91505092915050565b60008060408385031215612529576125286132d3565b5b600061253785828601612420565b925050602061254885828601612420565b9150509250929050565b60008060006060848603121561256b5761256a6132d3565b5b600061257986828701612420565b935050602061258a86828701612420565b925050604061259b868287016124d0565b9150509250925092565b600080600080608085870312156125bf576125be6132d3565b5b60006125cd87828801612420565b94505060206125de87828801612420565b93505060406125ef878288016124d0565b925050606085013567ffffffffffffffff8111156126105761260f6132ce565b5b61261c87828801612474565b91505092959194509250565b6000806040838503121561263f5761263e6132d3565b5b600061264d85828601612420565b925050602061265e85828601612435565b9150509250929050565b6000806040838503121561267f5761267e6132d3565b5b600061268d85828601612420565b925050602061269e858286016124d0565b9150509250929050565b6000602082840312156126be576126bd6132d3565b5b60006126cc8482850161244a565b91505092915050565b6000602082840312156126eb576126ea6132d3565b5b60006126f98482850161245f565b91505092915050565b600060208284031215612718576127176132d3565b5b600082013567ffffffffffffffff811115612736576127356132ce565b5b612742848285016124a2565b91505092915050565b600060208284031215612761576127606132d3565b5b600061276f848285016124d0565b91505092915050565b61278181613046565b82525050565b61279081613058565b82525050565b60006127a182612eee565b6127ab8185612f04565b93506127bb8185602086016130c9565b6127c4816132d8565b840191505092915050565b60006127da82612ef9565b6127e48185612f15565b93506127f48185602086016130c9565b6127fd816132d8565b840191505092915050565b600061281382612ef9565b61281d8185612f26565b935061282d8185602086016130c9565b80840191505092915050565b6000612846603283612f15565b9150612851826132e9565b604082019050919050565b6000612869602683612f15565b915061287482613338565b604082019050919050565b600061288c601c83612f15565b915061289782613387565b602082019050919050565b60006128af602483612f15565b91506128ba826133b0565b604082019050919050565b60006128d2601983612f15565b91506128dd826133ff565b602082019050919050565b60006128f5602c83612f15565b915061290082613428565b604082019050919050565b6000612918600883612f15565b915061292382613477565b602082019050919050565b600061293b601283612f15565b9150612946826134a0565b602082019050919050565b600061295e603883612f15565b9150612969826134c9565b604082019050919050565b6000612981601983612f15565b915061298c82613518565b602082019050919050565b60006129a4602a83612f15565b91506129af82613541565b604082019050919050565b60006129c7602983612f15565b91506129d282613590565b604082019050919050565b60006129ea602083612f15565b91506129f5826135df565b602082019050919050565b6000612a0d602283612f15565b9150612a1882613608565b604082019050919050565b6000612a30602c83612f15565b9150612a3b82613657565b604082019050919050565b6000612a53602083612f15565b9150612a5e826136a6565b602082019050919050565b6000612a76602983612f15565b9150612a81826136cf565b604082019050919050565b6000612a99602f83612f15565b9150612aa48261371e565b604082019050919050565b6000612abc602183612f15565b9150612ac78261376d565b604082019050919050565b6000612adf603183612f15565b9150612aea826137bc565b604082019050919050565b612afe816130b0565b82525050565b6000612b108285612808565b9150612b1c8284612808565b91508190509392505050565b6000602082019050612b3d6000830184612778565b92915050565b6000608082019050612b586000830187612778565b612b656020830186612778565b612b726040830185612af5565b8181036060830152612b848184612796565b905095945050505050565b6000602082019050612ba46000830184612787565b92915050565b60006020820190508181036000830152612bc481846127cf565b905092915050565b60006020820190508181036000830152612be581612839565b9050919050565b60006020820190508181036000830152612c058161285c565b9050919050565b60006020820190508181036000830152612c258161287f565b9050919050565b60006020820190508181036000830152612c45816128a2565b9050919050565b60006020820190508181036000830152612c65816128c5565b9050919050565b60006020820190508181036000830152612c85816128e8565b9050919050565b60006020820190508181036000830152612ca58161290b565b9050919050565b60006020820190508181036000830152612cc58161292e565b9050919050565b60006020820190508181036000830152612ce581612951565b9050919050565b60006020820190508181036000830152612d0581612974565b9050919050565b60006020820190508181036000830152612d2581612997565b9050919050565b60006020820190508181036000830152612d45816129ba565b9050919050565b60006020820190508181036000830152612d65816129dd565b9050919050565b60006020820190508181036000830152612d8581612a00565b9050919050565b60006020820190508181036000830152612da581612a23565b9050919050565b60006020820190508181036000830152612dc581612a46565b9050919050565b60006020820190508181036000830152612de581612a69565b9050919050565b60006020820190508181036000830152612e0581612a8c565b9050919050565b60006020820190508181036000830152612e2581612aaf565b9050919050565b60006020820190508181036000830152612e4581612ad2565b9050919050565b6000602082019050612e616000830184612af5565b92915050565b6000612e71612e82565b9050612e7d828261312e565b919050565b6000604051905090565b600067ffffffffffffffff821115612ea757612ea6613295565b5b612eb0826132d8565b9050602081019050919050565b600067ffffffffffffffff821115612ed857612ed7613295565b5b612ee1826132d8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f3c826130b0565b9150612f47836130b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f7c57612f7b6131d9565b5b828201905092915050565b6000612f92826130b0565b9150612f9d836130b0565b925082612fad57612fac613208565b5b828204905092915050565b6000612fc3826130b0565b9150612fce836130b0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613007576130066131d9565b5b828202905092915050565b600061301d826130b0565b9150613028836130b0565b92508282101561303b5761303a6131d9565b5b828203905092915050565b600061305182613090565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156130e75780820151818401526020810190506130cc565b838111156130f6576000848401525b50505050565b6000600282049050600182168061311457607f821691505b6020821081141561312857613127613237565b5b50919050565b613137826132d8565b810181811067ffffffffffffffff8211171561315657613155613295565b5b80604052505050565b600061316a826130b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561319d5761319c6131d9565b5b600182019050919050565b60006131b3826130b0565b91506131be836130b0565b9250826131ce576131cd613208565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f73616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f65746865722073656e6420697320756e64657220707269636500000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61381481613046565b811461381f57600080fd5b50565b61382b81613058565b811461383657600080fd5b50565b61384281613064565b811461384d57600080fd5b50565b613859816130b0565b811461386457600080fd5b5056fea264697066735822122046e3d66b7712e37a2af640259a2f9043b0a640c67076e797dfa0861d9e3dc3e764736f6c63430008070033697066733a2f2f516d5a4d62714b4c626d34653976584758434e5778544336796a517a755645356e6a39454132457441456b666571

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80638da5cb5b116100f7578063a591252d11610095578063dbd30ae011610064578063dbd30ae014610655578063e8a3d4851461066c578063e985e9c514610697578063f2fde38b146106d4576101cd565b8063a591252d14610599578063b88d4fde146105c4578063c87b56dd146105ed578063daa81cdd1461062a576101cd565b806395d89b41116100d157806395d89b41146104fe578063a035b1fe14610529578063a0712d6814610554578063a22cb46514610570576101cd565b80638da5cb5b1461048157806391b7f5ed146104ac578063938e3d7b146104d5576101cd565b806332cb6b0c1161016f57806370a082311161013e57806370a08231146103d9578063715018a6146104165780637fc461891461042d578063853828b61461046a576101cd565b806332cb6b0c1461031f57806342842e0e1461034a57806355f804b3146103735780636352211e1461039c576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806318160ddd146102cb57806323b872dd146102f6576101cd565b806301f56997146101d257806301ffc9a7146101fd57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101e76106fd565b6040516101f49190612e4c565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f91906126a8565b610703565b6040516102319190612b8f565b60405180910390f35b34801561024657600080fd5b5061024f6107e5565b60405161025c9190612baa565b60405180910390f35b34801561027157600080fd5b5061028c6004803603810190610287919061274b565b610877565b6040516102999190612b28565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612668565b6108fc565b005b3480156102d757600080fd5b506102e0610a14565b6040516102ed9190612e4c565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612552565b610a25565b005b34801561032b57600080fd5b50610334610a85565b6040516103419190612e4c565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612552565b610a8b565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612702565b610aab565b005b3480156103a857600080fd5b506103c360048036038101906103be919061274b565b610b41565b6040516103d09190612b28565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb91906124e5565b610bf3565b60405161040d9190612e4c565b60405180910390f35b34801561042257600080fd5b5061042b610cab565b005b34801561043957600080fd5b50610454600480360381019061044f91906124e5565b610d33565b6040516104619190612e4c565b60405180910390f35b34801561047657600080fd5b5061047f610d4b565b005b34801561048d57600080fd5b50610496610e07565b6040516104a39190612b28565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce919061274b565b610e31565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190612702565b610eb7565b005b34801561050a57600080fd5b50610513610f4d565b6040516105209190612baa565b60405180910390f35b34801561053557600080fd5b5061053e610fdf565b60405161054b9190612e4c565b60405180910390f35b61056e6004803603810190610569919061274b565b610fe5565b005b34801561057c57600080fd5b5061059760048036038101906105929190612628565b611168565b005b3480156105a557600080fd5b506105ae61117e565b6040516105bb9190612e4c565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e691906125a5565b611184565b005b3480156105f957600080fd5b50610614600480360381019061060f919061274b565b6111e6565b6040516106219190612baa565b60405180910390f35b34801561063657600080fd5b5061063f61128d565b60405161064c9190612b8f565b60405180910390f35b34801561066157600080fd5b5061066a6112a0565b005b34801561067857600080fd5b50610681611348565b60405161068e9190612baa565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190612512565b6113da565b6040516106cb9190612b8f565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f691906124e5565b61146e565b005b600c5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ce57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107de57506107dd82611566565b5b9050919050565b6060600080546107f4906130fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610820906130fc565b801561086d5780601f106108425761010080835404028352916020019161086d565b820191906000526020600020905b81548152906001019060200180831161085057829003601f168201915b5050505050905090565b6000610882826115d0565b6108c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b890612d8c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090782610b41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90612e0c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661099761163c565b73ffffffffffffffffffffffffffffffffffffffff1614806109c657506109c5816109c061163c565b6113da565b5b610a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90612ccc565b60405180910390fd5b610a0f8383611644565b505050565b6000610a2060076116fd565b905090565b610a36610a3061163c565b8261170b565b610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90612e2c565b60405180910390fd5b610a808383836117e9565b505050565b61200081565b610aa683838360405180602001604052806000815250611184565b505050565b610ab361163c565b73ffffffffffffffffffffffffffffffffffffffff16610ad1610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90612dac565b60405180910390fd5b8060089080519060200190610b3d9291906122f9565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190612d2c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90612d0c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cb361163c565b73ffffffffffffffffffffffffffffffffffffffff16610cd1610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90612dac565b60405180910390fd5b610d316000611a45565b565b600e6020528060005260406000206000915090505481565b610d5361163c565b73ffffffffffffffffffffffffffffffffffffffff16610d71610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90612dac565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610e0557600080fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e3961163c565b73ffffffffffffffffffffffffffffffffffffffff16610e57610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea490612dac565b60405180910390fd5b80600a8190555050565b610ebf61163c565b73ffffffffffffffffffffffffffffffffffffffff16610edd610e07565b73ffffffffffffffffffffffffffffffffffffffff1614610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90612dac565b60405180910390fd5b8060099080519060200190610f499291906122f9565b5050565b606060018054610f5c906130fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f88906130fc565b8015610fd55780601f10610faa57610100808354040283529160200191610fd5565b820191906000526020600020905b815481529060010190602001808311610fb857829003601f168201915b5050505050905090565b600a5481565b600d60009054906101000a900460ff16611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90612cac565b60405180910390fd5b600c54811115611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090612d6c565b60405180910390fd5b61200081611085610a14565b61108f9190612f31565b11156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790612c8c565b60405180910390fd5b600b54816110dc610a14565b6110e69190612f31565b111561113d5780600a546110fa9190612fb8565b34101561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612cec565b60405180910390fd5b5b60005b818110156111645761115133611b0b565b808061115c9061315f565b915050611140565b5050565b61117a61117361163c565b8383611b31565b5050565b600b5481565b61119561118f61163c565b8361170b565b6111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90612e2c565b60405180910390fd5b6111e084848484611c9e565b50505050565b60606111f1826115d0565b611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790612dec565b60405180910390fd5b600061123a611cfa565b9050600081511161125a5760405180602001604052806000815250611285565b8061126484611d8c565b604051602001611275929190612b04565b6040516020818303038152906040525b915050919050565b600d60009054906101000a900460ff1681565b6112a861163c565b73ffffffffffffffffffffffffffffffffffffffff166112c6610e07565b73ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390612dac565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b606060098054611357906130fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611383906130fc565b80156113d05780601f106113a5576101008083540402835291602001916113d0565b820191906000526020600020905b8154815290600101906020018083116113b357829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61147661163c565b73ffffffffffffffffffffffffffffffffffffffff16611494610e07565b73ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190612dac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561155a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155190612bec565b60405180910390fd5b61156381611a45565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116b783610b41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611716826115d0565b611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c90612c6c565b60405180910390fd5b600061176083610b41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117cf57508373ffffffffffffffffffffffffffffffffffffffff166117b784610877565b73ffffffffffffffffffffffffffffffffffffffff16145b806117e057506117df81856113da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661180982610b41565b73ffffffffffffffffffffffffffffffffffffffff161461185f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185690612dcc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c690612c2c565b60405180910390fd5b6118da838383611eed565b6118e5600082611644565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119359190613012565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198c9190612f31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611b1760076116fd565b9050611b236007611ef2565b611b2d8282611f08565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790612c4c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c919190612b8f565b60405180910390a3505050565b611ca98484846117e9565b611cb584848484611f26565b611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb90612bcc565b60405180910390fd5b50505050565b606060088054611d09906130fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611d35906130fc565b8015611d825780601f10611d5757610100808354040283529160200191611d82565b820191906000526020600020905b815481529060010190602001808311611d6557829003601f168201915b5050505050905090565b60606000821415611dd4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ee8565b600082905060005b60008214611e06578080611def9061315f565b915050600a82611dff9190612f87565b9150611ddc565b60008167ffffffffffffffff811115611e2257611e21613295565b5b6040519080825280601f01601f191660200182016040528015611e545781602001600182028036833780820191505090505b5090505b60008514611ee157600182611e6d9190613012565b9150600a85611e7c91906131a8565b6030611e889190612f31565b60f81b818381518110611e9e57611e9d613266565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611eda9190612f87565b9450611e58565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b611f228282604051806020016040528060008152506120bd565b5050565b6000611f478473ffffffffffffffffffffffffffffffffffffffff16612118565b156120b0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f7061163c565b8786866040518563ffffffff1660e01b8152600401611f929493929190612b43565b602060405180830381600087803b158015611fac57600080fd5b505af1925050508015611fdd57506040513d601f19601f82011682018060405250810190611fda91906126d5565b60015b612060573d806000811461200d576040519150601f19603f3d011682016040523d82523d6000602084013e612012565b606091505b50600081511415612058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204f90612bcc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506120b5565b600190505b949350505050565b6120c7838361212b565b6120d46000848484611f26565b612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210a90612bcc565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561219b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219290612d4c565b60405180910390fd5b6121a4816115d0565b156121e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121db90612c0c565b60405180910390fd5b6121f060008383611eed565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122409190612f31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612305906130fc565b90600052602060002090601f016020900481019282612327576000855561236e565b82601f1061234057805160ff191683800117855561236e565b8280016001018555821561236e579182015b8281111561236d578251825591602001919060010190612352565b5b50905061237b919061237f565b5090565b5b80821115612398576000816000905550600101612380565b5090565b60006123af6123aa84612e8c565b612e67565b9050828152602081018484840111156123cb576123ca6132c9565b5b6123d68482856130ba565b509392505050565b60006123f16123ec84612ebd565b612e67565b90508281526020810184848401111561240d5761240c6132c9565b5b6124188482856130ba565b509392505050565b60008135905061242f8161380b565b92915050565b60008135905061244481613822565b92915050565b60008135905061245981613839565b92915050565b60008151905061246e81613839565b92915050565b600082601f830112612489576124886132c4565b5b813561249984826020860161239c565b91505092915050565b600082601f8301126124b7576124b66132c4565b5b81356124c78482602086016123de565b91505092915050565b6000813590506124df81613850565b92915050565b6000602082840312156124fb576124fa6132d3565b5b600061250984828501612420565b91505092915050565b60008060408385031215612529576125286132d3565b5b600061253785828601612420565b925050602061254885828601612420565b9150509250929050565b60008060006060848603121561256b5761256a6132d3565b5b600061257986828701612420565b935050602061258a86828701612420565b925050604061259b868287016124d0565b9150509250925092565b600080600080608085870312156125bf576125be6132d3565b5b60006125cd87828801612420565b94505060206125de87828801612420565b93505060406125ef878288016124d0565b925050606085013567ffffffffffffffff8111156126105761260f6132ce565b5b61261c87828801612474565b91505092959194509250565b6000806040838503121561263f5761263e6132d3565b5b600061264d85828601612420565b925050602061265e85828601612435565b9150509250929050565b6000806040838503121561267f5761267e6132d3565b5b600061268d85828601612420565b925050602061269e858286016124d0565b9150509250929050565b6000602082840312156126be576126bd6132d3565b5b60006126cc8482850161244a565b91505092915050565b6000602082840312156126eb576126ea6132d3565b5b60006126f98482850161245f565b91505092915050565b600060208284031215612718576127176132d3565b5b600082013567ffffffffffffffff811115612736576127356132ce565b5b612742848285016124a2565b91505092915050565b600060208284031215612761576127606132d3565b5b600061276f848285016124d0565b91505092915050565b61278181613046565b82525050565b61279081613058565b82525050565b60006127a182612eee565b6127ab8185612f04565b93506127bb8185602086016130c9565b6127c4816132d8565b840191505092915050565b60006127da82612ef9565b6127e48185612f15565b93506127f48185602086016130c9565b6127fd816132d8565b840191505092915050565b600061281382612ef9565b61281d8185612f26565b935061282d8185602086016130c9565b80840191505092915050565b6000612846603283612f15565b9150612851826132e9565b604082019050919050565b6000612869602683612f15565b915061287482613338565b604082019050919050565b600061288c601c83612f15565b915061289782613387565b602082019050919050565b60006128af602483612f15565b91506128ba826133b0565b604082019050919050565b60006128d2601983612f15565b91506128dd826133ff565b602082019050919050565b60006128f5602c83612f15565b915061290082613428565b604082019050919050565b6000612918600883612f15565b915061292382613477565b602082019050919050565b600061293b601283612f15565b9150612946826134a0565b602082019050919050565b600061295e603883612f15565b9150612969826134c9565b604082019050919050565b6000612981601983612f15565b915061298c82613518565b602082019050919050565b60006129a4602a83612f15565b91506129af82613541565b604082019050919050565b60006129c7602983612f15565b91506129d282613590565b604082019050919050565b60006129ea602083612f15565b91506129f5826135df565b602082019050919050565b6000612a0d602283612f15565b9150612a1882613608565b604082019050919050565b6000612a30602c83612f15565b9150612a3b82613657565b604082019050919050565b6000612a53602083612f15565b9150612a5e826136a6565b602082019050919050565b6000612a76602983612f15565b9150612a81826136cf565b604082019050919050565b6000612a99602f83612f15565b9150612aa48261371e565b604082019050919050565b6000612abc602183612f15565b9150612ac78261376d565b604082019050919050565b6000612adf603183612f15565b9150612aea826137bc565b604082019050919050565b612afe816130b0565b82525050565b6000612b108285612808565b9150612b1c8284612808565b91508190509392505050565b6000602082019050612b3d6000830184612778565b92915050565b6000608082019050612b586000830187612778565b612b656020830186612778565b612b726040830185612af5565b8181036060830152612b848184612796565b905095945050505050565b6000602082019050612ba46000830184612787565b92915050565b60006020820190508181036000830152612bc481846127cf565b905092915050565b60006020820190508181036000830152612be581612839565b9050919050565b60006020820190508181036000830152612c058161285c565b9050919050565b60006020820190508181036000830152612c258161287f565b9050919050565b60006020820190508181036000830152612c45816128a2565b9050919050565b60006020820190508181036000830152612c65816128c5565b9050919050565b60006020820190508181036000830152612c85816128e8565b9050919050565b60006020820190508181036000830152612ca58161290b565b9050919050565b60006020820190508181036000830152612cc58161292e565b9050919050565b60006020820190508181036000830152612ce581612951565b9050919050565b60006020820190508181036000830152612d0581612974565b9050919050565b60006020820190508181036000830152612d2581612997565b9050919050565b60006020820190508181036000830152612d45816129ba565b9050919050565b60006020820190508181036000830152612d65816129dd565b9050919050565b60006020820190508181036000830152612d8581612a00565b9050919050565b60006020820190508181036000830152612da581612a23565b9050919050565b60006020820190508181036000830152612dc581612a46565b9050919050565b60006020820190508181036000830152612de581612a69565b9050919050565b60006020820190508181036000830152612e0581612a8c565b9050919050565b60006020820190508181036000830152612e2581612aaf565b9050919050565b60006020820190508181036000830152612e4581612ad2565b9050919050565b6000602082019050612e616000830184612af5565b92915050565b6000612e71612e82565b9050612e7d828261312e565b919050565b6000604051905090565b600067ffffffffffffffff821115612ea757612ea6613295565b5b612eb0826132d8565b9050602081019050919050565b600067ffffffffffffffff821115612ed857612ed7613295565b5b612ee1826132d8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f3c826130b0565b9150612f47836130b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f7c57612f7b6131d9565b5b828201905092915050565b6000612f92826130b0565b9150612f9d836130b0565b925082612fad57612fac613208565b5b828204905092915050565b6000612fc3826130b0565b9150612fce836130b0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613007576130066131d9565b5b828202905092915050565b600061301d826130b0565b9150613028836130b0565b92508282101561303b5761303a6131d9565b5b828203905092915050565b600061305182613090565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156130e75780820151818401526020810190506130cc565b838111156130f6576000848401525b50505050565b6000600282049050600182168061311457607f821691505b6020821081141561312857613127613237565b5b50919050565b613137826132d8565b810181811067ffffffffffffffff8211171561315657613155613295565b5b80604052505050565b600061316a826130b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561319d5761319c6131d9565b5b600182019050919050565b60006131b3826130b0565b91506131be836130b0565b9250826131ce576131cd613208565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f73616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f65746865722073656e6420697320756e64657220707269636500000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61381481613046565b811461381f57600080fd5b50565b61382b81613058565b811461383657600080fd5b50565b61384281613064565b811461384d57600080fd5b50565b613859816130b0565b811461386457600080fd5b5056fea264697066735822122046e3d66b7712e37a2af640259a2f9043b0a640c67076e797dfa0861d9e3dc3e764736f6c63430008070033

Deployed Bytecode Sourcemap

37714:2195:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38024:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25207:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26152:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27711:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27234:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39133:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28461:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37896:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28871:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39350:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25846:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25576:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;38114:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39789:117;;;;;;;;;;;;;:::i;:::-;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39691:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39463:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26321:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37944:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38428:517;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28004:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37984:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29127:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26496:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38072:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39592:91;;;;;;;;;;;;;:::i;:::-;;39245:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28230:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38024:41;;;;:::o;25207:305::-;25309:4;25361:25;25346:40;;;:11;:40;;;;:105;;;;25418:33;25403:48;;;:11;:48;;;;25346:105;:158;;;;25468:36;25492:11;25468:23;:36::i;:::-;25346:158;25326:178;;25207:305;;;:::o;26152:100::-;26206:13;26239:5;26232:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26152:100;:::o;27711:221::-;27787:7;27815:16;27823:7;27815;:16::i;:::-;27807:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27900:15;:24;27916:7;27900:24;;;;;;;;;;;;;;;;;;;;;27893:31;;27711:221;;;:::o;27234:411::-;27315:13;27331:23;27346:7;27331:14;:23::i;:::-;27315:39;;27379:5;27373:11;;:2;:11;;;;27365:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27473:5;27457:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27482:37;27499:5;27506:12;:10;:12::i;:::-;27482:16;:37::i;:::-;27457:62;27435:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27616:21;27625:2;27629:7;27616:8;:21::i;:::-;27304:341;27234:411;;:::o;39133:104::-;39177:7;39204:25;:15;:23;:25::i;:::-;39197:32;;39133:104;:::o;28461:339::-;28656:41;28675:12;:10;:12::i;:::-;28689:7;28656:18;:41::i;:::-;28648:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28764:28;28774:4;28780:2;28784:7;28764:9;:28::i;:::-;28461:339;;;:::o;37896:41::-;37933:4;37896:41;:::o;28871:185::-;29009:39;29026:4;29032:2;29036:7;29009:39;;;;;;;;;;;;:16;:39::i;:::-;28871:185;;;:::o;39350:105::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39437:10:::1;39426:8;:21;;;;;;;;;;;;:::i;:::-;;39350:105:::0;:::o;25846:239::-;25918:7;25938:13;25954:7;:16;25962:7;25954:16;;;;;;;;;;;;;;;;;;;;;25938:32;;26006:1;25989:19;;:5;:19;;;;25981:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26072:5;26065:12;;;25846:239;;;:::o;25576:208::-;25648:7;25693:1;25676:19;;:5;:19;;;;25668:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25760:9;:16;25770:5;25760:16;;;;;;;;;;;;;;;;25753:23;;25576:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;38114:54::-;;;;;;;;;;;;;;;;;:::o;39789:117::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39858:10:::1;39850:24;;:47;39875:21;39850:47;;;;;;;;;;;;;;;;;;;;;;;39842:56;;;::::0;::::1;;39789:117::o:0;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;39691:90::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39765:8:::1;39757:5;:16;;;;39691:90:::0;:::o;39463:121::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39562:14:::1;39547:12;:29;;;;;;;;;;;;:::i;:::-;;39463:121:::0;:::o;26321:104::-;26377:13;26410:7;26403:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26321:104;:::o;37944:33::-;;;;:::o;38428:517::-;38496:13;;;;;;;;;;;38488:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;38563:21;;38551:8;:33;;38543:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;37933:4;38658:8;38642:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;38634:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;38735:11;;38724:8;38708:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;38704:138;;;38792:8;38784:5;;:16;;;;:::i;:::-;38771:9;:29;;38763:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38704:138;38857:9;38852:86;38876:8;38872:1;:12;38852:86;;;38906:20;38915:10;38906:8;:20::i;:::-;38886:3;;;;;:::i;:::-;;;;38852:86;;;;38428:517;:::o;28004:155::-;28099:52;28118:12;:10;:12::i;:::-;28132:8;28142;28099:18;:52::i;:::-;28004:155;;:::o;37984:33::-;;;;:::o;29127:328::-;29302:41;29321:12;:10;:12::i;:::-;29335:7;29302:18;:41::i;:::-;29294:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29408:39;29422:4;29428:2;29432:7;29441:5;29408:13;:39::i;:::-;29127:328;;;;:::o;26496:334::-;26569:13;26603:16;26611:7;26603;:16::i;:::-;26595:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26684:21;26708:10;:8;:10::i;:::-;26684:34;;26760:1;26742:7;26736:21;:25;:86;;;;;;;;;;;;;;;;;26788:7;26797:18;:7;:16;:18::i;:::-;26771:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26736:86;26729:93;;;26496:334;;;:::o;38072:33::-;;;;;;;;;;;;;:::o;39592:91::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39662:13:::1;;;;;;;;;;;39661:14;39645:13;;:30;;;;;;;;;;;;;;;;;;39592:91::o:0;39245:97::-;39289:13;39322:12;39315:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39245:97;:::o;28230:164::-;28327:4;28351:18;:25;28370:5;28351:25;;;;;;;;;;;;;;;:35;28377:8;28351:35;;;;;;;;;;;;;;;;;;;;;;;;;28344:42;;28230:164;;;;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;17976:157::-;18061:4;18100:25;18085:40;;;:11;:40;;;;18078:47;;17976:157;;;:::o;30965:127::-;31030:4;31082:1;31054:30;;:7;:16;31062:7;31054:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31047:37;;30965:127;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;34947:174::-;35049:2;35022:15;:24;35038:7;35022:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35105:7;35101:2;35067:46;;35076:23;35091:7;35076:14;:23::i;:::-;35067:46;;;;;;;;;;;;34947:174;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;31259:348::-;31352:4;31377:16;31385:7;31377;:16::i;:::-;31369:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31453:13;31469:23;31484:7;31469:14;:23::i;:::-;31453:39;;31522:5;31511:16;;:7;:16;;;:51;;;;31555:7;31531:31;;:20;31543:7;31531:11;:20::i;:::-;:31;;;31511:51;:87;;;;31566:32;31583:5;31590:7;31566:16;:32::i;:::-;31511:87;31503:96;;;31259:348;;;;:::o;34251:578::-;34410:4;34383:31;;:23;34398:7;34383:14;:23::i;:::-;:31;;;34375:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34493:1;34479:16;;:2;:16;;;;34471:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34549:39;34570:4;34576:2;34580:7;34549:20;:39::i;:::-;34653:29;34670:1;34674:7;34653:8;:29::i;:::-;34714:1;34695:9;:15;34705:4;34695:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34743:1;34726:9;:13;34736:2;34726:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34774:2;34755:7;:16;34763:7;34755:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34813:7;34809:2;34794:27;;34803:4;34794:27;;;;;;;;;;;;34251:578;;;:::o;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6877:128;6814:191;:::o;38953:172::-;39003:15;39021:25;:15;:23;:25::i;:::-;39003:43;;39057:27;:15;:25;:27::i;:::-;39095:22;39105:2;39109:7;39095:9;:22::i;:::-;38992:133;38953:172;:::o;35263:315::-;35418:8;35409:17;;:5;:17;;;;35401:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35505:8;35467:18;:25;35486:5;35467:25;;;;;;;;;;;;;;;:35;35493:8;35467:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35551:8;35529:41;;35544:5;35529:41;;;35561:8;35529:41;;;;;;:::i;:::-;;;;;;;;35263:315;;;:::o;30337:::-;30494:28;30504:4;30510:2;30514:7;30494:9;:28::i;:::-;30541:48;30564:4;30570:2;30574:7;30583:5;30541:22;:48::i;:::-;30533:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30337:315;;;;:::o;38319:101::-;38371:13;38404:8;38397:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38319:101;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;37514:126::-;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;31949:110::-;32025:26;32035:2;32039:7;32025:26;;;;;;;;;;;;:9;:26::i;:::-;31949:110;;:::o;36143:799::-;36298:4;36319:15;:2;:13;;;:15::i;:::-;36315:620;;;36371:2;36355:36;;;36392:12;:10;:12::i;:::-;36406:4;36412:7;36421:5;36355:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36351:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36614:1;36597:6;:13;:18;36593:272;;;36640:60;;;;;;;;;;:::i;:::-;;;;;;;;36593:272;36815:6;36809:13;36800:6;36796:2;36792:15;36785:38;36351:529;36488:41;;;36478:51;;;:6;:51;;;;36471:58;;;;;36315:620;36919:4;36912:11;;36143:799;;;;;;;:::o;32286:321::-;32416:18;32422:2;32426:7;32416:5;:18::i;:::-;32467:54;32498:1;32502:2;32506:7;32515:5;32467:22;:54::i;:::-;32445:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32286:321;;;:::o;7832:387::-;7892:4;8100:12;8167:7;8155:20;8147:28;;8210:1;8203:4;:8;8196:15;;;7832:387;;;:::o;32943:382::-;33037:1;33023:16;;:2;:16;;;;33015:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33096:16;33104:7;33096;:16::i;:::-;33095:17;33087:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33158:45;33187:1;33191:2;33195:7;33158:20;:45::i;:::-;33233:1;33216:9;:13;33226:2;33216:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33264:2;33245:7;:16;33253:7;33245:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33309:7;33305:2;33284:33;;33301:1;33284:33;;;;;;;;;;;;32943:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:365::-;10890:3;10911:66;10975:1;10970:3;10911:66;:::i;:::-;10904:73;;10986:93;11075:3;10986:93;:::i;:::-;11104:2;11099:3;11095:12;11088:19;;10748:365;;;:::o;11119:366::-;11261:3;11282:67;11346:2;11341:3;11282:67;:::i;:::-;11275:74;;11358:93;11447:3;11358:93;:::i;:::-;11476:2;11471:3;11467:12;11460:19;;11119:366;;;:::o;11491:::-;11633:3;11654:67;11718:2;11713:3;11654:67;:::i;:::-;11647:74;;11730:93;11819:3;11730:93;:::i;:::-;11848:2;11843:3;11839:12;11832:19;;11491:366;;;:::o;11863:::-;12005:3;12026:67;12090:2;12085:3;12026:67;:::i;:::-;12019:74;;12102:93;12191:3;12102:93;:::i;:::-;12220:2;12215:3;12211:12;12204:19;;11863:366;;;:::o;12235:::-;12377:3;12398:67;12462:2;12457:3;12398:67;:::i;:::-;12391:74;;12474:93;12563:3;12474:93;:::i;:::-;12592:2;12587:3;12583:12;12576:19;;12235:366;;;:::o;12607:::-;12749:3;12770:67;12834:2;12829:3;12770:67;:::i;:::-;12763:74;;12846:93;12935:3;12846:93;:::i;:::-;12964:2;12959:3;12955:12;12948:19;;12607:366;;;:::o;12979:::-;13121:3;13142:67;13206:2;13201:3;13142:67;:::i;:::-;13135:74;;13218:93;13307:3;13218:93;:::i;:::-;13336:2;13331:3;13327:12;13320:19;;12979:366;;;:::o;13351:::-;13493:3;13514:67;13578:2;13573:3;13514:67;:::i;:::-;13507:74;;13590:93;13679:3;13590:93;:::i;:::-;13708:2;13703:3;13699:12;13692:19;;13351:366;;;:::o;13723:::-;13865:3;13886:67;13950:2;13945:3;13886:67;:::i;:::-;13879:74;;13962:93;14051:3;13962:93;:::i;:::-;14080:2;14075:3;14071:12;14064:19;;13723:366;;;:::o;14095:::-;14237:3;14258:67;14322:2;14317:3;14258:67;:::i;:::-;14251:74;;14334:93;14423:3;14334:93;:::i;:::-;14452:2;14447:3;14443:12;14436:19;;14095:366;;;:::o;14467:::-;14609:3;14630:67;14694:2;14689:3;14630:67;:::i;:::-;14623:74;;14706:93;14795:3;14706:93;:::i;:::-;14824:2;14819:3;14815:12;14808:19;;14467:366;;;:::o;14839:::-;14981:3;15002:67;15066:2;15061:3;15002:67;:::i;:::-;14995:74;;15078:93;15167:3;15078:93;:::i;:::-;15196:2;15191:3;15187:12;15180:19;;14839:366;;;:::o;15211:::-;15353:3;15374:67;15438:2;15433:3;15374:67;:::i;:::-;15367:74;;15450:93;15539:3;15450:93;:::i;:::-;15568:2;15563:3;15559:12;15552:19;;15211:366;;;:::o;15583:::-;15725:3;15746:67;15810:2;15805:3;15746:67;:::i;:::-;15739:74;;15822:93;15911:3;15822:93;:::i;:::-;15940:2;15935:3;15931:12;15924:19;;15583:366;;;:::o;15955:118::-;16042:24;16060:5;16042:24;:::i;:::-;16037:3;16030:37;15955:118;;:::o;16079:435::-;16259:3;16281:95;16372:3;16363:6;16281:95;:::i;:::-;16274:102;;16393:95;16484:3;16475:6;16393:95;:::i;:::-;16386:102;;16505:3;16498:10;;16079:435;;;;;:::o;16520:222::-;16613:4;16651:2;16640:9;16636:18;16628:26;;16664:71;16732:1;16721:9;16717:17;16708:6;16664:71;:::i;:::-;16520:222;;;;:::o;16748:640::-;16943:4;16981:3;16970:9;16966:19;16958:27;;16995:71;17063:1;17052:9;17048:17;17039:6;16995:71;:::i;:::-;17076:72;17144:2;17133:9;17129:18;17120:6;17076:72;:::i;:::-;17158;17226:2;17215:9;17211:18;17202:6;17158:72;:::i;:::-;17277:9;17271:4;17267:20;17262:2;17251:9;17247:18;17240:48;17305:76;17376:4;17367:6;17305:76;:::i;:::-;17297:84;;16748:640;;;;;;;:::o;17394:210::-;17481:4;17519:2;17508:9;17504:18;17496:26;;17532:65;17594:1;17583:9;17579:17;17570:6;17532:65;:::i;:::-;17394:210;;;;:::o;17610:313::-;17723:4;17761:2;17750:9;17746:18;17738:26;;17810:9;17804:4;17800:20;17796:1;17785:9;17781:17;17774:47;17838:78;17911:4;17902:6;17838:78;:::i;:::-;17830:86;;17610:313;;;;:::o;17929:419::-;18095:4;18133:2;18122:9;18118:18;18110:26;;18182:9;18176:4;18172:20;18168:1;18157:9;18153:17;18146:47;18210:131;18336:4;18210:131;:::i;:::-;18202:139;;17929:419;;;:::o;18354:::-;18520:4;18558:2;18547:9;18543:18;18535:26;;18607:9;18601:4;18597:20;18593:1;18582:9;18578:17;18571:47;18635:131;18761:4;18635:131;:::i;:::-;18627:139;;18354:419;;;:::o;18779:::-;18945:4;18983:2;18972:9;18968:18;18960:26;;19032:9;19026:4;19022:20;19018:1;19007:9;19003:17;18996:47;19060:131;19186:4;19060:131;:::i;:::-;19052:139;;18779:419;;;:::o;19204:::-;19370:4;19408:2;19397:9;19393:18;19385:26;;19457:9;19451:4;19447:20;19443:1;19432:9;19428:17;19421:47;19485:131;19611:4;19485:131;:::i;:::-;19477:139;;19204:419;;;:::o;19629:::-;19795:4;19833:2;19822:9;19818:18;19810:26;;19882:9;19876:4;19872:20;19868:1;19857:9;19853:17;19846:47;19910:131;20036:4;19910:131;:::i;:::-;19902:139;;19629:419;;;:::o;20054:::-;20220:4;20258:2;20247:9;20243:18;20235:26;;20307:9;20301:4;20297:20;20293:1;20282:9;20278:17;20271:47;20335:131;20461:4;20335:131;:::i;:::-;20327:139;;20054:419;;;:::o;20479:::-;20645:4;20683:2;20672:9;20668:18;20660:26;;20732:9;20726:4;20722:20;20718:1;20707:9;20703:17;20696:47;20760:131;20886:4;20760:131;:::i;:::-;20752:139;;20479:419;;;:::o;20904:::-;21070:4;21108:2;21097:9;21093:18;21085:26;;21157:9;21151:4;21147:20;21143:1;21132:9;21128:17;21121:47;21185:131;21311:4;21185:131;:::i;:::-;21177:139;;20904:419;;;:::o;21329:::-;21495:4;21533:2;21522:9;21518:18;21510:26;;21582:9;21576:4;21572:20;21568:1;21557:9;21553:17;21546:47;21610:131;21736:4;21610:131;:::i;:::-;21602:139;;21329:419;;;:::o;21754:::-;21920:4;21958:2;21947:9;21943:18;21935:26;;22007:9;22001:4;21997:20;21993:1;21982:9;21978:17;21971:47;22035:131;22161:4;22035:131;:::i;:::-;22027:139;;21754:419;;;:::o;22179:::-;22345:4;22383:2;22372:9;22368:18;22360:26;;22432:9;22426:4;22422:20;22418:1;22407:9;22403:17;22396:47;22460:131;22586:4;22460:131;:::i;:::-;22452:139;;22179:419;;;:::o;22604:::-;22770:4;22808:2;22797:9;22793:18;22785:26;;22857:9;22851:4;22847:20;22843:1;22832:9;22828:17;22821:47;22885:131;23011:4;22885:131;:::i;:::-;22877:139;;22604:419;;;:::o;23029:::-;23195:4;23233:2;23222:9;23218:18;23210:26;;23282:9;23276:4;23272:20;23268:1;23257:9;23253:17;23246:47;23310:131;23436:4;23310:131;:::i;:::-;23302:139;;23029:419;;;:::o;23454:::-;23620:4;23658:2;23647:9;23643:18;23635:26;;23707:9;23701:4;23697:20;23693:1;23682:9;23678:17;23671:47;23735:131;23861:4;23735:131;:::i;:::-;23727:139;;23454:419;;;:::o;23879:::-;24045:4;24083:2;24072:9;24068:18;24060:26;;24132:9;24126:4;24122:20;24118:1;24107:9;24103:17;24096:47;24160:131;24286:4;24160:131;:::i;:::-;24152:139;;23879:419;;;:::o;24304:::-;24470:4;24508:2;24497:9;24493:18;24485:26;;24557:9;24551:4;24547:20;24543:1;24532:9;24528:17;24521:47;24585:131;24711:4;24585:131;:::i;:::-;24577:139;;24304:419;;;:::o;24729:::-;24895:4;24933:2;24922:9;24918:18;24910:26;;24982:9;24976:4;24972:20;24968:1;24957:9;24953:17;24946:47;25010:131;25136:4;25010:131;:::i;:::-;25002:139;;24729:419;;;:::o;25154:::-;25320:4;25358:2;25347:9;25343:18;25335:26;;25407:9;25401:4;25397:20;25393:1;25382:9;25378:17;25371:47;25435:131;25561:4;25435:131;:::i;:::-;25427:139;;25154:419;;;:::o;25579:::-;25745:4;25783:2;25772:9;25768:18;25760:26;;25832:9;25826:4;25822:20;25818:1;25807:9;25803:17;25796:47;25860:131;25986:4;25860:131;:::i;:::-;25852:139;;25579:419;;;:::o;26004:::-;26170:4;26208:2;26197:9;26193:18;26185:26;;26257:9;26251:4;26247:20;26243:1;26232:9;26228:17;26221:47;26285:131;26411:4;26285:131;:::i;:::-;26277:139;;26004:419;;;:::o;26429:222::-;26522:4;26560:2;26549:9;26545:18;26537:26;;26573:71;26641:1;26630:9;26626:17;26617:6;26573:71;:::i;:::-;26429:222;;;;:::o;26657:129::-;26691:6;26718:20;;:::i;:::-;26708:30;;26747:33;26775:4;26767:6;26747:33;:::i;:::-;26657:129;;;:::o;26792:75::-;26825:6;26858:2;26852:9;26842:19;;26792:75;:::o;26873:307::-;26934:4;27024:18;27016:6;27013:30;27010:56;;;27046:18;;:::i;:::-;27010:56;27084:29;27106:6;27084:29;:::i;:::-;27076:37;;27168:4;27162;27158:15;27150:23;;26873:307;;;:::o;27186:308::-;27248:4;27338:18;27330:6;27327:30;27324:56;;;27360:18;;:::i;:::-;27324:56;27398:29;27420:6;27398:29;:::i;:::-;27390:37;;27482:4;27476;27472:15;27464:23;;27186:308;;;:::o;27500:98::-;27551:6;27585:5;27579:12;27569:22;;27500:98;;;:::o;27604:99::-;27656:6;27690:5;27684:12;27674:22;;27604:99;;;:::o;27709:168::-;27792:11;27826:6;27821:3;27814:19;27866:4;27861:3;27857:14;27842:29;;27709:168;;;;:::o;27883:169::-;27967:11;28001:6;27996:3;27989:19;28041:4;28036:3;28032:14;28017:29;;27883:169;;;;:::o;28058:148::-;28160:11;28197:3;28182:18;;28058:148;;;;:::o;28212:305::-;28252:3;28271:20;28289:1;28271:20;:::i;:::-;28266:25;;28305:20;28323:1;28305:20;:::i;:::-;28300:25;;28459:1;28391:66;28387:74;28384:1;28381:81;28378:107;;;28465:18;;:::i;:::-;28378:107;28509:1;28506;28502:9;28495:16;;28212:305;;;;:::o;28523:185::-;28563:1;28580:20;28598:1;28580:20;:::i;:::-;28575:25;;28614:20;28632:1;28614:20;:::i;:::-;28609:25;;28653:1;28643:35;;28658:18;;:::i;:::-;28643:35;28700:1;28697;28693:9;28688:14;;28523:185;;;;:::o;28714:348::-;28754:7;28777:20;28795:1;28777:20;:::i;:::-;28772:25;;28811:20;28829:1;28811:20;:::i;:::-;28806:25;;28999:1;28931:66;28927:74;28924:1;28921:81;28916:1;28909:9;28902:17;28898:105;28895:131;;;29006:18;;:::i;:::-;28895:131;29054:1;29051;29047:9;29036:20;;28714:348;;;;:::o;29068:191::-;29108:4;29128:20;29146:1;29128:20;:::i;:::-;29123:25;;29162:20;29180:1;29162:20;:::i;:::-;29157:25;;29201:1;29198;29195:8;29192:34;;;29206:18;;:::i;:::-;29192:34;29251:1;29248;29244:9;29236:17;;29068:191;;;;:::o;29265:96::-;29302:7;29331:24;29349:5;29331:24;:::i;:::-;29320:35;;29265:96;;;:::o;29367:90::-;29401:7;29444:5;29437:13;29430:21;29419:32;;29367:90;;;:::o;29463:149::-;29499:7;29539:66;29532:5;29528:78;29517:89;;29463:149;;;:::o;29618:126::-;29655:7;29695:42;29688:5;29684:54;29673:65;;29618:126;;;:::o;29750:77::-;29787:7;29816:5;29805:16;;29750:77;;;:::o;29833:154::-;29917:6;29912:3;29907;29894:30;29979:1;29970:6;29965:3;29961:16;29954:27;29833:154;;;:::o;29993:307::-;30061:1;30071:113;30085:6;30082:1;30079:13;30071:113;;;30170:1;30165:3;30161:11;30155:18;30151:1;30146:3;30142:11;30135:39;30107:2;30104:1;30100:10;30095:15;;30071:113;;;30202:6;30199:1;30196:13;30193:101;;;30282:1;30273:6;30268:3;30264:16;30257:27;30193:101;30042:258;29993:307;;;:::o;30306:320::-;30350:6;30387:1;30381:4;30377:12;30367:22;;30434:1;30428:4;30424:12;30455:18;30445:81;;30511:4;30503:6;30499:17;30489:27;;30445:81;30573:2;30565:6;30562:14;30542:18;30539:38;30536:84;;;30592:18;;:::i;:::-;30536:84;30357:269;30306:320;;;:::o;30632:281::-;30715:27;30737:4;30715:27;:::i;:::-;30707:6;30703:40;30845:6;30833:10;30830:22;30809:18;30797:10;30794:34;30791:62;30788:88;;;30856:18;;:::i;:::-;30788:88;30896:10;30892:2;30885:22;30675:238;30632:281;;:::o;30919:233::-;30958:3;30981:24;30999:5;30981:24;:::i;:::-;30972:33;;31027:66;31020:5;31017:77;31014:103;;;31097:18;;:::i;:::-;31014:103;31144:1;31137:5;31133:13;31126:20;;30919:233;;;:::o;31158:176::-;31190:1;31207:20;31225:1;31207:20;:::i;:::-;31202:25;;31241:20;31259:1;31241:20;:::i;:::-;31236:25;;31280:1;31270:35;;31285:18;;:::i;:::-;31270:35;31326:1;31323;31319:9;31314:14;;31158:176;;;;:::o;31340:180::-;31388:77;31385:1;31378:88;31485:4;31482:1;31475:15;31509:4;31506:1;31499:15;31526:180;31574:77;31571:1;31564:88;31671:4;31668:1;31661:15;31695:4;31692:1;31685:15;31712:180;31760:77;31757:1;31750:88;31857:4;31854:1;31847:15;31881:4;31878:1;31871:15;31898:180;31946:77;31943:1;31936:88;32043:4;32040:1;32033:15;32067:4;32064:1;32057:15;32084:180;32132:77;32129:1;32122:88;32229:4;32226:1;32219:15;32253:4;32250:1;32243:15;32270:117;32379:1;32376;32369:12;32393:117;32502:1;32499;32492:12;32516:117;32625:1;32622;32615:12;32639:117;32748:1;32745;32738:12;32762:102;32803:6;32854:2;32850:7;32845:2;32838:5;32834:14;32830:28;32820:38;;32762:102;;;:::o;32870:237::-;33010:34;33006:1;32998:6;32994:14;32987:58;33079:20;33074:2;33066:6;33062:15;33055:45;32870:237;:::o;33113:225::-;33253:34;33249:1;33241:6;33237:14;33230:58;33322:8;33317:2;33309:6;33305:15;33298:33;33113:225;:::o;33344:178::-;33484:30;33480:1;33472:6;33468:14;33461:54;33344:178;:::o;33528:223::-;33668:34;33664:1;33656:6;33652:14;33645:58;33737:6;33732:2;33724:6;33720:15;33713:31;33528:223;:::o;33757:175::-;33897:27;33893:1;33885:6;33881:14;33874:51;33757:175;:::o;33938:231::-;34078:34;34074:1;34066:6;34062:14;34055:58;34147:14;34142:2;34134:6;34130:15;34123:39;33938:231;:::o;34175:158::-;34315:10;34311:1;34303:6;34299:14;34292:34;34175:158;:::o;34339:168::-;34479:20;34475:1;34467:6;34463:14;34456:44;34339:168;:::o;34513:243::-;34653:34;34649:1;34641:6;34637:14;34630:58;34722:26;34717:2;34709:6;34705:15;34698:51;34513:243;:::o;34762:175::-;34902:27;34898:1;34890:6;34886:14;34879:51;34762:175;:::o;34943:229::-;35083:34;35079:1;35071:6;35067:14;35060:58;35152:12;35147:2;35139:6;35135:15;35128:37;34943:229;:::o;35178:228::-;35318:34;35314:1;35306:6;35302:14;35295:58;35387:11;35382:2;35374:6;35370:15;35363:36;35178:228;:::o;35412:182::-;35552:34;35548:1;35540:6;35536:14;35529:58;35412:182;:::o;35600:221::-;35740:34;35736:1;35728:6;35724:14;35717:58;35809:4;35804:2;35796:6;35792:15;35785:29;35600:221;:::o;35827:231::-;35967:34;35963:1;35955:6;35951:14;35944:58;36036:14;36031:2;36023:6;36019:15;36012:39;35827:231;:::o;36064:182::-;36204:34;36200:1;36192:6;36188:14;36181:58;36064:182;:::o;36252:228::-;36392:34;36388:1;36380:6;36376:14;36369:58;36461:11;36456:2;36448:6;36444:15;36437:36;36252:228;:::o;36486:234::-;36626:34;36622:1;36614:6;36610:14;36603:58;36695:17;36690:2;36682:6;36678:15;36671:42;36486:234;:::o;36726:220::-;36866:34;36862:1;36854:6;36850:14;36843:58;36935:3;36930:2;36922:6;36918:15;36911:28;36726:220;:::o;36952:236::-;37092:34;37088:1;37080:6;37076:14;37069:58;37161:19;37156:2;37148:6;37144:15;37137:44;36952:236;:::o;37194:122::-;37267:24;37285:5;37267:24;:::i;:::-;37260:5;37257:35;37247:63;;37306:1;37303;37296:12;37247:63;37194:122;:::o;37322:116::-;37392:21;37407:5;37392:21;:::i;:::-;37385:5;37382:32;37372:60;;37428:1;37425;37418:12;37372:60;37322:116;:::o;37444:120::-;37516:23;37533:5;37516:23;:::i;:::-;37509:5;37506:34;37496:62;;37554:1;37551;37544:12;37496:62;37444:120;:::o;37570:122::-;37643:24;37661:5;37643:24;:::i;:::-;37636:5;37633:35;37623:63;;37682:1;37679;37672:12;37623:63;37570:122;:::o

Swarm Source

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