ERC-721
Overview
Max Total Supply
528 KOBOLNFT
Holders
161
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 KOBOLNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
KOBOLNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-20 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } 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: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: node_modules\openzeppelin-solidity\contracts\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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: node_modules\openzeppelin-solidity\contracts\utils\Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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}. 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public 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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { // solhint-disable-next-line no-inline-assembly 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` cannot be the zero address. * - `to` cannot be the zero address. * * 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: node_modules\openzeppelin-solidity\contracts\token\ERC721\extensions\IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: openzeppelin-solidity\contracts\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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require( owner() == _msgSender(), "Ownable: caller is not the owner" ); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: openzeppelin-solidity\contracts\token\ERC721\extensions\ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts\lib\Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. 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 { { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); { counter._value = value - 1; } } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // File openzeppelin-solidity/contracts/utils/math/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File openzeppelin-solidity/contracts/utils/structs/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File openzeppelin-solidity/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File openzeppelin-solidity/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } pragma solidity ^0.8.0; contract KOBOLNFT is ReentrancyGuard, Pausable, ERC721Enumerable, Ownable, IERC721Receiver { using Counters for Counters.Counter; using Strings for uint256; using SafeMath for uint256; using EnumerableSet for EnumerableSet.UintSet; using SafeERC20 for IERC20; /* ------------------------ NFT Minting ------------------------- */ uint256 public MAX_SUPPLY = 6000; uint256 public PRICE = 3 ether; string private _tokenBaseURI = ""; Counters.Counter internal _publicCounter; /* ------------------------ NFT Staking ------------------------- */ bool public _enableHarvest = false; bytes32 private HASH_ROOT; address public REWARD_TOKEN_ADDRESS; uint256 public TOKEN_REWARD_PER_DAY_MYSTIC = 2904.30321 ether; uint256 public TOKEN_REWARD_PER_DAY_LEGUNDARY = 1936.20214 ether; uint256 public TOKEN_REWARD_PER_DAY_EPIC = 193.62021 ether; uint256 public TOKEN_REWARD_PER_DAY_RARE = 48.40505 ether; struct UserInfo { uint256 rewards; uint256 lastUpdated; } mapping(address => EnumerableSet.UintSet) private Mystic_Blanaces; mapping(address => EnumerableSet.UintSet) private Legundary_Blanaces; mapping(address => EnumerableSet.UintSet) private Epic_Blanaces; mapping(address => EnumerableSet.UintSet) private Rare_Blanaces; mapping(address => UserInfo) public userInfo; address[] public stakerList; /* --------------------------------------------------------------------------------- */ constructor() ERC721("KOBOLD GENESIS", "KOBOLNFT") { _publicCounter.increment(); // Start from 1 : TokenID } function setMintPrice(uint256 mintPrice) external onlyOwner { PRICE = mintPrice; } function setMaxLimit(uint256 maxLimit) external onlyOwner { MAX_SUPPLY = maxLimit; } function setBaseURI(string memory baseURI) external onlyOwner { _tokenBaseURI = baseURI; } function airdrop(address[] memory airdropAddress, uint256 numberOfTokens) external onlyOwner { for (uint256 k = 0; k < airdropAddress.length; k++) { for (uint256 i = 0; i < numberOfTokens; i++) { uint256 tokenId = _publicCounter.current(); if (_publicCounter.current() < MAX_SUPPLY) { _publicCounter.increment(); if (!_exists(tokenId)) { _safeMint(airdropAddress[k], tokenId); } } } } } function purchase(uint256 numberOfTokens) external payable { require(_publicCounter.current() + numberOfTokens <= MAX_SUPPLY,"Purchase would exceed MAX_SUPPLY"); if (_msgSender() != owner()) { require(PRICE * numberOfTokens <= msg.value,"ETH amount is not sufficient"); } for (uint256 i = 0; i < numberOfTokens; i++) { uint256 tokenId = _publicCounter.current(); if (_publicCounter.current() < MAX_SUPPLY) { _publicCounter.increment(); if (!_exists(tokenId)) { _safeMint(_msgSender(), tokenId); } } } } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "Token does not exist"); return string(abi.encodePacked(_tokenBaseURI, tokenId.toString(), ".json")); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(_msgSender()).transfer(balance); } function withdrawToken() external onlyOwner { IERC20(REWARD_TOKEN_ADDRESS).safeTransfer(_msgSender(), IERC20(REWARD_TOKEN_ADDRESS).balanceOf(address(this))); } function userHoldNFT(address _owner) public view returns(uint256[] memory){ uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } /* --------------------------------------------------------------------- */ function setTokenRewardAddress(address _tokenAddress) public onlyOwner { REWARD_TOKEN_ADDRESS = _tokenAddress; } function setTokenRewardAmountPerDay(uint256 mysticReward, uint256 legundaryReward, uint256 epicReward, uint256 rareReward) public onlyOwner { TOKEN_REWARD_PER_DAY_MYSTIC = mysticReward; TOKEN_REWARD_PER_DAY_LEGUNDARY = legundaryReward; TOKEN_REWARD_PER_DAY_EPIC = epicReward; TOKEN_REWARD_PER_DAY_RARE = rareReward; } function setHashRoot(bytes32 _root) public onlyOwner { HASH_ROOT = _root; } // Verify that a given leaf is in the tree. function isHashValid(bytes32 _leafNode, bytes32[] memory _proof) public view returns (bool) { return MerkleProof.verify(_proof, HASH_ROOT, _leafNode); } // Generate the leaf node (just the hash of tokenID concatenated with the account address) function toLeaf(uint256 tokenID, uint256 index, uint256 grade) public pure returns (bytes32) { return keccak256(abi.encodePacked(index, tokenID, grade)); } function addStakerList(address _user) internal{ for (uint256 i = 0; i < stakerList.length; i++) { if (stakerList[i] == _user) return; } stakerList.push(_user); } function userStakeInfo(address _owner) external view returns(UserInfo memory){ return userInfo[_owner]; } function userStakedNFT_Mystic(address _owner) public view returns(uint256[] memory){ uint256 tokenCount = Mystic_Blanaces[_owner].length(); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = Mystic_Blanaces[_owner].at(index); } return result; } } function userStakedNFT_Legundary(address _owner) public view returns(uint256[] memory){ uint256 tokenCount = Legundary_Blanaces[_owner].length(); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = Legundary_Blanaces[_owner].at(index); } return result; } } function userStakedNFT_Epic(address _owner) public view returns(uint256[] memory){ uint256 tokenCount = Epic_Blanaces[_owner].length(); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = Epic_Blanaces[_owner].at(index); } return result; } } function userStakedNFT_Rare(address _owner) public view returns(uint256[] memory){ uint256 tokenCount = Rare_Blanaces[_owner].length(); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = Rare_Blanaces[_owner].at(index); } return result; } } function isStaked_Mystic( address account ,uint256 tokenId) public view returns (bool) { return Mystic_Blanaces[account].contains(tokenId); } function isStaked_Legundary( address account ,uint256 tokenId) public view returns (bool) { return Legundary_Blanaces[account].contains(tokenId); } function isStaked_Epic( address account ,uint256 tokenId) public view returns (bool) { return Epic_Blanaces[account].contains(tokenId); } function isStaked_Rare( address account ,uint256 tokenId) public view returns (bool) { return Rare_Blanaces[account].contains(tokenId); } function earned(address account) public view returns (uint256) { uint256 blockTime = block.timestamp; UserInfo memory user = userInfo[account]; uint256 amount_mystic = blockTime.sub(user.lastUpdated).mul(Mystic_Blanaces[account].length()).mul(TOKEN_REWARD_PER_DAY_MYSTIC).div(1 days); uint256 amount_legundary = blockTime.sub(user.lastUpdated).mul(Legundary_Blanaces[account].length()).mul(TOKEN_REWARD_PER_DAY_LEGUNDARY).div(1 days); uint256 amount_epic = blockTime.sub(user.lastUpdated).mul(Epic_Blanaces[account].length()).mul(TOKEN_REWARD_PER_DAY_EPIC).div(1 days); uint256 amount_rare = blockTime.sub(user.lastUpdated).mul(Rare_Blanaces[account].length()).mul(TOKEN_REWARD_PER_DAY_RARE).div(1 days); return user.rewards.add(amount_mystic).add(amount_legundary).add(amount_epic).add(amount_rare); } function totalEarned() public view returns (uint256) { uint256 totalEarning = 0; for (uint256 i = 0; i < stakerList.length; i++) { totalEarning += earned(stakerList[i]); } return totalEarning; } function totalStakedCount_Mystic() public view returns (uint256) { uint256 totalCount = 0; for (uint256 i = 0; i < stakerList.length; i++) { totalCount += Mystic_Blanaces[stakerList[i]].length(); } return totalCount; } function totalStakedCount_Legundary() public view returns (uint256) { uint256 totalCount = 0; for (uint256 i = 0; i < stakerList.length; i++) { totalCount += Legundary_Blanaces[stakerList[i]].length(); } return totalCount; } function totalStakedCount_Epic() public view returns (uint256) { uint256 totalCount = 0; for (uint256 i = 0; i < stakerList.length; i++) { totalCount += Epic_Blanaces[stakerList[i]].length(); } return totalCount; } function totalStakedCount_Rare() public view returns (uint256) { uint256 totalCount = 0; for (uint256 i = 0; i < stakerList.length; i++) { totalCount += Rare_Blanaces[stakerList[i]].length(); } return totalCount; } function totalStakedMembers_Mystic() public view returns (uint256) { uint256 totalMembers = 0; for (uint256 i = 0; i < stakerList.length; i++) { if (Mystic_Blanaces[stakerList[i]].length() > 0) totalMembers += 1; } return totalMembers; } function totalStakedMembers_Legundary() public view returns (uint256) { uint256 totalMembers = 0; for (uint256 i = 0; i < stakerList.length; i++) { if (Legundary_Blanaces[stakerList[i]].length() > 0) totalMembers += 1; } return totalMembers; } function totalStakedMembers_Epic() public view returns (uint256) { uint256 totalMembers = 0; for (uint256 i = 0; i < stakerList.length; i++) { if (Epic_Blanaces[stakerList[i]].length() > 0) totalMembers += 1; } return totalMembers; } function totalStakedMembers_Rare() public view returns (uint256) { uint256 totalMembers = 0; for (uint256 i = 0; i < stakerList.length; i++) { if (Rare_Blanaces[stakerList[i]].length() > 0) totalMembers += 1; } return totalMembers; } function stake( uint256[] calldata _tokenIDList, uint256[] calldata _indexList, uint256[] calldata _gradeList, bytes32[][] calldata _proofList) public nonReentrant whenNotPaused { require(isApprovedForAll(_msgSender(),address(this)),"Not approve nft to staker address"); addStakerList(_msgSender()); UserInfo storage user = userInfo[_msgSender()]; user.rewards = earned(_msgSender()); user.lastUpdated = block.timestamp; for (uint256 i = 0; i < _tokenIDList.length; i++) { require (isHashValid(toLeaf(_tokenIDList[i], _indexList[i], _gradeList[i]), _proofList[i]), "Invalid Hash"); safeTransferFrom(_msgSender(), address(this), _tokenIDList[i]); if (_gradeList[i] == 0) { Mystic_Blanaces[_msgSender()].add(_tokenIDList[i]); } else if (_gradeList[i] == 1) { Legundary_Blanaces[_msgSender()].add(_tokenIDList[i]); } else if (_gradeList[i] == 2) { Epic_Blanaces[_msgSender()].add(_tokenIDList[i]); } else if (_gradeList[i] == 3) { Rare_Blanaces[_msgSender()].add(_tokenIDList[i]); } } } function unstake( uint256[] memory tokenIdList) public nonReentrant { UserInfo storage user = userInfo[_msgSender()]; user.rewards = earned(_msgSender()); user.lastUpdated = block.timestamp; for (uint256 i = 0; i < tokenIdList.length; i++) { require( isStaked_Mystic(_msgSender(), tokenIdList[i]) || isStaked_Legundary(_msgSender(), tokenIdList[i]) || isStaked_Epic(_msgSender(), tokenIdList[i]) || isStaked_Rare(_msgSender(), tokenIdList[i]), "Not staked this nft"); _safeTransfer(address(this) , _msgSender(), tokenIdList[i], ""); if (isStaked_Mystic(_msgSender(), tokenIdList[i])) { Mystic_Blanaces[_msgSender()].remove(tokenIdList[i]); } else if (isStaked_Legundary(_msgSender(), tokenIdList[i])) { Legundary_Blanaces[_msgSender()].remove(tokenIdList[i]); } else if (isStaked_Epic(_msgSender(), tokenIdList[i])) { Epic_Blanaces[_msgSender()].remove(tokenIdList[i]); } else if (isStaked_Rare(_msgSender(), tokenIdList[i])) { Rare_Blanaces[_msgSender()].remove(tokenIdList[i]); } } } function harvest() public nonReentrant { require(_enableHarvest == true, "Harvest is not activated"); UserInfo storage user = userInfo[_msgSender()]; user.rewards = earned(_msgSender()); user.lastUpdated = block.timestamp; require(IERC20(REWARD_TOKEN_ADDRESS).balanceOf(address(this)) >= user.rewards,"Reward token amount is small"); if (user.rewards > 0) { IERC20(REWARD_TOKEN_ADDRESS).safeTransfer(_msgSender(), user.rewards); } user.rewards = 0; } function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_REWARD_PER_DAY_EPIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_REWARD_PER_DAY_LEGUNDARY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_REWARD_PER_DAY_MYSTIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_REWARD_PER_DAY_RARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_enableHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropAddress","type":"address[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_leafNode","type":"bytes32"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"isHashValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isStaked_Epic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isStaked_Legundary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isStaked_Mystic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isStaked_Rare","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setHashRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxLimit","type":"uint256"}],"name":"setMaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setTokenRewardAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mysticReward","type":"uint256"},{"internalType":"uint256","name":"legundaryReward","type":"uint256"},{"internalType":"uint256","name":"epicReward","type":"uint256"},{"internalType":"uint256","name":"rareReward","type":"uint256"}],"name":"setTokenRewardAmountPerDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIDList","type":"uint256[]"},{"internalType":"uint256[]","name":"_indexList","type":"uint256[]"},{"internalType":"uint256[]","name":"_gradeList","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_proofList","type":"bytes32[][]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakerList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"grade","type":"uint256"}],"name":"toLeaf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedCount_Epic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedCount_Legundary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedCount_Mystic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedCount_Rare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedMembers_Epic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedMembers_Legundary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedMembers_Mystic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedMembers_Rare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIdList","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"userHoldNFT","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"userStakeInfo","outputs":[{"components":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"internalType":"struct KOBOLNFT.UserInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"userStakedNFT_Epic","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"userStakedNFT_Legundary","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"userStakedNFT_Mystic","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"userStakedNFT_Rare","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
611770600d556729a2241af62c0000600e5560a06040819052600060808190526200002d91600f9162000198565b506011805460ff19169055689d714dbdd64cb8a0006014556868f633d3e43325c000601555680a7f052b26b289200060165568029fc148839905a0006017553480156200007957600080fd5b50604080518082018252600e81526d4b4f424f4c442047454e4553495360901b60208083019182528351808501909452600884526712d3d093d313919560c21b9084015260016000819055805460ff191690558151919291620000df9160029162000198565b508051620000f590600390602084019062000198565b50505060006200010a6200017560201b60201c565b600c80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200016f60106200017960201b620029ee1760201c565b620002a2565b3390565b60018160000160008282546200019091906200023e565b909155505050565b828054620001a69062000265565b90600052602060002090601f016020900481019282620001ca576000855562000215565b82601f10620001e557805160ff191683800117855562000215565b8280016001018555821562000215579182015b8281111562000215578251825591602001919060010190620001f8565b506200022392915062000227565b5090565b5b8082111562000223576000815560010162000228565b600082198211156200026057634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200027a57607f821691505b602082108114156200029c57634e487b7160e01b600052602260045260246000fd5b50919050565b6144ec80620002b26000396000f3fe6080604052600436106103db5760003560e01c80636dfa8d99116101fd578063b88d4fde11610118578063e372ac4f116100ab578063f2fde38b1161007a578063f2fde38b14610b74578063f36c6fbf14610b94578063f46a19e214610bb4578063f4a0a52814610bd4578063ff7d4cee14610bf457600080fd5b8063e372ac4f14610b0c578063e449f34114610b21578063e985e9c514610b41578063efef39a114610b6157600080fd5b8063c204642c116100e7578063c204642c14610aa2578063c87b56dd14610ac2578063ca628c7814610ae2578063dbb6f0ff14610af757600080fd5b8063b88d4fde14610a2d578063b89e5e8514610a4d578063bc54409e14610a62578063bf8bcee414610a8257600080fd5b80638da5cb5b11610190578063a23c18221161015f578063a23c1822146109c3578063a80338e1146109e3578063ae1411dc14610a03578063b4d6e36a14610a1857600080fd5b80638da5cb5b1461095a57806395d89b41146109785780639d9e3c091461098d578063a22cb465146109a357600080fd5b80637bdcce20116101cc5780637bdcce20146108ef5780637ca979371461090f57806383348353146109245780638d859f3e1461094457600080fd5b80636dfa8d991461088557806370a082311461089a578063715018a6146108ba5780637b73e29a146108cf57600080fd5b806332cb6b0c116102f85780634a1bece61161028b57806355f804b31161025a57806355f804b3146107f85780635c975abb1461081857806362728930146108305780636352211e14610845578063693619b31461086557600080fd5b80634a1bece61461072c5780634ead4327146107415780634f525c94146107be5780634f6ccce7146107d857600080fd5b806342842e0e116102c757806342842e0e146106c15780634641257d146106e157806346c440b6146106f65780634836c43f1461071657600080fd5b806332cb6b0c14610649578063348e50c61461065f578063380883b81461067f5780633ccfd60b146106ac57600080fd5b8063150b7a02116103705780631ff51c861161033f5780631ff51c86146105c957806323b872dd146105e957806328eeae2c146106095780632f745c591461062957600080fd5b8063150b7a0214610512578063155451871461054b57806318160ddd1461056b5780631959a0021461058057600080fd5b8063081812fc116103ac578063081812fc14610482578063095ea7b3146104ba5780630eb73e7d146104dc578063110cc21a146104f257600080fd5b80628cc262146103e7578062f6951e1461041a57806301ffc9a71461043057806306fdde031461046057600080fd5b366103e257005b600080fd5b3480156103f357600080fd5b50610407610402366004613a96565b610c46565b6040519081526020015b60405180910390f35b34801561042657600080fd5b5061040760175481565b34801561043c57600080fd5b5061045061044b366004613ed8565b610de9565b6040519015158152602001610411565b34801561046c57600080fd5b50610475610e14565b6040516104119190614171565b34801561048e57600080fd5b506104a261049d366004613e1c565b610ea6565b6040516001600160a01b039091168152602001610411565b3480156104c657600080fd5b506104da6104d5366004613bd2565b610f33565b005b3480156104e857600080fd5b5061040760155481565b3480156104fe57600080fd5b506104da61050d366004613a96565b611049565b34801561051e57600080fd5b5061053261052d366004613b20565b611095565b6040516001600160e01b03199091168152602001610411565b34801561055757600080fd5b50610450610566366004613e35565b6110a6565b34801561057757600080fd5b50600a54610407565b34801561058c57600080fd5b506105b461059b366004613a96565b601c602052600090815260409020805460019091015482565b60408051928352602083019190915201610411565b3480156105d557600080fd5b506013546104a2906001600160a01b031681565b3480156105f557600080fd5b506104da610604366004613ae4565b6110bc565b34801561061557600080fd5b506104da610624366004613f9f565b6110ed565b34801561063557600080fd5b50610407610644366004613bd2565b61112b565b34801561065557600080fd5b50610407600d5481565b34801561066b57600080fd5b506104a261067a366004613e1c565b6111c1565b34801561068b57600080fd5b5061069f61069a366004613a96565b6111eb565b604051610411919061412d565b3480156106b857600080fd5b506104da6112f3565b3480156106cd57600080fd5b506104da6106dc366004613ae4565b611350565b3480156106ed57600080fd5b506104da61136b565b34801561070257600080fd5b506104da610711366004613e1c565b611501565b34801561072257600080fd5b5061040760165481565b34801561073857600080fd5b50610407611530565b34801561074d57600080fd5b506107a361075c366004613a96565b6040805180820190915260008082526020820152506001600160a01b03166000908152601c6020908152604091829020825180840190935280548352600101549082015290565b60408051825181526020928301519281019290925201610411565b3480156107ca57600080fd5b506011546104509060ff1681565b3480156107e457600080fd5b506104076107f3366004613e1c565b6115a0565b34801561080457600080fd5b506104da610813366004613f12565b611633565b34801561082457600080fd5b5060015460ff16610450565b34801561083c57600080fd5b50610407611670565b34801561085157600080fd5b506104a2610860366004613e1c565b6116c1565b34801561087157600080fd5b50610450610880366004613bd2565b611738565b34801561089157600080fd5b5061040761175a565b3480156108a657600080fd5b506104076108b5366004613a96565b6117b7565b3480156108c657600080fd5b506104da61183e565b3480156108db57600080fd5b5061069f6108ea366004613a96565b6118b2565b3480156108fb57600080fd5b5061045061090a366004613bd2565b611987565b34801561091b57600080fd5b506104076119a9565b34801561093057600080fd5b506104da61093f366004613ca5565b6119f0565b34801561095057600080fd5b50610407600e5481565b34801561096657600080fd5b50600c546001600160a01b03166104a2565b34801561098457600080fd5b50610475611d9e565b34801561099957600080fd5b5061040760145481565b3480156109af57600080fd5b506104da6109be366004613b9b565b611dad565b3480156109cf57600080fd5b5061069f6109de366004613a96565b611e72565b3480156109ef57600080fd5b506104506109fe366004613bd2565b611f47565b348015610a0f57600080fd5b50610407611f69565b348015610a2457600080fd5b50610407611fba565b348015610a3957600080fd5b506104da610a48366004613b20565b61200b565b348015610a5957600080fd5b50610407612043565b348015610a6e57600080fd5b50610450610a7d366004613bd2565b61208a565b348015610a8e57600080fd5b506104da610a9d366004613e1c565b6120ac565b348015610aae57600080fd5b506104da610abd366004613bfc565b6120db565b348015610ace57600080fd5b50610475610add366004613e1c565b61219b565b348015610aee57600080fd5b506104da61221b565b348015610b0357600080fd5b506104076122d9565b348015610b1857600080fd5b50610407612320565b348015610b2d57600080fd5b506104da610b3c366004613d68565b612371565b348015610b4d57600080fd5b50610450610b5c366004613ab1565b6125fa565b6104da610b6f366004613e1c565b612628565b348015610b8057600080fd5b506104da610b8f366004613a96565b61275a565b348015610ba057600080fd5b5061069f610baf366004613a96565b612845565b348015610bc057600080fd5b5061069f610bcf366004613a96565b6128ea565b348015610be057600080fd5b506104da610bef366004613e1c565b6129bf565b348015610c0057600080fd5b50610407610c0f366004613f73565b6040805160208082019490945280820194909452606080850192909252805180850390920182526080909301909252815191012090565b6001600160a01b0381166000818152601c6020908152604080832081518083018352815481526001909101548184015260145494845260189092528220919242928491610cbf916201518091610cb991610cb390610ca390612a0b565b6020880151610cb3908a90612a15565b90612a21565b90612a2d565b90506000610d1062015180610cb9601554610cb3610d00601960008d6001600160a01b03166001600160a01b03168152602001908152602001600020612a0b565b6020890151610cb3908b90612a15565b90506000610d6162015180610cb9601654610cb3610d51601a60008e6001600160a01b03166001600160a01b03168152602001908152602001600020612a0b565b60208a0151610cb3908c90612a15565b90506000610db262015180610cb9601754610cb3610da2601b60008f6001600160a01b03166001600160a01b03168152602001908152602001600020612a0b565b60208b0151610cb3908d90612a15565b9050610ddd81610dd784610dd787610dd78a8c60000151612a3990919063ffffffff16565b90612a39565b98975050505050505050565b60006001600160e01b0319821663780e9d6360e01b1480610e0e5750610e0e82612a45565b92915050565b606060028054610e23906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f906143bd565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b5050505050905090565b6000610eb182612a95565b610f175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610f3e826116c1565b9050806001600160a01b0316836001600160a01b03161415610fac5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610f0e565b336001600160a01b0382161480610fc85750610fc881336125fa565b61103a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610f0e565b6110448383612ab2565b505050565b600c546001600160a01b031633146110735760405162461bcd60e51b8152600401610f0e906141d6565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b630a85bd0160e11b5b949350505050565b60006110b58260125485612b20565b9392505050565b6110c63382612b36565b6110e25760405162461bcd60e51b8152600401610f0e9061420b565b611044838383612bf8565b600c546001600160a01b031633146111175760405162461bcd60e51b8152600401610f0e906141d6565b601493909355601591909155601655601755565b6000611136836117b7565b82106111985760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610f0e565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b601d81815481106111d157600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0381166000908152601a602052604081206060919061121090612a0b565b90508061124b5760005b604051908082528060200260200182016040528015611243578160200160208202803683370190505b509392505050565b6000816001600160401b0381111561126557611265614479565b60405190808252806020026020018201604052801561128e578160200160208202803683370190505b50905060005b82811015611243576001600160a01b0385166000908152601a602052604090206112be9082612da3565b8282815181106112d0576112d0614463565b6020908102919091010152806112e5816143f2565b915050611294565b50919050565b600c546001600160a01b0316331461131d5760405162461bcd60e51b8152600401610f0e906141d6565b6040514790339082156108fc029083906000818181858888f1935050505015801561134c573d6000803e3d6000fd5b5050565b6110448383836040518060200160405280600081525061200b565b6002600054141561138e5760405162461bcd60e51b8152600401610f0e9061425c565b600260005560115460ff1615156001146113ea5760405162461bcd60e51b815260206004820152601860248201527f48617276657374206973206e6f742061637469766174656400000000000000006044820152606401610f0e565b336000818152601c602052604090209061140390610c46565b8082554260018301556013546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561144f57600080fd5b505afa158015611463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114879190613f5a565b10156114d55760405162461bcd60e51b815260206004820152601c60248201527f52657761726420746f6b656e20616d6f756e7420697320736d616c6c000000006044820152606401610f0e565b8054156114f5576114f53382546013546001600160a01b03169190612daf565b60009081905560019055565b600c546001600160a01b0316331461152b5760405162461bcd60e51b8152600401610f0e906141d6565b601255565b600080805b601d548110156112ed57611582601b6000601d848154811061155957611559614463565b60009182526020808320909101546001600160a01b031683528201929092526040019020612a0b565b61158c908361432f565b915080611598816143f2565b915050611535565b60006115ab600a5490565b821061160e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610f0e565b600a828154811061162157611621614463565b90600052602060002001549050919050565b600c546001600160a01b0316331461165d5760405162461bcd60e51b8152600401610f0e906141d6565b805161134c90600f90602084019061393f565b600080805b601d548110156112ed57600061169b60186000601d858154811061155957611559614463565b11156116af576116ac60018361432f565b91505b806116b9816143f2565b915050611675565b6000818152600460205260408120546001600160a01b031680610e0e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610f0e565b6001600160a01b03821660009081526019602052604081206110b59083612e01565b600080805b601d548110156112ed57611799601d828154811061177f5761177f614463565b6000918252602090912001546001600160a01b0316610c46565b6117a3908361432f565b9150806117af816143f2565b91505061175f565b60006001600160a01b0382166118225760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610f0e565b506001600160a01b031660009081526005602052604090205490565b600c546001600160a01b031633146118685760405162461bcd60e51b8152600401610f0e906141d6565b600c546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600c80546001600160a01b0319169055565b6001600160a01b0381166000908152601960205260408120606091906118d790612a0b565b9050806118e557600061121a565b6000816001600160401b038111156118ff576118ff614479565b604051908082528060200260200182016040528015611928578160200160208202803683370190505b50905060005b82811015611243576001600160a01b03851660009081526019602052604090206119589082612da3565b82828151811061196a5761196a614463565b60209081029190910101528061197f816143f2565b91505061192e565b6001600160a01b0382166000908152601a602052604081206110b59083612e01565b600080805b601d548110156112ed576119d260186000601d848154811061155957611559614463565b6119dc908361432f565b9150806119e8816143f2565b9150506119ae565b60026000541415611a135760405162461bcd60e51b8152600401610f0e9061425c565b600260005560015460ff1615611a5e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610f0e565b611a6833306125fa565b611abe5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420617070726f7665206e667420746f207374616b6572206164647265736044820152607360f81b6064820152608401610f0e565b611ac733612e19565b336000818152601c6020526040902090611ae090610c46565b815542600182015560005b88811015611d8d57611bd6611b7b8b8b84818110611b0b57611b0b614463565b905060200201358a8a85818110611b2457611b24614463565b90506020020135898986818110611b3d57611b3d614463565b905060200201356040805160208082019490945280820194909452606080850192909252805180850390920182526080909301909252815191012090565b858584818110611b8d57611b8d614463565b9050602002810190611b9f9190614293565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506110a692505050565b611c115760405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c84090c2e6d60a31b6044820152606401610f0e565b611c3433308c8c85818110611c2857611c28614463565b90506020020135611350565b858582818110611c4657611c46614463565b9050602002013560001415611ca157611c9b8a8a83818110611c6a57611c6a614463565b9050602002013560186000611c7c3390565b6001600160a01b03168152602081019190915260400160002090612ec7565b50611d7b565b858582818110611cb357611cb3614463565b9050602002013560011415611ce957611c9b8a8a83818110611cd757611cd7614463565b9050602002013560196000611c7c3390565b858582818110611cfb57611cfb614463565b9050602002013560021415611d3157611c9b8a8a83818110611d1f57611d1f614463565b90506020020135601a6000611c7c3390565b858582818110611d4357611d43614463565b9050602002013560031415611d7b57611d798a8a83818110611d6757611d67614463565b90506020020135601b6000611c7c3390565b505b80611d85816143f2565b915050611aeb565b505060016000555050505050505050565b606060038054610e23906143bd565b6001600160a01b038216331415611e065760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610f0e565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001600160a01b0381166000908152601b6020526040812060609190611e9790612a0b565b905080611ea557600061121a565b6000816001600160401b03811115611ebf57611ebf614479565b604051908082528060200260200182016040528015611ee8578160200160208202803683370190505b50905060005b82811015611243576001600160a01b0385166000908152601b60205260409020611f189082612da3565b828281518110611f2a57611f2a614463565b602090810291909101015280611f3f816143f2565b915050611eee565b6001600160a01b03821660009081526018602052604081206110b59083612e01565b600080805b601d548110156112ed576000611f9460196000601d858154811061155957611559614463565b1115611fa857611fa560018361432f565b91505b80611fb2816143f2565b915050611f6e565b600080805b601d548110156112ed576000611fe5601b6000601d858154811061155957611559614463565b1115611ff957611ff660018361432f565b91505b80612003816143f2565b915050611fbf565b6120153383612b36565b6120315760405162461bcd60e51b8152600401610f0e9061420b565b61203d84848484612ed3565b50505050565b600080805b601d548110156112ed5761206c60196000601d848154811061155957611559614463565b612076908361432f565b915080612082816143f2565b915050612048565b6001600160a01b0382166000908152601b602052604081206110b59083612e01565b600c546001600160a01b031633146120d65760405162461bcd60e51b8152600401610f0e906141d6565b600d55565b600c546001600160a01b031633146121055760405162461bcd60e51b8152600401610f0e906141d6565b60005b82518110156110445760005b8281101561218857600061212760105490565b9050600d5461213560105490565b10156121755761214560106129ee565b61214e81612a95565b6121755761217585848151811061216757612167614463565b602002602001015182612f06565b5080612180816143f2565b915050612114565b5080612193816143f2565b915050612108565b60606121a682612a95565b6121e95760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610f0e565b600f6121f483612f20565b604051602001612205929190614035565b6040516020818303038152906040529050919050565b600c546001600160a01b031633146122455760405162461bcd60e51b8152600401610f0e906141d6565b6122d7336013546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561228c57600080fd5b505afa1580156122a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c49190613f5a565b6013546001600160a01b03169190612daf565b565b600080805b601d548110156112ed57612302601a6000601d848154811061155957611559614463565b61230c908361432f565b915080612318816143f2565b9150506122de565b600080805b601d548110156112ed57600061234b601a6000601d858154811061155957611559614463565b111561235f5761235c60018361432f565b91505b80612369816143f2565b915050612325565b600260005414156123945760405162461bcd60e51b8152600401610f0e9061425c565b6002600090815533808252601c6020526040909120906123b390610c46565b815542600182015560005b82518110156125f0576123eb335b8483815181106123de576123de614463565b6020026020010151611f47565b806124155750612415335b84838151811061240857612408614463565b6020026020010151611738565b8061243f575061243f335b84838151811061243257612432614463565b6020026020010151611987565b806124695750612469335b84838151811061245c5761245c614463565b602002602001015161208a565b6124ab5760405162461bcd60e51b8152602060048201526013602482015272139bdd081cdd185ad959081d1a1a5cc81b999d606a1b6044820152606401610f0e565b6124df30338584815181106124c2576124c2614463565b602002602001015160405180602001604052806000815250612ed3565b6124e8336123cc565b1561253a5761253483828151811061250257612502614463565b6020026020010151601860006125153390565b6001600160a01b0316815260208101919091526040016000209061301d565b506125de565b612543336123f6565b156125705761253483828151811061255d5761255d614463565b6020026020010151601960006125153390565b61257933612420565b156125a65761253483828151811061259357612593614463565b6020026020010151601a60006125153390565b6125af3361244a565b156125de576125dc8382815181106125c9576125c9614463565b6020026020010151601b60006125153390565b505b806125e8816143f2565b9150506123be565b5050600160005550565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600d548161263560105490565b61263f919061432f565b111561268d5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564204d41585f535550504c596044820152606401610f0e565b600c546001600160a01b031633146126fc573481600e546126ae919061435b565b11156126fc5760405162461bcd60e51b815260206004820152601c60248201527f45544820616d6f756e74206973206e6f742073756666696369656e74000000006044820152606401610f0e565b60005b8181101561134c57600061271260105490565b9050600d5461272060105490565b10156127475761273060106129ee565b61273981612a95565b612747576127473382612f06565b5080612752816143f2565b9150506126ff565b600c546001600160a01b031633146127845760405162461bcd60e51b8152600401610f0e906141d6565b6001600160a01b0381166127e95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f0e565b600c546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000612852836117b7565b90508061286057600061121a565b6000816001600160401b0381111561287a5761287a614479565b6040519080825280602002602001820160405280156128a3578160200160208202803683370190505b50905060005b82811015611243576128bb858261112b565b8282815181106128cd576128cd614463565b6020908102919091010152806128e2816143f2565b9150506128a9565b6001600160a01b03811660009081526018602052604081206060919061290f90612a0b565b90508061291d57600061121a565b6000816001600160401b0381111561293757612937614479565b604051908082528060200260200182016040528015612960578160200160208202803683370190505b50905060005b82811015611243576001600160a01b03851660009081526018602052604090206129909082612da3565b8282815181106129a2576129a2614463565b6020908102919091010152806129b7816143f2565b915050612966565b600c546001600160a01b031633146129e95760405162461bcd60e51b8152600401610f0e906141d6565b600e55565b6001816000016000828254612a03919061432f565b909155505050565b6000610e0e825490565b60006110b5828461437a565b60006110b5828461435b565b60006110b58284614347565b60006110b5828461432f565b60006001600160e01b031982166380ac58cd60e01b1480612a7657506001600160e01b03198216635b5e139f60e01b145b80610e0e57506301ffc9a760e01b6001600160e01b0319831614610e0e565b6000908152600460205260409020546001600160a01b0316151590565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612ae7826116c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082612b2d8584613029565b14949350505050565b6000612b4182612a95565b612ba25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f0e565b6000612bad836116c1565b9050806001600160a01b0316846001600160a01b03161480612be85750836001600160a01b0316612bdd84610ea6565b6001600160a01b0316145b8061109e575061109e81856125fa565b826001600160a01b0316612c0b826116c1565b6001600160a01b031614612c735760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610f0e565b6001600160a01b038216612cd55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610f0e565b612ce08383836130cd565b612ceb600082612ab2565b6001600160a01b0383166000908152600560205260408120805460019290612d1490849061437a565b90915550506001600160a01b0382166000908152600560205260408120805460019290612d4290849061432f565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006110b58383613185565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110449084906131af565b600081815260018301602052604081205415156110b5565b60005b601d54811015612e7457816001600160a01b0316601d8281548110612e4357612e43614463565b6000918252602090912001546001600160a01b03161415612e62575050565b80612e6c816143f2565b915050612e1c565b50601d80546001810182556000919091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319166001600160a01b0392909216919091179055565b60006110b58383613281565b612ede848484612bf8565b612eea848484846132d0565b61203d5760405162461bcd60e51b8152600401610f0e90614184565b61134c8282604051806020016040528060008152506133da565b606081612f445750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f6e5780612f58816143f2565b9150612f679050600a83614347565b9150612f48565b6000816001600160401b03811115612f8857612f88614479565b6040519080825280601f01601f191660200182016040528015612fb2576020820181803683370190505b5090505b841561109e57612fc760018361437a565b9150612fd4600a8661440d565b612fdf90603061432f565b60f81b818381518110612ff457612ff4614463565b60200101906001600160f81b031916908160001a905350613016600a86614347565b9450612fb6565b60006110b5838361340d565b600081815b845181101561124357600085828151811061304b5761304b614463565b6020026020010151905080831161308d5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506130ba565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806130c5816143f2565b91505061302e565b6001600160a01b0383166131285761312381600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61314b565b816001600160a01b0316836001600160a01b03161461314b5761314b8382613500565b6001600160a01b038216613162576110448161359d565b826001600160a01b0316826001600160a01b03161461104457611044828261364c565b600082600001828154811061319c5761319c614463565b9060005260206000200154905092915050565b6000613204826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136909092919063ffffffff16565b80519091501561104457808060200190518101906132229190613dff565b6110445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610f0e565b60008181526001830160205260408120546132c857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e0e565b506000610e0e565b60006001600160a01b0384163b156133d257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906133149033908990889088906004016140f0565b602060405180830381600087803b15801561332e57600080fd5b505af192505050801561335e575060408051601f3d908101601f1916820190925261335b91810190613ef5565b60015b6133b8573d80801561338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b5080516133b05760405162461bcd60e51b8152600401610f0e90614184565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061109e565b50600161109e565b6133e4838361369f565b6133f160008484846132d0565b6110445760405162461bcd60e51b8152600401610f0e90614184565b600081815260018301602052604081205480156134f657600061343160018361437a565b85549091506000906134459060019061437a565b90508181146134aa57600086600001828154811061346557613465614463565b906000526020600020015490508087600001848154811061348857613488614463565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806134bb576134bb61444d565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610e0e565b6000915050610e0e565b6000600161350d846117b7565b613517919061437a565b60008381526009602052604090205490915080821461356a576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906135af9060019061437a565b6000838152600b6020526040812054600a80549394509092849081106135d7576135d7614463565b9060005260206000200154905080600a83815481106135f8576135f8614463565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a8054806136305761363061444d565b6001900381819060005260206000200160009055905550505050565b6000613657836117b7565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b606061109e84846000856137de565b6001600160a01b0382166136f55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610f0e565b6136fe81612a95565b1561374b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610f0e565b613757600083836130cd565b6001600160a01b038216600090815260056020526040812080546001929061378090849061432f565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608247101561383f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610f0e565b843b61388d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f0e565b600080866001600160a01b031685876040516138a99190614019565b60006040518083038185875af1925050503d80600081146138e6576040519150601f19603f3d011682016040523d82523d6000602084013e6138eb565b606091505b50915091506138fb828286613906565b979650505050505050565b606083156139155750816110b5565b8251156139255782518084602001fd5b8160405162461bcd60e51b8152600401610f0e9190614171565b82805461394b906143bd565b90600052602060002090601f01602090048101928261396d57600085556139b3565b82601f1061398657805160ff19168380011785556139b3565b828001600101855582156139b3579182015b828111156139b3578251825591602001919060010190613998565b506139bf9291506139c3565b5090565b5b808211156139bf57600081556001016139c4565b60006001600160401b038311156139f1576139f1614479565b613a04601f8401601f19166020016142dc565b9050828152838383011115613a1857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114613a4657600080fd5b919050565b60008083601f840112613a5d57600080fd5b5081356001600160401b03811115613a7457600080fd5b6020830191508360208260051b8501011115613a8f57600080fd5b9250929050565b600060208284031215613aa857600080fd5b6110b582613a2f565b60008060408385031215613ac457600080fd5b613acd83613a2f565b9150613adb60208401613a2f565b90509250929050565b600080600060608486031215613af957600080fd5b613b0284613a2f565b9250613b1060208501613a2f565b9150604084013590509250925092565b60008060008060808587031215613b3657600080fd5b613b3f85613a2f565b9350613b4d60208601613a2f565b92506040850135915060608501356001600160401b03811115613b6f57600080fd5b8501601f81018713613b8057600080fd5b613b8f878235602084016139d8565b91505092959194509250565b60008060408385031215613bae57600080fd5b613bb783613a2f565b91506020830135613bc78161448f565b809150509250929050565b60008060408385031215613be557600080fd5b613bee83613a2f565b946020939093013593505050565b60008060408385031215613c0f57600080fd5b82356001600160401b03811115613c2557600080fd5b8301601f81018513613c3657600080fd5b80356020613c4b613c468361430c565b6142dc565b80838252828201915082850189848660051b8801011115613c6b57600080fd5b600095505b84861015613c9557613c8181613a2f565b835260019590950194918301918301613c70565b5098969091013596505050505050565b6000806000806000806000806080898b031215613cc157600080fd5b88356001600160401b0380821115613cd857600080fd5b613ce48c838d01613a4b565b909a50985060208b0135915080821115613cfd57600080fd5b613d098c838d01613a4b565b909850965060408b0135915080821115613d2257600080fd5b613d2e8c838d01613a4b565b909650945060608b0135915080821115613d4757600080fd5b50613d548b828c01613a4b565b999c989b5096995094979396929594505050565b60006020808385031215613d7b57600080fd5b82356001600160401b03811115613d9157600080fd5b8301601f81018513613da257600080fd5b8035613db0613c468261430c565b80828252848201915084840188868560051b8701011115613dd057600080fd5b600094505b83851015613df3578035835260019490940193918501918501613dd5565b50979650505050505050565b600060208284031215613e1157600080fd5b81516110b58161448f565b600060208284031215613e2e57600080fd5b5035919050565b60008060408385031215613e4857600080fd5b823591506020808401356001600160401b03811115613e6657600080fd5b8401601f81018613613e7757600080fd5b8035613e85613c468261430c565b80828252848201915084840189868560051b8701011115613ea557600080fd5b600094505b83851015613ec8578035835260019490940193918501918501613eaa565b5080955050505050509250929050565b600060208284031215613eea57600080fd5b81356110b5816144a0565b600060208284031215613f0757600080fd5b81516110b5816144a0565b600060208284031215613f2457600080fd5b81356001600160401b03811115613f3a57600080fd5b8201601f81018413613f4b57600080fd5b61109e848235602084016139d8565b600060208284031215613f6c57600080fd5b5051919050565b600080600060608486031215613f8857600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215613fb557600080fd5b5050823594602084013594506040840135936060013592509050565b60008151808452613fe9816020860160208601614391565b601f01601f19169290920160200192915050565b6000815161400f818560208601614391565b9290920192915050565b6000825161402b818460208701614391565b9190910192915050565b600080845481600182811c91508083168061405157607f831692505b602080841082141561407157634e487b7160e01b86526022600452602486fd5b8180156140855760018114614096576140c3565b60ff198616895284890196506140c3565b60008b81526020902060005b868110156140bb5781548b8201529085019083016140a2565b505084890196505b5050505050506140e76140d68286613ffd565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061412390830184613fd1565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561416557835183529284019291840191600101614149565b50909695505050505050565b6020815260006110b56020830184613fd1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000808335601e198436030181126142aa57600080fd5b8301803591506001600160401b038211156142c457600080fd5b6020019150600581901b3603821315613a8f57600080fd5b604051601f8201601f191681016001600160401b038111828210171561430457614304614479565b604052919050565b60006001600160401b0382111561432557614325614479565b5060051b60200190565b6000821982111561434257614342614421565b500190565b60008261435657614356614437565b500490565b600081600019048311821515161561437557614375614421565b500290565b60008282101561438c5761438c614421565b500390565b60005b838110156143ac578181015183820152602001614394565b8381111561203d5750506000910152565b600181811c908216806143d157607f821691505b602082108114156112ed57634e487b7160e01b600052602260045260246000fd5b600060001982141561440657614406614421565b5060010190565b60008261441c5761441c614437565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461449d57600080fd5b50565b6001600160e01b03198116811461449d57600080fdfea26469706673582212209888ce390e888c581d6e9a41368c7e5a90c8e883943c593b92c6bb0579e828cb64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106103db5760003560e01c80636dfa8d99116101fd578063b88d4fde11610118578063e372ac4f116100ab578063f2fde38b1161007a578063f2fde38b14610b74578063f36c6fbf14610b94578063f46a19e214610bb4578063f4a0a52814610bd4578063ff7d4cee14610bf457600080fd5b8063e372ac4f14610b0c578063e449f34114610b21578063e985e9c514610b41578063efef39a114610b6157600080fd5b8063c204642c116100e7578063c204642c14610aa2578063c87b56dd14610ac2578063ca628c7814610ae2578063dbb6f0ff14610af757600080fd5b8063b88d4fde14610a2d578063b89e5e8514610a4d578063bc54409e14610a62578063bf8bcee414610a8257600080fd5b80638da5cb5b11610190578063a23c18221161015f578063a23c1822146109c3578063a80338e1146109e3578063ae1411dc14610a03578063b4d6e36a14610a1857600080fd5b80638da5cb5b1461095a57806395d89b41146109785780639d9e3c091461098d578063a22cb465146109a357600080fd5b80637bdcce20116101cc5780637bdcce20146108ef5780637ca979371461090f57806383348353146109245780638d859f3e1461094457600080fd5b80636dfa8d991461088557806370a082311461089a578063715018a6146108ba5780637b73e29a146108cf57600080fd5b806332cb6b0c116102f85780634a1bece61161028b57806355f804b31161025a57806355f804b3146107f85780635c975abb1461081857806362728930146108305780636352211e14610845578063693619b31461086557600080fd5b80634a1bece61461072c5780634ead4327146107415780634f525c94146107be5780634f6ccce7146107d857600080fd5b806342842e0e116102c757806342842e0e146106c15780634641257d146106e157806346c440b6146106f65780634836c43f1461071657600080fd5b806332cb6b0c14610649578063348e50c61461065f578063380883b81461067f5780633ccfd60b146106ac57600080fd5b8063150b7a02116103705780631ff51c861161033f5780631ff51c86146105c957806323b872dd146105e957806328eeae2c146106095780632f745c591461062957600080fd5b8063150b7a0214610512578063155451871461054b57806318160ddd1461056b5780631959a0021461058057600080fd5b8063081812fc116103ac578063081812fc14610482578063095ea7b3146104ba5780630eb73e7d146104dc578063110cc21a146104f257600080fd5b80628cc262146103e7578062f6951e1461041a57806301ffc9a71461043057806306fdde031461046057600080fd5b366103e257005b600080fd5b3480156103f357600080fd5b50610407610402366004613a96565b610c46565b6040519081526020015b60405180910390f35b34801561042657600080fd5b5061040760175481565b34801561043c57600080fd5b5061045061044b366004613ed8565b610de9565b6040519015158152602001610411565b34801561046c57600080fd5b50610475610e14565b6040516104119190614171565b34801561048e57600080fd5b506104a261049d366004613e1c565b610ea6565b6040516001600160a01b039091168152602001610411565b3480156104c657600080fd5b506104da6104d5366004613bd2565b610f33565b005b3480156104e857600080fd5b5061040760155481565b3480156104fe57600080fd5b506104da61050d366004613a96565b611049565b34801561051e57600080fd5b5061053261052d366004613b20565b611095565b6040516001600160e01b03199091168152602001610411565b34801561055757600080fd5b50610450610566366004613e35565b6110a6565b34801561057757600080fd5b50600a54610407565b34801561058c57600080fd5b506105b461059b366004613a96565b601c602052600090815260409020805460019091015482565b60408051928352602083019190915201610411565b3480156105d557600080fd5b506013546104a2906001600160a01b031681565b3480156105f557600080fd5b506104da610604366004613ae4565b6110bc565b34801561061557600080fd5b506104da610624366004613f9f565b6110ed565b34801561063557600080fd5b50610407610644366004613bd2565b61112b565b34801561065557600080fd5b50610407600d5481565b34801561066b57600080fd5b506104a261067a366004613e1c565b6111c1565b34801561068b57600080fd5b5061069f61069a366004613a96565b6111eb565b604051610411919061412d565b3480156106b857600080fd5b506104da6112f3565b3480156106cd57600080fd5b506104da6106dc366004613ae4565b611350565b3480156106ed57600080fd5b506104da61136b565b34801561070257600080fd5b506104da610711366004613e1c565b611501565b34801561072257600080fd5b5061040760165481565b34801561073857600080fd5b50610407611530565b34801561074d57600080fd5b506107a361075c366004613a96565b6040805180820190915260008082526020820152506001600160a01b03166000908152601c6020908152604091829020825180840190935280548352600101549082015290565b60408051825181526020928301519281019290925201610411565b3480156107ca57600080fd5b506011546104509060ff1681565b3480156107e457600080fd5b506104076107f3366004613e1c565b6115a0565b34801561080457600080fd5b506104da610813366004613f12565b611633565b34801561082457600080fd5b5060015460ff16610450565b34801561083c57600080fd5b50610407611670565b34801561085157600080fd5b506104a2610860366004613e1c565b6116c1565b34801561087157600080fd5b50610450610880366004613bd2565b611738565b34801561089157600080fd5b5061040761175a565b3480156108a657600080fd5b506104076108b5366004613a96565b6117b7565b3480156108c657600080fd5b506104da61183e565b3480156108db57600080fd5b5061069f6108ea366004613a96565b6118b2565b3480156108fb57600080fd5b5061045061090a366004613bd2565b611987565b34801561091b57600080fd5b506104076119a9565b34801561093057600080fd5b506104da61093f366004613ca5565b6119f0565b34801561095057600080fd5b50610407600e5481565b34801561096657600080fd5b50600c546001600160a01b03166104a2565b34801561098457600080fd5b50610475611d9e565b34801561099957600080fd5b5061040760145481565b3480156109af57600080fd5b506104da6109be366004613b9b565b611dad565b3480156109cf57600080fd5b5061069f6109de366004613a96565b611e72565b3480156109ef57600080fd5b506104506109fe366004613bd2565b611f47565b348015610a0f57600080fd5b50610407611f69565b348015610a2457600080fd5b50610407611fba565b348015610a3957600080fd5b506104da610a48366004613b20565b61200b565b348015610a5957600080fd5b50610407612043565b348015610a6e57600080fd5b50610450610a7d366004613bd2565b61208a565b348015610a8e57600080fd5b506104da610a9d366004613e1c565b6120ac565b348015610aae57600080fd5b506104da610abd366004613bfc565b6120db565b348015610ace57600080fd5b50610475610add366004613e1c565b61219b565b348015610aee57600080fd5b506104da61221b565b348015610b0357600080fd5b506104076122d9565b348015610b1857600080fd5b50610407612320565b348015610b2d57600080fd5b506104da610b3c366004613d68565b612371565b348015610b4d57600080fd5b50610450610b5c366004613ab1565b6125fa565b6104da610b6f366004613e1c565b612628565b348015610b8057600080fd5b506104da610b8f366004613a96565b61275a565b348015610ba057600080fd5b5061069f610baf366004613a96565b612845565b348015610bc057600080fd5b5061069f610bcf366004613a96565b6128ea565b348015610be057600080fd5b506104da610bef366004613e1c565b6129bf565b348015610c0057600080fd5b50610407610c0f366004613f73565b6040805160208082019490945280820194909452606080850192909252805180850390920182526080909301909252815191012090565b6001600160a01b0381166000818152601c6020908152604080832081518083018352815481526001909101548184015260145494845260189092528220919242928491610cbf916201518091610cb991610cb390610ca390612a0b565b6020880151610cb3908a90612a15565b90612a21565b90612a2d565b90506000610d1062015180610cb9601554610cb3610d00601960008d6001600160a01b03166001600160a01b03168152602001908152602001600020612a0b565b6020890151610cb3908b90612a15565b90506000610d6162015180610cb9601654610cb3610d51601a60008e6001600160a01b03166001600160a01b03168152602001908152602001600020612a0b565b60208a0151610cb3908c90612a15565b90506000610db262015180610cb9601754610cb3610da2601b60008f6001600160a01b03166001600160a01b03168152602001908152602001600020612a0b565b60208b0151610cb3908d90612a15565b9050610ddd81610dd784610dd787610dd78a8c60000151612a3990919063ffffffff16565b90612a39565b98975050505050505050565b60006001600160e01b0319821663780e9d6360e01b1480610e0e5750610e0e82612a45565b92915050565b606060028054610e23906143bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f906143bd565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b5050505050905090565b6000610eb182612a95565b610f175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610f3e826116c1565b9050806001600160a01b0316836001600160a01b03161415610fac5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610f0e565b336001600160a01b0382161480610fc85750610fc881336125fa565b61103a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610f0e565b6110448383612ab2565b505050565b600c546001600160a01b031633146110735760405162461bcd60e51b8152600401610f0e906141d6565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b630a85bd0160e11b5b949350505050565b60006110b58260125485612b20565b9392505050565b6110c63382612b36565b6110e25760405162461bcd60e51b8152600401610f0e9061420b565b611044838383612bf8565b600c546001600160a01b031633146111175760405162461bcd60e51b8152600401610f0e906141d6565b601493909355601591909155601655601755565b6000611136836117b7565b82106111985760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610f0e565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b601d81815481106111d157600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0381166000908152601a602052604081206060919061121090612a0b565b90508061124b5760005b604051908082528060200260200182016040528015611243578160200160208202803683370190505b509392505050565b6000816001600160401b0381111561126557611265614479565b60405190808252806020026020018201604052801561128e578160200160208202803683370190505b50905060005b82811015611243576001600160a01b0385166000908152601a602052604090206112be9082612da3565b8282815181106112d0576112d0614463565b6020908102919091010152806112e5816143f2565b915050611294565b50919050565b600c546001600160a01b0316331461131d5760405162461bcd60e51b8152600401610f0e906141d6565b6040514790339082156108fc029083906000818181858888f1935050505015801561134c573d6000803e3d6000fd5b5050565b6110448383836040518060200160405280600081525061200b565b6002600054141561138e5760405162461bcd60e51b8152600401610f0e9061425c565b600260005560115460ff1615156001146113ea5760405162461bcd60e51b815260206004820152601860248201527f48617276657374206973206e6f742061637469766174656400000000000000006044820152606401610f0e565b336000818152601c602052604090209061140390610c46565b8082554260018301556013546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561144f57600080fd5b505afa158015611463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114879190613f5a565b10156114d55760405162461bcd60e51b815260206004820152601c60248201527f52657761726420746f6b656e20616d6f756e7420697320736d616c6c000000006044820152606401610f0e565b8054156114f5576114f53382546013546001600160a01b03169190612daf565b60009081905560019055565b600c546001600160a01b0316331461152b5760405162461bcd60e51b8152600401610f0e906141d6565b601255565b600080805b601d548110156112ed57611582601b6000601d848154811061155957611559614463565b60009182526020808320909101546001600160a01b031683528201929092526040019020612a0b565b61158c908361432f565b915080611598816143f2565b915050611535565b60006115ab600a5490565b821061160e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610f0e565b600a828154811061162157611621614463565b90600052602060002001549050919050565b600c546001600160a01b0316331461165d5760405162461bcd60e51b8152600401610f0e906141d6565b805161134c90600f90602084019061393f565b600080805b601d548110156112ed57600061169b60186000601d858154811061155957611559614463565b11156116af576116ac60018361432f565b91505b806116b9816143f2565b915050611675565b6000818152600460205260408120546001600160a01b031680610e0e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610f0e565b6001600160a01b03821660009081526019602052604081206110b59083612e01565b600080805b601d548110156112ed57611799601d828154811061177f5761177f614463565b6000918252602090912001546001600160a01b0316610c46565b6117a3908361432f565b9150806117af816143f2565b91505061175f565b60006001600160a01b0382166118225760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610f0e565b506001600160a01b031660009081526005602052604090205490565b600c546001600160a01b031633146118685760405162461bcd60e51b8152600401610f0e906141d6565b600c546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600c80546001600160a01b0319169055565b6001600160a01b0381166000908152601960205260408120606091906118d790612a0b565b9050806118e557600061121a565b6000816001600160401b038111156118ff576118ff614479565b604051908082528060200260200182016040528015611928578160200160208202803683370190505b50905060005b82811015611243576001600160a01b03851660009081526019602052604090206119589082612da3565b82828151811061196a5761196a614463565b60209081029190910101528061197f816143f2565b91505061192e565b6001600160a01b0382166000908152601a602052604081206110b59083612e01565b600080805b601d548110156112ed576119d260186000601d848154811061155957611559614463565b6119dc908361432f565b9150806119e8816143f2565b9150506119ae565b60026000541415611a135760405162461bcd60e51b8152600401610f0e9061425c565b600260005560015460ff1615611a5e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610f0e565b611a6833306125fa565b611abe5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420617070726f7665206e667420746f207374616b6572206164647265736044820152607360f81b6064820152608401610f0e565b611ac733612e19565b336000818152601c6020526040902090611ae090610c46565b815542600182015560005b88811015611d8d57611bd6611b7b8b8b84818110611b0b57611b0b614463565b905060200201358a8a85818110611b2457611b24614463565b90506020020135898986818110611b3d57611b3d614463565b905060200201356040805160208082019490945280820194909452606080850192909252805180850390920182526080909301909252815191012090565b858584818110611b8d57611b8d614463565b9050602002810190611b9f9190614293565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506110a692505050565b611c115760405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c84090c2e6d60a31b6044820152606401610f0e565b611c3433308c8c85818110611c2857611c28614463565b90506020020135611350565b858582818110611c4657611c46614463565b9050602002013560001415611ca157611c9b8a8a83818110611c6a57611c6a614463565b9050602002013560186000611c7c3390565b6001600160a01b03168152602081019190915260400160002090612ec7565b50611d7b565b858582818110611cb357611cb3614463565b9050602002013560011415611ce957611c9b8a8a83818110611cd757611cd7614463565b9050602002013560196000611c7c3390565b858582818110611cfb57611cfb614463565b9050602002013560021415611d3157611c9b8a8a83818110611d1f57611d1f614463565b90506020020135601a6000611c7c3390565b858582818110611d4357611d43614463565b9050602002013560031415611d7b57611d798a8a83818110611d6757611d67614463565b90506020020135601b6000611c7c3390565b505b80611d85816143f2565b915050611aeb565b505060016000555050505050505050565b606060038054610e23906143bd565b6001600160a01b038216331415611e065760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610f0e565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001600160a01b0381166000908152601b6020526040812060609190611e9790612a0b565b905080611ea557600061121a565b6000816001600160401b03811115611ebf57611ebf614479565b604051908082528060200260200182016040528015611ee8578160200160208202803683370190505b50905060005b82811015611243576001600160a01b0385166000908152601b60205260409020611f189082612da3565b828281518110611f2a57611f2a614463565b602090810291909101015280611f3f816143f2565b915050611eee565b6001600160a01b03821660009081526018602052604081206110b59083612e01565b600080805b601d548110156112ed576000611f9460196000601d858154811061155957611559614463565b1115611fa857611fa560018361432f565b91505b80611fb2816143f2565b915050611f6e565b600080805b601d548110156112ed576000611fe5601b6000601d858154811061155957611559614463565b1115611ff957611ff660018361432f565b91505b80612003816143f2565b915050611fbf565b6120153383612b36565b6120315760405162461bcd60e51b8152600401610f0e9061420b565b61203d84848484612ed3565b50505050565b600080805b601d548110156112ed5761206c60196000601d848154811061155957611559614463565b612076908361432f565b915080612082816143f2565b915050612048565b6001600160a01b0382166000908152601b602052604081206110b59083612e01565b600c546001600160a01b031633146120d65760405162461bcd60e51b8152600401610f0e906141d6565b600d55565b600c546001600160a01b031633146121055760405162461bcd60e51b8152600401610f0e906141d6565b60005b82518110156110445760005b8281101561218857600061212760105490565b9050600d5461213560105490565b10156121755761214560106129ee565b61214e81612a95565b6121755761217585848151811061216757612167614463565b602002602001015182612f06565b5080612180816143f2565b915050612114565b5080612193816143f2565b915050612108565b60606121a682612a95565b6121e95760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610f0e565b600f6121f483612f20565b604051602001612205929190614035565b6040516020818303038152906040529050919050565b600c546001600160a01b031633146122455760405162461bcd60e51b8152600401610f0e906141d6565b6122d7336013546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561228c57600080fd5b505afa1580156122a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c49190613f5a565b6013546001600160a01b03169190612daf565b565b600080805b601d548110156112ed57612302601a6000601d848154811061155957611559614463565b61230c908361432f565b915080612318816143f2565b9150506122de565b600080805b601d548110156112ed57600061234b601a6000601d858154811061155957611559614463565b111561235f5761235c60018361432f565b91505b80612369816143f2565b915050612325565b600260005414156123945760405162461bcd60e51b8152600401610f0e9061425c565b6002600090815533808252601c6020526040909120906123b390610c46565b815542600182015560005b82518110156125f0576123eb335b8483815181106123de576123de614463565b6020026020010151611f47565b806124155750612415335b84838151811061240857612408614463565b6020026020010151611738565b8061243f575061243f335b84838151811061243257612432614463565b6020026020010151611987565b806124695750612469335b84838151811061245c5761245c614463565b602002602001015161208a565b6124ab5760405162461bcd60e51b8152602060048201526013602482015272139bdd081cdd185ad959081d1a1a5cc81b999d606a1b6044820152606401610f0e565b6124df30338584815181106124c2576124c2614463565b602002602001015160405180602001604052806000815250612ed3565b6124e8336123cc565b1561253a5761253483828151811061250257612502614463565b6020026020010151601860006125153390565b6001600160a01b0316815260208101919091526040016000209061301d565b506125de565b612543336123f6565b156125705761253483828151811061255d5761255d614463565b6020026020010151601960006125153390565b61257933612420565b156125a65761253483828151811061259357612593614463565b6020026020010151601a60006125153390565b6125af3361244a565b156125de576125dc8382815181106125c9576125c9614463565b6020026020010151601b60006125153390565b505b806125e8816143f2565b9150506123be565b5050600160005550565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600d548161263560105490565b61263f919061432f565b111561268d5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564204d41585f535550504c596044820152606401610f0e565b600c546001600160a01b031633146126fc573481600e546126ae919061435b565b11156126fc5760405162461bcd60e51b815260206004820152601c60248201527f45544820616d6f756e74206973206e6f742073756666696369656e74000000006044820152606401610f0e565b60005b8181101561134c57600061271260105490565b9050600d5461272060105490565b10156127475761273060106129ee565b61273981612a95565b612747576127473382612f06565b5080612752816143f2565b9150506126ff565b600c546001600160a01b031633146127845760405162461bcd60e51b8152600401610f0e906141d6565b6001600160a01b0381166127e95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f0e565b600c546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000612852836117b7565b90508061286057600061121a565b6000816001600160401b0381111561287a5761287a614479565b6040519080825280602002602001820160405280156128a3578160200160208202803683370190505b50905060005b82811015611243576128bb858261112b565b8282815181106128cd576128cd614463565b6020908102919091010152806128e2816143f2565b9150506128a9565b6001600160a01b03811660009081526018602052604081206060919061290f90612a0b565b90508061291d57600061121a565b6000816001600160401b0381111561293757612937614479565b604051908082528060200260200182016040528015612960578160200160208202803683370190505b50905060005b82811015611243576001600160a01b03851660009081526018602052604090206129909082612da3565b8282815181106129a2576129a2614463565b6020908102919091010152806129b7816143f2565b915050612966565b600c546001600160a01b031633146129e95760405162461bcd60e51b8152600401610f0e906141d6565b600e55565b6001816000016000828254612a03919061432f565b909155505050565b6000610e0e825490565b60006110b5828461437a565b60006110b5828461435b565b60006110b58284614347565b60006110b5828461432f565b60006001600160e01b031982166380ac58cd60e01b1480612a7657506001600160e01b03198216635b5e139f60e01b145b80610e0e57506301ffc9a760e01b6001600160e01b0319831614610e0e565b6000908152600460205260409020546001600160a01b0316151590565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612ae7826116c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082612b2d8584613029565b14949350505050565b6000612b4182612a95565b612ba25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f0e565b6000612bad836116c1565b9050806001600160a01b0316846001600160a01b03161480612be85750836001600160a01b0316612bdd84610ea6565b6001600160a01b0316145b8061109e575061109e81856125fa565b826001600160a01b0316612c0b826116c1565b6001600160a01b031614612c735760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610f0e565b6001600160a01b038216612cd55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610f0e565b612ce08383836130cd565b612ceb600082612ab2565b6001600160a01b0383166000908152600560205260408120805460019290612d1490849061437a565b90915550506001600160a01b0382166000908152600560205260408120805460019290612d4290849061432f565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006110b58383613185565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110449084906131af565b600081815260018301602052604081205415156110b5565b60005b601d54811015612e7457816001600160a01b0316601d8281548110612e4357612e43614463565b6000918252602090912001546001600160a01b03161415612e62575050565b80612e6c816143f2565b915050612e1c565b50601d80546001810182556000919091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319166001600160a01b0392909216919091179055565b60006110b58383613281565b612ede848484612bf8565b612eea848484846132d0565b61203d5760405162461bcd60e51b8152600401610f0e90614184565b61134c8282604051806020016040528060008152506133da565b606081612f445750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f6e5780612f58816143f2565b9150612f679050600a83614347565b9150612f48565b6000816001600160401b03811115612f8857612f88614479565b6040519080825280601f01601f191660200182016040528015612fb2576020820181803683370190505b5090505b841561109e57612fc760018361437a565b9150612fd4600a8661440d565b612fdf90603061432f565b60f81b818381518110612ff457612ff4614463565b60200101906001600160f81b031916908160001a905350613016600a86614347565b9450612fb6565b60006110b5838361340d565b600081815b845181101561124357600085828151811061304b5761304b614463565b6020026020010151905080831161308d5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506130ba565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806130c5816143f2565b91505061302e565b6001600160a01b0383166131285761312381600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61314b565b816001600160a01b0316836001600160a01b03161461314b5761314b8382613500565b6001600160a01b038216613162576110448161359d565b826001600160a01b0316826001600160a01b03161461104457611044828261364c565b600082600001828154811061319c5761319c614463565b9060005260206000200154905092915050565b6000613204826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136909092919063ffffffff16565b80519091501561104457808060200190518101906132229190613dff565b6110445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610f0e565b60008181526001830160205260408120546132c857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e0e565b506000610e0e565b60006001600160a01b0384163b156133d257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906133149033908990889088906004016140f0565b602060405180830381600087803b15801561332e57600080fd5b505af192505050801561335e575060408051601f3d908101601f1916820190925261335b91810190613ef5565b60015b6133b8573d80801561338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b5080516133b05760405162461bcd60e51b8152600401610f0e90614184565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061109e565b50600161109e565b6133e4838361369f565b6133f160008484846132d0565b6110445760405162461bcd60e51b8152600401610f0e90614184565b600081815260018301602052604081205480156134f657600061343160018361437a565b85549091506000906134459060019061437a565b90508181146134aa57600086600001828154811061346557613465614463565b906000526020600020015490508087600001848154811061348857613488614463565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806134bb576134bb61444d565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610e0e565b6000915050610e0e565b6000600161350d846117b7565b613517919061437a565b60008381526009602052604090205490915080821461356a576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906135af9060019061437a565b6000838152600b6020526040812054600a80549394509092849081106135d7576135d7614463565b9060005260206000200154905080600a83815481106135f8576135f8614463565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a8054806136305761363061444d565b6001900381819060005260206000200160009055905550505050565b6000613657836117b7565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b606061109e84846000856137de565b6001600160a01b0382166136f55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610f0e565b6136fe81612a95565b1561374b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610f0e565b613757600083836130cd565b6001600160a01b038216600090815260056020526040812080546001929061378090849061432f565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608247101561383f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610f0e565b843b61388d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f0e565b600080866001600160a01b031685876040516138a99190614019565b60006040518083038185875af1925050503d80600081146138e6576040519150601f19603f3d011682016040523d82523d6000602084013e6138eb565b606091505b50915091506138fb828286613906565b979650505050505050565b606083156139155750816110b5565b8251156139255782518084602001fd5b8160405162461bcd60e51b8152600401610f0e9190614171565b82805461394b906143bd565b90600052602060002090601f01602090048101928261396d57600085556139b3565b82601f1061398657805160ff19168380011785556139b3565b828001600101855582156139b3579182015b828111156139b3578251825591602001919060010190613998565b506139bf9291506139c3565b5090565b5b808211156139bf57600081556001016139c4565b60006001600160401b038311156139f1576139f1614479565b613a04601f8401601f19166020016142dc565b9050828152838383011115613a1857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114613a4657600080fd5b919050565b60008083601f840112613a5d57600080fd5b5081356001600160401b03811115613a7457600080fd5b6020830191508360208260051b8501011115613a8f57600080fd5b9250929050565b600060208284031215613aa857600080fd5b6110b582613a2f565b60008060408385031215613ac457600080fd5b613acd83613a2f565b9150613adb60208401613a2f565b90509250929050565b600080600060608486031215613af957600080fd5b613b0284613a2f565b9250613b1060208501613a2f565b9150604084013590509250925092565b60008060008060808587031215613b3657600080fd5b613b3f85613a2f565b9350613b4d60208601613a2f565b92506040850135915060608501356001600160401b03811115613b6f57600080fd5b8501601f81018713613b8057600080fd5b613b8f878235602084016139d8565b91505092959194509250565b60008060408385031215613bae57600080fd5b613bb783613a2f565b91506020830135613bc78161448f565b809150509250929050565b60008060408385031215613be557600080fd5b613bee83613a2f565b946020939093013593505050565b60008060408385031215613c0f57600080fd5b82356001600160401b03811115613c2557600080fd5b8301601f81018513613c3657600080fd5b80356020613c4b613c468361430c565b6142dc565b80838252828201915082850189848660051b8801011115613c6b57600080fd5b600095505b84861015613c9557613c8181613a2f565b835260019590950194918301918301613c70565b5098969091013596505050505050565b6000806000806000806000806080898b031215613cc157600080fd5b88356001600160401b0380821115613cd857600080fd5b613ce48c838d01613a4b565b909a50985060208b0135915080821115613cfd57600080fd5b613d098c838d01613a4b565b909850965060408b0135915080821115613d2257600080fd5b613d2e8c838d01613a4b565b909650945060608b0135915080821115613d4757600080fd5b50613d548b828c01613a4b565b999c989b5096995094979396929594505050565b60006020808385031215613d7b57600080fd5b82356001600160401b03811115613d9157600080fd5b8301601f81018513613da257600080fd5b8035613db0613c468261430c565b80828252848201915084840188868560051b8701011115613dd057600080fd5b600094505b83851015613df3578035835260019490940193918501918501613dd5565b50979650505050505050565b600060208284031215613e1157600080fd5b81516110b58161448f565b600060208284031215613e2e57600080fd5b5035919050565b60008060408385031215613e4857600080fd5b823591506020808401356001600160401b03811115613e6657600080fd5b8401601f81018613613e7757600080fd5b8035613e85613c468261430c565b80828252848201915084840189868560051b8701011115613ea557600080fd5b600094505b83851015613ec8578035835260019490940193918501918501613eaa565b5080955050505050509250929050565b600060208284031215613eea57600080fd5b81356110b5816144a0565b600060208284031215613f0757600080fd5b81516110b5816144a0565b600060208284031215613f2457600080fd5b81356001600160401b03811115613f3a57600080fd5b8201601f81018413613f4b57600080fd5b61109e848235602084016139d8565b600060208284031215613f6c57600080fd5b5051919050565b600080600060608486031215613f8857600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215613fb557600080fd5b5050823594602084013594506040840135936060013592509050565b60008151808452613fe9816020860160208601614391565b601f01601f19169290920160200192915050565b6000815161400f818560208601614391565b9290920192915050565b6000825161402b818460208701614391565b9190910192915050565b600080845481600182811c91508083168061405157607f831692505b602080841082141561407157634e487b7160e01b86526022600452602486fd5b8180156140855760018114614096576140c3565b60ff198616895284890196506140c3565b60008b81526020902060005b868110156140bb5781548b8201529085019083016140a2565b505084890196505b5050505050506140e76140d68286613ffd565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061412390830184613fd1565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561416557835183529284019291840191600101614149565b50909695505050505050565b6020815260006110b56020830184613fd1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000808335601e198436030181126142aa57600080fd5b8301803591506001600160401b038211156142c457600080fd5b6020019150600581901b3603821315613a8f57600080fd5b604051601f8201601f191681016001600160401b038111828210171561430457614304614479565b604052919050565b60006001600160401b0382111561432557614325614479565b5060051b60200190565b6000821982111561434257614342614421565b500190565b60008261435657614356614437565b500490565b600081600019048311821515161561437557614375614421565b500290565b60008282101561438c5761438c614421565b500390565b60005b838110156143ac578181015183820152602001614394565b8381111561203d5750506000910152565b600181811c908216806143d157607f821691505b602082108114156112ed57634e487b7160e01b600052602260045260246000fd5b600060001982141561440657614406614421565b5060010190565b60008261441c5761441c614437565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461449d57600080fd5b50565b6001600160e01b03198116811461449d57600080fdfea26469706673582212209888ce390e888c581d6e9a41368c7e5a90c8e883943c593b92c6bb0579e828cb64736f6c63430008070033
Deployed Bytecode Sourcemap
80483:15681:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89156:876;;;;;;;;;;-1:-1:-1;89156:876:0;;;;;:::i;:::-;;:::i;:::-;;;14588:25:1;;;14576:2;14561:18;89156:876:0;;;;;;;;81421:57;;;;;;;;;;;;;;;;45861:300;;;;;;;;;;-1:-1:-1;45861:300:0;;;;;:::i;:::-;;:::i;:::-;;;14415:14:1;;14408:22;14390:41;;14378:2;14363:18;45861:300:0;14250:187:1;29580:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31162:308::-;;;;;;;;;;-1:-1:-1;31162:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12786:32:1;;;12768:51;;12756:2;12741:18;31162:308:0;12622:203:1;30685:411:0;;;;;;;;;;-1:-1:-1;30685:411:0;;;;;:::i;:::-;;:::i;:::-;;81285:64;;;;;;;;;;;;;;;;84953:126;;;;;;;;;;-1:-1:-1;84953:126:0;;;;;:::i;:::-;;:::i;95960:164::-;;;;;;;;;;-1:-1:-1;95960:164:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;14786:33:1;;;14768:52;;14756:2;14741:18;95960:164:0;14624:202:1;85597:166:0;;;;;;;;;;-1:-1:-1;85597:166:0;;;;;:::i;:::-;;:::i;46664:113::-;;;;;;;;;;-1:-1:-1;46752:10:0;:17;46664:113;;81868:44;;;;;;;;;;-1:-1:-1;81868:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;27266:25:1;;;27322:2;27307:18;;27300:34;;;;27239:18;81868:44:0;27092:248:1;81173:35:0;;;;;;;;;;-1:-1:-1;81173:35:0;;;;-1:-1:-1;;;;;81173:35:0;;;32221:376;;;;;;;;;;-1:-1:-1;32221:376:0;;;;;:::i;:::-;;:::i;85087:358::-;;;;;;;;;;-1:-1:-1;85087:358:0;;;;;:::i;:::-;;:::i;46245:343::-;;;;;;;;;;-1:-1:-1;46245:343:0;;;;;:::i;:::-;;:::i;80849:32::-;;;;;;;;;;;;;;;;81921:27;;;;;;;;;;-1:-1:-1;81921:27:0;;;;;:::i;:::-;;:::i;87470:513::-;;;;;;;;;;-1:-1:-1;87470:513:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;84032:147::-;;;;;;;;;;;;;:::i;32668:185::-;;;;;;;;;;-1:-1:-1;32668:185:0;;;;;:::i;:::-;;:::i;95396:556::-;;;;;;;;;;;;;:::i;85453:89::-;;;;;;;;;;-1:-1:-1;85453:89:0;;;;;:::i;:::-;;:::i;81356:58::-;;;;;;;;;;;;;;;;91138:268;;;;;;;;;;;;;:::i;86275:120::-;;;;;;;;;;-1:-1:-1;86275:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;86371:16:0;;;;;:8;:16;;;;;;;;;86364:23;;;;;;;;;;;;;;;;;;;;86275:120;;;;;26822:13:1;;26804:32;;26892:4;26880:17;;;26874:24;26852:20;;;26845:54;;;;26777:18;86275:120:0;26606:299:1;81096:34:0;;;;;;;;;;-1:-1:-1;81096:34:0;;;;;;;;46854:320;;;;;;;;;;-1:-1:-1;46854:320:0;;;;;:::i;:::-;;:::i;82396:104::-;;;;;;;;;;-1:-1:-1;82396:104:0;;;;;:::i;:::-;;:::i;79266:86::-;;;;;;;;;;-1:-1:-1;79337:7:0;;;;79266:86;;91414:291;;;;;;;;;;;;;:::i;29187:326::-;;;;;;;;;;-1:-1:-1;29187:326:0;;;;;:::i;:::-;;:::i;88673:161::-;;;;;;;;;;-1:-1:-1;88673:161:0;;;;;:::i;:::-;;:::i;90040:248::-;;;;;;;;;;;;;:::i;28830:295::-;;;;;;;;;;-1:-1:-1;28830:295:0;;;;;:::i;:::-;;:::i;44340:148::-;;;;;;;;;;;;;:::i;86934:528::-;;;;;;;;;;-1:-1:-1;86934:528:0;;;;;:::i;:::-;;:::i;88840:151::-;;;;;;;;;;-1:-1:-1;88840:151:0;;;;;:::i;:::-;;:::i;90296:272::-;;;;;;;;;;;;;:::i;92614:1356::-;;;;;;;;;;-1:-1:-1;92614:1356:0;;;;;:::i;:::-;;:::i;80888:30::-;;;;;;;;;;;;;;;;43652:87;;;;;;;;;;-1:-1:-1;43725:6:0;;-1:-1:-1;;;;;43725:6:0;43652:87;;29749:104;;;;;;;;;;;;;:::i;81217:61::-;;;;;;;;;;;;;;;;31542:327;;;;;;;;;;-1:-1:-1;31542:327:0;;;;;:::i;:::-;;:::i;87991:513::-;;;;;;;;;;-1:-1:-1;87991:513:0;;;;;:::i;:::-;;:::i;88512:155::-;;;;;;;;;;-1:-1:-1;88512:155:0;;;;;:::i;:::-;;:::i;91713:297::-;;;;;;;;;;;;;:::i;92313:287::-;;;;;;;;;;;;;:::i;32924:365::-;;;;;;;;;;-1:-1:-1;32924:365:0;;;;;:::i;:::-;;:::i;90576:278::-;;;;;;;;;;;;;:::i;88997:151::-;;;;;;;;;;-1:-1:-1;88997:151:0;;;;;:::i;:::-;;:::i;82290:98::-;;;;;;;;;;-1:-1:-1;82290:98:0;;;;;:::i;:::-;;:::i;82508:576::-;;;;;;;;;;-1:-1:-1;82508:576:0;;;;;:::i;:::-;;:::i;83782:242::-;;;;;;;;;;-1:-1:-1;83782:242:0;;;;;:::i;:::-;;:::i;84187:173::-;;;;;;;;;;;;;:::i;90862:268::-;;;;;;;;;;;;;:::i;92018:287::-;;;;;;;;;;;;;:::i;93978:1410::-;;;;;;;;;;-1:-1:-1;93978:1410:0;;;;;:::i;:::-;;:::i;31940:214::-;;;;;;;;;;-1:-1:-1;31940:214:0;;;;;:::i;:::-;;:::i;83092:682::-;;;;;;:::i;:::-;;:::i;44643:281::-;;;;;;;;;;-1:-1:-1;44643:281:0;;;;;:::i;:::-;;:::i;84368:496::-;;;;;;;;;;-1:-1:-1;84368:496:0;;;;;:::i;:::-;;:::i;86407:519::-;;;;;;;;;;-1:-1:-1;86407:519:0;;;;;:::i;:::-;;:::i;82186:96::-;;;;;;;;;;-1:-1:-1;82186:96:0;;;;;:::i;:::-;;:::i;85867:169::-;;;;;;;;;;-1:-1:-1;85867:169:0;;;;;:::i;:::-;85988:39;;;;;;;12490:19:1;;;;12525:12;;;12518:28;;;;12562:12;;;;12555:28;;;;85988:39:0;;;;;;;;;;12599:12:1;;;;85988:39:0;;;85978:50;;;;;;85867:169;89156:876;-1:-1:-1;;;;;89301:17:0;;89210:7;89301:17;;;:8;:17;;;;;;;;89278:40;;;;;;;;;;;;;;;;;;;;89430:27;;89391:24;;;:15;:24;;;;;89210:7;;89250:15;;89210:7;;89355:115;;89463:6;;89355:103;;:70;;89391:33;;:31;:33::i;:::-;89369:16;;;;89355:31;;:9;;:13;:31::i;:::-;:35;;:70::i;:103::-;:107;;:115::i;:::-;89331:139;;89481:24;89508:121;89622:6;89508:109;89586:30;;89508:73;89544:36;:18;:27;89563:7;-1:-1:-1;;;;;89544:27:0;-1:-1:-1;;;;;89544:27:0;;;;;;;;;;;;:34;:36::i;:::-;89522:16;;;;89508:31;;:9;;:13;:31::i;:121::-;89481:148;;89640:19;89662:111;89766:6;89662:99;89735:25;;89662:68;89698:31;:13;:22;89712:7;-1:-1:-1;;;;;89698:22:0;-1:-1:-1;;;;;89698:22:0;;;;;;;;;;;;:29;:31::i;:::-;89676:16;;;;89662:31;;:9;;:13;:31::i;:111::-;89640:133;;89784:19;89806:111;89910:6;89806:99;89879:25;;89806:68;89842:31;:13;:22;89856:7;-1:-1:-1;;;;;89842:22:0;-1:-1:-1;;;;;89842:22:0;;;;;;;;;;;;:29;:31::i;:::-;89820:16;;;;89806:31;;:9;;:13;:31::i;:111::-;89784:133;;89937:87;90012:11;89937:70;89995:11;89937:53;89973:16;89937:31;89954:13;89937:4;:12;;;:16;;:31;;;;:::i;:::-;:35;;:53::i;:87::-;89930:94;89156:876;-1:-1:-1;;;;;;;;89156:876:0:o;45861:300::-;46008:4;-1:-1:-1;;;;;;46050:50:0;;-1:-1:-1;;;46050:50:0;;:103;;;46117:36;46141:11;46117:23;:36::i;:::-;46030:123;45861:300;-1:-1:-1;;45861:300:0:o;29580:100::-;29634:13;29667:5;29660:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29580:100;:::o;31162:308::-;31283:7;31330:16;31338:7;31330;:16::i;:::-;31308:110;;;;-1:-1:-1;;;31308:110:0;;22158:2:1;31308:110:0;;;22140:21:1;22197:2;22177:18;;;22170:30;22236:34;22216:18;;;22209:62;-1:-1:-1;;;22287:18:1;;;22280:42;22339:19;;31308:110:0;;;;;;;;;-1:-1:-1;31438:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31438:24:0;;31162:308::o;30685:411::-;30766:13;30782:23;30797:7;30782:14;:23::i;:::-;30766:39;;30830:5;-1:-1:-1;;;;;30824:11:0;:2;-1:-1:-1;;;;;30824:11:0;;;30816:57;;;;-1:-1:-1;;;30816:57:0;;23744:2:1;30816:57:0;;;23726:21:1;23783:2;23763:18;;;23756:30;23822:34;23802:18;;;23795:62;-1:-1:-1;;;23873:18:1;;;23866:31;23914:19;;30816:57:0;23542:397:1;30816:57:0;23670:10;-1:-1:-1;;;;;30908:21:0;;;;:62;;-1:-1:-1;30933:37:0;30950:5;23670:10;31940:214;:::i;30933:37::-;30886:168;;;;-1:-1:-1;;;30886:168:0;;20551:2:1;30886:168:0;;;20533:21:1;20590:2;20570:18;;;20563:30;20629:34;20609:18;;;20602:62;20700:26;20680:18;;;20673:54;20744:19;;30886:168:0;20349:420:1;30886:168:0;31067:21;31076:2;31080:7;31067:8;:21::i;:::-;30755:341;30685:411;;:::o;84953:126::-;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;85035:20:::1;:36:::0;;-1:-1:-1;;;;;;85035:36:0::1;-1:-1:-1::0;;;;;85035:36:0;;;::::1;::::0;;;::::1;::::0;;84953:126::o;95960:164::-;-1:-1:-1;;;95960:164:0;;;;;;;:::o;85597:166::-;85683:4;85707:48;85726:6;85734:9;;85745;85707:18;:48::i;:::-;85700:55;85597:166;-1:-1:-1;;;85597:166:0:o;32221:376::-;32430:41;23670:10;32463:7;32430:18;:41::i;:::-;32408:140;;;;-1:-1:-1;;;32408:140:0;;;;;;;:::i;:::-;32561:28;32571:4;32577:2;32581:7;32561:9;:28::i;85087:358::-;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;85238:27:::1;:42:::0;;;;85291:30:::1;:48:::0;;;;85350:25:::1;:38:::0;85399:25:::1;:38:::0;85087:358::o;46245:343::-;46387:7;46442:23;46459:5;46442:16;:23::i;:::-;46434:5;:31;46412:124;;;;-1:-1:-1;;;46412:124:0;;15268:2:1;46412:124:0;;;15250:21:1;15307:2;15287:18;;;15280:30;15346:34;15326:18;;;15319:62;-1:-1:-1;;;15397:18:1;;;15390:41;15448:19;;46412:124:0;15066:407:1;46412:124:0;-1:-1:-1;;;;;;46554:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;46245:343::o;81921:27::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81921:27:0;;-1:-1:-1;81921:27:0;:::o;87470:513::-;-1:-1:-1;;;;;87583:21:0;;87562:18;87583:21;;;:13;:21;;;;;87534:16;;87562:18;87583:30;;:28;:30::i;:::-;87562:51;-1:-1:-1;87628:15:0;87624:352;;87681:1;87667:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87667:16:0;-1:-1:-1;87660:23:0;87470:513;-1:-1:-1;;;87470:513:0:o;87624:352::-;87716:23;87756:10;-1:-1:-1;;;;;87742:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87742:25:0;;87716:51;;87782:13;87810:127;87834:10;87826:5;:18;87810:127;;;-1:-1:-1;;;;;87890:21:0;;;;;;:13;:21;;;;;:31;;87915:5;87890:24;:31::i;:::-;87874:6;87881:5;87874:13;;;;;;;;:::i;:::-;;;;;;;;;;:47;87846:7;;;;:::i;:::-;;;;87810:127;;87624:352;87551:432;87470:513;;;:::o;84032:147::-;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;84132:39:::1;::::0;84100:21:::1;::::0;23670:10;;84132:39;::::1;;;::::0;84100:21;;84132:39:::1;::::0;;;84100:21;23670:10;84132:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;84071:108;84032:147::o:0;32668:185::-;32806:39;32823:4;32829:2;32833:7;32806:39;;;;;;;;;;;;:16;:39::i;95396:556::-;77175:1;77773:7;;:19;;77765:63;;;;-1:-1:-1;;;77765:63:0;;;;;;;:::i;:::-;77175:1;77906:7;:18;95454:14:::1;::::0;::::1;;:22;;:14:::0;:22:::1;95446:59;;;::::0;-1:-1:-1;;;95446:59:0;;16863:2:1;95446:59:0::1;::::0;::::1;16845:21:1::0;16902:2;16882:18;;;16875:30;16941:26;16921:18;;;16914:54;16985:18;;95446:59:0::1;16661:348:1::0;95446:59:0::1;23670:10:::0;95526:21:::1;95550:22:::0;;;:8:::1;:22;::::0;;;;;95598:20:::1;::::0;89156:876;:::i;95598:20::-:1;95583:35:::0;;;95648:15:::1;95629:16;::::0;::::1;:34:::0;95691:20:::1;::::0;95684:53:::1;::::0;-1:-1:-1;;;95684:53:0;;95731:4:::1;95684:53;::::0;::::1;12768:51:1::0;-1:-1:-1;;;;;95691:20:0;;::::1;::::0;95684:38:::1;::::0;12741:18:1;;95684:53:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;;95676:109;;;::::0;-1:-1:-1;;;95676:109:0;;17216:2:1;95676:109:0::1;::::0;::::1;17198:21:1::0;17255:2;17235:18;;;17228:30;17294;17274:18;;;17267:58;17342:18;;95676:109:0::1;17014:352:1::0;95676:109:0::1;95802:12:::0;;:16;95798:118:::1;;95835:69;23670:10:::0;95891:12;;95842:20:::1;::::0;-1:-1:-1;;;;;95842:20:0::1;::::0;95835:69;:41:::1;:69::i;:::-;95943:1;95928:16:::0;;;;77131:1;78085:22;;95396:556::o;85453:89::-;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;85517:9:::1;:17:::0;85453:89::o;91138:268::-;91192:7;;;91245:126;91269:10;:17;91265:21;;91245:126;;;91322:37;:13;:28;91336:10;91347:1;91336:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;91336:13:0;91322:28;;;;;;;;;;;;:35;:37::i;:::-;91308:51;;;;:::i;:::-;;-1:-1:-1;91288:3:0;;;;:::i;:::-;;;;91245:126;;46854:320;46974:7;47029:30;46752:10;:17;;46664:113;47029:30;47021:5;:38;46999:132;;;;-1:-1:-1;;;46999:132:0;;25263:2:1;46999:132:0;;;25245:21:1;25302:2;25282:18;;;25275:30;25341:34;25321:18;;;25314:62;-1:-1:-1;;;25392:18:1;;;25385:42;25444:19;;46999:132:0;25061:408:1;46999:132:0;47149:10;47160:5;47149:17;;;;;;;;:::i;:::-;;;;;;;;;47142:24;;46854:320;;;:::o;82396:104::-;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;82469:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;91414:291::-:0;91472:7;;;91527:141;91551:10;:17;91547:21;;91527:141;;;91636:1;91594:39;:15;:30;91610:10;91621:1;91610:13;;;;;;;;:::i;91594:39::-;:43;91590:66;;;91639:17;91655:1;91639:17;;:::i;:::-;;;91590:66;91570:3;;;;:::i;:::-;;;;91527:141;;29187:326;29304:7;29345:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29345:16:0;29394:19;29372:110;;;;-1:-1:-1;;;29372:110:0;;21387:2:1;29372:110:0;;;21369:21:1;21426:2;21406:18;;;21399:30;21465:34;21445:18;;;21438:62;-1:-1:-1;;;21516:18:1;;;21509:39;21565:19;;29372:110:0;21185:405:1;88673:161:0;-1:-1:-1;;;;;88781:27:0;;88757:4;88781:27;;;:18;:27;;;;;:45;;88818:7;88781:36;:45::i;90040:248::-;90084:7;;;90139:112;90163:10;:17;90159:21;;90139:112;;;90218:21;90225:10;90236:1;90225:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;90225:13:0;90218:6;:21::i;:::-;90202:37;;;;:::i;:::-;;-1:-1:-1;90182:3:0;;;;:::i;:::-;;;;90139:112;;28830:295;28947:7;-1:-1:-1;;;;;28994:19:0;;28972:111;;;;-1:-1:-1;;;28972:111:0;;20976:2:1;28972:111:0;;;20958:21:1;21015:2;20995:18;;;20988:30;21054:34;21034:18;;;21027:62;-1:-1:-1;;;21105:18:1;;;21098:40;21155:19;;28972:111:0;20774:406:1;28972:111:0;-1:-1:-1;;;;;;29101:16:0;;;;;:9;:16;;;;;;;28830:295::o;44340:148::-;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;44431:6:::1;::::0;44410:40:::1;::::0;44447:1:::1;::::0;-1:-1:-1;;;;;44431:6:0::1;::::0;44410:40:::1;::::0;44447:1;;44410:40:::1;44461:6;:19:::0;;-1:-1:-1;;;;;;44461:19:0::1;::::0;;44340:148::o;86934:528::-;-1:-1:-1;;;;;87052:26:0;;87031:18;87052:26;;;:18;:26;;;;;87003:16;;87031:18;87052:35;;:33;:35::i;:::-;87031:56;-1:-1:-1;87102:15:0;87098:357;;87155:1;87141:16;;87098:357;87190:23;87230:10;-1:-1:-1;;;;;87216:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87216:25:0;;87190:51;;87256:13;87284:132;87308:10;87300:5;:18;87284:132;;;-1:-1:-1;;;;;87364:26:0;;;;;;:18;:26;;;;;:36;;87394:5;87364:29;:36::i;:::-;87348:6;87355:5;87348:13;;;;;;;;:::i;:::-;;;;;;;;;;:52;87320:7;;;;:::i;:::-;;;;87284:132;;88840:151;-1:-1:-1;;;;;88943:22:0;;88919:4;88943:22;;;:13;:22;;;;;:40;;88975:7;88943:31;:40::i;90296:272::-;90352:7;;;90405:128;90429:10;:17;90425:21;;90405:128;;;90482:39;:15;:30;90498:10;90509:1;90498:13;;;;;;;;:::i;90482:39::-;90468:53;;;;:::i;:::-;;-1:-1:-1;90448:3:0;;;;:::i;:::-;;;;90405:128;;92614:1356;77175:1;77773:7;;:19;;77765:63;;;;-1:-1:-1;;;77765:63:0;;;;;;;:::i;:::-;77175:1;77906:7;:18;79337:7;;;;79591:9:::1;79583:38;;;::::0;-1:-1:-1;;;79583:38:0;;20206:2:1;79583:38:0::1;::::0;::::1;20188:21:1::0;20245:2;20225:18;;;20218:30;-1:-1:-1;;;20264:18:1;;;20257:46;20320:18;;79583:38:0::1;20004:340:1::0;79583:38:0::1;92811:44:::2;23670:10:::0;92849:4:::2;92811:16;:44::i;:::-;92803:89;;;::::0;-1:-1:-1;;;92803:89:0;;23342:2:1;92803:89:0::2;::::0;::::2;23324:21:1::0;23381:2;23361:18;;;23354:30;23420:34;23400:18;;;23393:62;-1:-1:-1;;;23471:18:1;;;23464:31;23512:19;;92803:89:0::2;23140:397:1::0;92803:89:0::2;92905:27;23670:10:::0;92905:13:::2;:27::i;:::-;23670:10:::0;92945:21:::2;92969:22:::0;;;:8:::2;:22;::::0;;;;;93017:20:::2;::::0;89156:876;:::i;93017:20::-:2;93002:35:::0;;93067:15:::2;93048:16;::::0;::::2;:34:::0;93002:12:::2;93095:868;93115:23:::0;;::::2;93095:868;;;93169:81;93181:53;93188:12;;93201:1;93188:15;;;;;;;:::i;:::-;;;;;;;93205:10;;93216:1;93205:13;;;;;;;:::i;:::-;;;;;;;93220:10;;93231:1;93220:13;;;;;;;:::i;:::-;;;;;;;85988:39:::0;;;;;;;12490:19:1;;;;12525:12;;;12518:28;;;;12562:12;;;;12555:28;;;;85988:39:0;;;;;;;;;;12599:12:1;;;;85988:39:0;;;85978:50;;;;;;85867:169;93181:53:::2;93236:10;;93247:1;93236:13;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;93169:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;93169:11:0::2;::::0;-1:-1:-1;;;93169:81:0:i:2;:::-;93160:107;;;::::0;-1:-1:-1;;;93160:107:0;;24146:2:1;93160:107:0::2;::::0;::::2;24128:21:1::0;24185:2;24165:18;;;24158:30;-1:-1:-1;;;24204:18:1;;;24197:42;24256:18;;93160:107:0::2;23944:336:1::0;93160:107:0::2;93296:62;23670:10:::0;93335:4:::2;93342:12;;93355:1;93342:15;;;;;;;:::i;:::-;;;;;;;93296:16;:62::i;:::-;93391:10;;93402:1;93391:13;;;;;;;:::i;:::-;;;;;;;93408:1;93391:18;93387:565;;;93432:50;93466:12;;93479:1;93466:15;;;;;;;:::i;:::-;;;;;;;93432;:29;93448:12;23670:10:::0;;23590:98;93448:12:::2;-1:-1:-1::0;;;;;93432:29:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;93432:29:0;;:33:::2;:50::i;:::-;;93387:565;;;93522:10;;93533:1;93522:13;;;;;;;:::i;:::-;;;;;;;93539:1;93522:18;93518:434;;;93579:53;93616:12;;93629:1;93616:15;;;;;;;:::i;:::-;;;;;;;93579:18;:32;93598:12;23670:10:::0;;23590:98;93518:434:::2;93672:10;;93683:1;93672:13;;;;;;;:::i;:::-;;;;;;;93689:1;93672:18;93668:284;;;93729:48;93761:12;;93774:1;93761:15;;;;;;;:::i;:::-;;;;;;;93729:13;:27;93743:12;23670:10:::0;;23590:98;93668:284:::2;93817:10;;93828:1;93817:13;;;;;;;:::i;:::-;;;;;;;93834:1;93817:18;93813:139;;;93874:48;93906:12;;93919:1;93906:15;;;;;;;:::i;:::-;;;;;;;93874:13;:27;93888:12;23670:10:::0;;23590:98;93874:48:::2;;93813:139;93140:3:::0;::::2;::::0;::::2;:::i;:::-;;;;93095:868;;;-1:-1:-1::0;;77131:1:0;78085:7;:22;-1:-1:-1;;;;;;;;92614:1356:0:o;29749:104::-;29805:13;29838:7;29831:14;;;;;:::i;31542:327::-;-1:-1:-1;;;;;31677:24:0;;23670:10;31677:24;;31669:62;;;;-1:-1:-1;;;31669:62:0;;17978:2:1;31669:62:0;;;17960:21:1;18017:2;17997:18;;;17990:30;18056:27;18036:18;;;18029:55;18101:18;;31669:62:0;17776:349:1;31669:62:0;23670:10;31744:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31744:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31744:53:0;;;;;;;;;;31813:48;;14390:41:1;;;31744:42:0;;23670:10;31813:48;;14363:18:1;31813:48:0;;;;;;;31542:327;;:::o;87991:513::-;-1:-1:-1;;;;;88104:21:0;;88083:18;88104:21;;;:13;:21;;;;;88055:16;;88083:18;88104:30;;:28;:30::i;:::-;88083:51;-1:-1:-1;88149:15:0;88145:352;;88202:1;88188:16;;88145:352;88237:23;88277:10;-1:-1:-1;;;;;88263:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88263:25:0;;88237:51;;88303:13;88331:127;88355:10;88347:5;:18;88331:127;;;-1:-1:-1;;;;;88411:21:0;;;;;;:13;:21;;;;;:31;;88436:5;88411:24;:31::i;:::-;88395:6;88402:5;88395:13;;;;;;;;:::i;:::-;;;;;;;;;;:47;88367:7;;;;:::i;:::-;;;;88331:127;;88512:155;-1:-1:-1;;;;;88617:24:0;;88593:4;88617:24;;;:15;:24;;;;;:42;;88651:7;88617:33;:42::i;91713:297::-;91774:7;;;91829:144;91853:10;:17;91849:21;;91829:144;;;91941:1;91896:42;:18;:33;91915:10;91926:1;91915:13;;;;;;;;:::i;91896:42::-;:46;91892:69;;;91944:17;91960:1;91944:17;;:::i;:::-;;;91892:69;91872:3;;;;:::i;:::-;;;;91829:144;;92313:287;92369:7;;;92424:139;92448:10;:17;92444:21;;92424:139;;;92531:1;92491:37;:13;:28;92505:10;92516:1;92505:13;;;;;;;;:::i;92491:37::-;:41;92487:64;;;92534:17;92550:1;92534:17;;:::i;:::-;;;92487:64;92467:3;;;;:::i;:::-;;;;92424:139;;32924:365;33113:41;23670:10;33146:7;33113:18;:41::i;:::-;33091:140;;;;-1:-1:-1;;;33091:140:0;;;;;;;:::i;:::-;33242:39;33256:4;33262:2;33266:7;33275:5;33242:13;:39::i;:::-;32924:365;;;;:::o;90576:278::-;90635:7;;;90688:131;90712:10;:17;90708:21;;90688:131;;;90765:42;:18;:33;90784:10;90795:1;90784:13;;;;;;;;:::i;90765:42::-;90751:56;;;;:::i;:::-;;-1:-1:-1;90731:3:0;;;;:::i;:::-;;;;90688:131;;88997:151;-1:-1:-1;;;;;89100:22:0;;89076:4;89100:22;;;:13;:22;;;;;:40;;89132:7;89100:31;:40::i;82290:98::-;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;82359:10:::1;:21:::0;82290:98::o;82508:576::-;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;82617:9:::1;82612:465;82636:14;:21;82632:1;:25;82612:465;;;82684:9;82679:387;82703:14;82699:1;:18;82679:387;;;82743:15;82761:24;:14;53162::::0;;53070:114;82761:24:::1;82743:42;;82837:10;;82810:24;:14;53162::::0;;53070:114;82810:24:::1;:37;82806:245;;;82872:26;:14;:24;:26::i;:::-;82926:16;82934:7;82926;:16::i;:::-;82921:111;;82971:37;82981:14;82996:1;82981:17;;;;;;;;:::i;:::-;;;;;;;83000:7;82971:9;:37::i;:::-;-1:-1:-1::0;82719:3:0;::::1;::::0;::::1;:::i;:::-;;;;82679:387;;;-1:-1:-1::0;82659:3:0;::::1;::::0;::::1;:::i;:::-;;;;82612:465;;83782:242:::0;83855:13;83889:16;83897:7;83889;:16::i;:::-;83881:49;;;;-1:-1:-1;;;83881:49:0;;18332:2:1;83881:49:0;;;18314:21:1;18371:2;18351:18;;;18344:30;-1:-1:-1;;;18390:18:1;;;18383:50;18450:18;;83881:49:0;18130:344:1;83881:49:0;83972:13;83987:18;:7;:16;:18::i;:::-;83955:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83941:75;;83782:242;;;:::o;84187:173::-;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;84242:110:::1;23670:10:::0;84305:20:::1;::::0;84298:53:::1;::::0;-1:-1:-1;;;84298:53:0;;84345:4:::1;84298:53;::::0;::::1;12768:51:1::0;-1:-1:-1;;;;;84305:20:0;;::::1;::::0;84298:38:::1;::::0;12741:18:1;;84298:53:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;84249:20;::::0;-1:-1:-1;;;;;84249:20:0::1;::::0;84242:110;:41:::1;:110::i;:::-;84187:173::o:0;90862:268::-;90916:7;;;90969:126;90993:10;:17;90989:21;;90969:126;;;91046:37;:13;:28;91060:10;91071:1;91060:13;;;;;;;;:::i;91046:37::-;91032:51;;;;:::i;:::-;;-1:-1:-1;91012:3:0;;;;:::i;:::-;;;;90969:126;;92018:287;92074:7;;;92129:139;92153:10;:17;92149:21;;92129:139;;;92236:1;92196:37;:13;:28;92210:10;92221:1;92210:13;;;;;;;;:::i;92196:37::-;:41;92192:64;;;92239:17;92255:1;92239:17;;:::i;:::-;;;92192:64;92172:3;;;;:::i;:::-;;;;92129:139;;93978:1410;77175:1;77773:7;;:19;;77765:63;;;;-1:-1:-1;;;77765:63:0;;;;;;;:::i;:::-;77175:1;77906:7;:18;;;23670:10;94082:22;;;:8:::1;:22;::::0;;;;;;94130:20:::1;::::0;89156:876;:::i;94130:20::-:1;94115:35:::0;;94180:15:::1;94161:16;::::0;::::1;:34:::0;94115:12:::1;94208:1173;94232:11;:18;94228:1;:22;94208:1173;;;94300:45;23670:10:::0;94316:12:::1;94330:11;94342:1;94330:14;;;;;;;;:::i;:::-;;;;;;;94300:15;:45::i;:::-;:115;;;-1:-1:-1::0;94367:48:0::1;23670:10:::0;94386:12:::1;94400:11;94412:1;94400:14;;;;;;;;:::i;:::-;;;;;;;94367:18;:48::i;:::-;94300:180;;;-1:-1:-1::0;94437:43:0::1;23670:10:::0;94451:12:::1;94465:11;94477:1;94465:14;;;;;;;;:::i;:::-;;;;;;;94437:13;:43::i;:::-;94300:245;;;-1:-1:-1::0;94502:43:0::1;23670:10:::0;94516:12:::1;94530:11;94542:1;94530:14;;;;;;;;:::i;:::-;;;;;;;94502:13;:43::i;:::-;94274:295;;;::::0;-1:-1:-1;;;94274:295:0;;19858:2:1;94274:295:0::1;::::0;::::1;19840:21:1::0;19897:2;19877:18;;;19870:30;-1:-1:-1;;;19916:18:1;;;19909:49;19975:18;;94274:295:0::1;19656:343:1::0;94274:295:0::1;94594:63;94616:4;23670:10:::0;94638:11:::1;94650:1;94638:14;;;;;;;;:::i;:::-;;;;;;;94594:63;;;;;;;;;;;::::0;:13:::1;:63::i;:::-;94678:45;23670:10:::0;94694:12:::1;23590:98:::0;94678:45:::1;94674:696;;;94762:52;94799:11;94811:1;94799:14;;;;;;;;:::i;:::-;;;;;;;94762:15;:29;94778:12;23670:10:::0;;23590:98;94778:12:::1;-1:-1:-1::0;;;;;94762:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;94762:29:0;;:36:::1;:52::i;:::-;;94674:696;;;94854:48;23670:10:::0;94873:12:::1;23590:98:::0;94854:48:::1;94850:520;;;94941:55;94981:11;94993:1;94981:14;;;;;;;;:::i;:::-;;;;;;;94941:18;:32;94960:12;23670:10:::0;;23590:98;94850:520:::1;95036:43;23670:10:::0;95050:12:::1;23590:98:::0;95036:43:::1;95032:338;;;95118:50;95153:11;95165:1;95153:14;;;;;;;;:::i;:::-;;;;;;;95118:13;:27;95132:12;23670:10:::0;;23590:98;95032:338:::1;95208:43;23670:10:::0;95222:12:::1;23590:98:::0;95208:43:::1;95204:166;;;95290:50;95325:11;95337:1;95325:14;;;;;;;;:::i;:::-;;;;;;;95290:13;:27;95304:12;23670:10:::0;;23590:98;95290:50:::1;;95204:166;94252:3:::0;::::1;::::0;::::1;:::i;:::-;;;;94208:1173;;;-1:-1:-1::0;;77131:1:0;78085:7;:22;-1:-1:-1;93978:1410:0:o;31940:214::-;-1:-1:-1;;;;;32111:25:0;;;32082:4;32111:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31940:214::o;83092:682::-;83215:10;;83197:14;83170:24;:14;53162;;53070:114;83170:24;:41;;;;:::i;:::-;:55;;83162:99;;;;-1:-1:-1;;;83162:99:0;;25676:2:1;83162:99:0;;;25658:21:1;;;25695:18;;;25688:30;25754:34;25734:18;;;25727:62;25806:18;;83162:99:0;25474:356:1;83162:99:0;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;83278:23;83274:131;;83352:9;83334:14;83326:5;;:22;;;;:::i;:::-;:35;;83318:75;;;;-1:-1:-1;;;83318:75:0;;19088:2:1;83318:75:0;;;19070:21:1;19127:2;19107:18;;;19100:30;19166;19146:18;;;19139:58;19214:18;;83318:75:0;18886:352:1;83318:75:0;83422:9;83417:350;83441:14;83437:1;:18;83417:350;;;83477:15;83495:24;:14;53162;;53070:114;83495:24;83477:42;;83567:10;;83540:24;:14;53162;;53070:114;83540:24;:37;83536:220;;;83598:26;:14;:24;:26::i;:::-;83648:16;83656:7;83648;:16::i;:::-;83643:98;;83689:32;23670:10;83713:7;83689:9;:32::i;:::-;-1:-1:-1;83457:3:0;;;;:::i;:::-;;;;83417:350;;44643:281;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44746:22:0;::::1;44724:110;;;::::0;-1:-1:-1;;;44724:110:0;;16099:2:1;44724:110:0::1;::::0;::::1;16081:21:1::0;16138:2;16118:18;;;16111:30;16177:34;16157:18;;;16150:62;-1:-1:-1;;;16228:18:1;;;16221:36;16274:19;;44724:110:0::1;15897:402:1::0;44724:110:0::1;44871:6;::::0;44850:38:::1;::::0;-1:-1:-1;;;;;44850:38:0;;::::1;::::0;44871:6:::1;::::0;44850:38:::1;::::0;44871:6:::1;::::0;44850:38:::1;44899:6;:17:::0;;-1:-1:-1;;;;;;44899:17:0::1;-1:-1:-1::0;;;;;44899:17:0;;;::::1;::::0;;;::::1;::::0;;44643:281::o;84368:496::-;84425:16;84453:18;84474:17;84484:6;84474:9;:17::i;:::-;84453:38;-1:-1:-1;84506:15:0;84502:355;;84559:1;84545:16;;84502:355;84594:23;84634:10;-1:-1:-1;;;;;84620:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84620:25:0;;84594:51;;84660:13;84688:130;84712:10;84704:5;:18;84688:130;;;84768:34;84788:6;84796:5;84768:19;:34::i;:::-;84752:6;84759:5;84752:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;84724:7;;;;:::i;:::-;;;;84688:130;;86407:519;-1:-1:-1;;;;;86522:23:0;;86501:18;86522:23;;;:15;:23;;;;;86473:16;;86501:18;86522:32;;:30;:32::i;:::-;86501:53;-1:-1:-1;86569:15:0;86565:354;;86622:1;86608:16;;86565:354;86657:23;86697:10;-1:-1:-1;;;;;86683:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;86683:25:0;;86657:51;;86723:13;86751:129;86775:10;86767:5;:18;86751:129;;;-1:-1:-1;;;;;86831:23:0;;;;;;:15;:23;;;;;:33;;86858:5;86831:26;:33::i;:::-;86815:6;86822:5;86815:13;;;;;;;;:::i;:::-;;;;;;;;;;:49;86787:7;;;;:::i;:::-;;;;86751:129;;82186:96;43725:6;;-1:-1:-1;;;;;43725:6:0;23670:10;43886:23;43864:105;;;;-1:-1:-1;;;43864:105:0;;;;;;;:::i;:::-;82257:5:::1;:17:::0;82186:96::o;53192:117::-;53289:1;53271:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;53192:117:0:o;73924:114::-;73984:7;74011:19;74019:3;66953:18;;66870:109;58974:98;59032:7;59059:5;59063:1;59059;:5;:::i;59331:98::-;59389:7;59416:5;59420:1;59416;:5;:::i;59730:98::-;59788:7;59815:5;59819:1;59815;:5;:::i;58593:98::-;58651:7;58678:5;58682:1;58678;:5;:::i;28411:355::-;28558:4;-1:-1:-1;;;;;;28600:40:0;;-1:-1:-1;;;28600:40:0;;:105;;-1:-1:-1;;;;;;;28657:48:0;;-1:-1:-1;;;28657:48:0;28600:105;:158;;;-1:-1:-1;;;;;;;;;;27021:40:0;;;28722:36;26862:207;34836:127;34901:4;34925:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34925:16:0;:30;;;34836:127::o;38959:174::-;39034:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;39034:29:0;-1:-1:-1;;;;;39034:29:0;;;;;;;;:24;;39088:23;39034:24;39088:14;:23::i;:::-;-1:-1:-1;;;;;39079:46:0;;;;;;;;;;;38959:174;;:::o;54457:190::-;54582:4;54635;54606:25;54619:5;54626:4;54606:12;:25::i;:::-;:33;;54457:190;-1:-1:-1;;;;54457:190:0:o;35130:452::-;35259:4;35303:16;35311:7;35303;:16::i;:::-;35281:110;;;;-1:-1:-1;;;35281:110:0;;19445:2:1;35281:110:0;;;19427:21:1;19484:2;19464:18;;;19457:30;19523:34;19503:18;;;19496:62;-1:-1:-1;;;19574:18:1;;;19567:42;19626:19;;35281:110:0;19243:408:1;35281:110:0;35402:13;35418:23;35433:7;35418:14;:23::i;:::-;35402:39;;35471:5;-1:-1:-1;;;;;35460:16:0;:7;-1:-1:-1;;;;;35460:16:0;;:64;;;;35517:7;-1:-1:-1;;;;;35493:31:0;:20;35505:7;35493:11;:20::i;:::-;-1:-1:-1;;;;;35493:31:0;;35460:64;:113;;;;35541:32;35558:5;35565:7;35541:16;:32::i;38226:615::-;38399:4;-1:-1:-1;;;;;38372:31:0;:23;38387:7;38372:14;:23::i;:::-;-1:-1:-1;;;;;38372:31:0;;38350:122;;;;-1:-1:-1;;;38350:122:0;;22932:2:1;38350:122:0;;;22914:21:1;22971:2;22951:18;;;22944:30;23010:34;22990:18;;;22983:62;-1:-1:-1;;;23061:18:1;;;23054:39;23110:19;;38350:122:0;22730:405:1;38350:122:0;-1:-1:-1;;;;;38491:16:0;;38483:65;;;;-1:-1:-1;;;38483:65:0;;17573:2:1;38483:65:0;;;17555:21:1;17612:2;17592:18;;;17585:30;17651:34;17631:18;;;17624:62;-1:-1:-1;;;17702:18:1;;;17695:34;17746:19;;38483:65:0;17371:400:1;38483:65:0;38561:39;38582:4;38588:2;38592:7;38561:20;:39::i;:::-;38665:29;38682:1;38686:7;38665:8;:29::i;:::-;-1:-1:-1;;;;;38707:15:0;;;;;;:9;:15;;;;;:20;;38726:1;;38707:15;:20;;38726:1;;38707:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38738:13:0;;;;;;:9;:13;;;;;:18;;38755:1;;38738:13;:18;;38755:1;;38738:18;:::i;:::-;;;;-1:-1:-1;;38767:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38767:21:0;-1:-1:-1;;;;;38767:21:0;;;;;;;;;38806:27;;38767:16;;38806:27;;;;;;;38226:615;;;:::o;74392:137::-;74463:7;74498:22;74502:3;74514:5;74498:3;:22::i;3434:211::-;3578:58;;;-1:-1:-1;;;;;13526:32:1;;3578:58:0;;;13508:51:1;13575:18;;;;13568:34;;;3578:58:0;;;;;;;;;;13481:18:1;;;;3578:58:0;;;;;;;;-1:-1:-1;;;;;3578:58:0;-1:-1:-1;;;3578:58:0;;;3551:86;;3571:5;;3551:19;:86::i;73692:146::-;73769:4;66752:19;;;:12;;;:19;;;;;;:24;;73793:37;66655:129;86044:223;86106:9;86101:126;86125:10;:17;86121:21;;86101:126;;;86185:5;-1:-1:-1;;;;;86168:22:0;:10;86179:1;86168:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;86168:13:0;:22;86164:52;;;86209:7;86044:223;:::o;86164:52::-;86144:3;;;;:::i;:::-;;;;86101:126;;;-1:-1:-1;86237:10:0;:22;;;;;;;-1:-1:-1;86237:22:0;;;;;;;;-1:-1:-1;;;;;;86237:22:0;-1:-1:-1;;;;;86237:22:0;;;;;;;;;;86044:223::o;73162:131::-;73229:4;73253:32;73258:3;73278:5;73253:4;:32::i;34171:352::-;34328:28;34338:4;34344:2;34348:7;34328:9;:28::i;:::-;34389:48;34412:4;34418:2;34422:7;34431:5;34389:22;:48::i;:::-;34367:148;;;;-1:-1:-1;;;34367:148:0;;;;;;;:::i;35924:110::-;36000:26;36010:2;36014:7;36000:26;;;;;;;;;;;;:9;:26::i;24262:723::-;24318:13;24539:10;24535:53;;-1:-1:-1;;24566:10:0;;;;;;;;;;;;-1:-1:-1;;;24566:10:0;;;;;24262:723::o;24535:53::-;24613:5;24598:12;24654:78;24661:9;;24654:78;;24687:8;;;;:::i;:::-;;-1:-1:-1;24710:10:0;;-1:-1:-1;24718:2:0;24710:10;;:::i;:::-;;;24654:78;;;24742:19;24774:6;-1:-1:-1;;;;;24764:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24764:17:0;;24742:39;;24792:154;24799:10;;24792:154;;24826:11;24836:1;24826:11;;:::i;:::-;;-1:-1:-1;24895:10:0;24903:2;24895:5;:10;:::i;:::-;24882:24;;:2;:24;:::i;:::-;24869:39;;24852:6;24859;24852:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;24852:56:0;;;;;;;;-1:-1:-1;24923:11:0;24932:2;24923:11;;:::i;:::-;;;24792:154;;73469:137;73539:4;73563:35;73571:3;73591:5;73563:7;:35::i;55009:701::-;55092:7;55135:4;55092:7;55150:523;55174:5;:12;55170:1;:16;55150:523;;;55208:20;55231:5;55237:1;55231:8;;;;;;;;:::i;:::-;;;;;;;55208:31;;55274:12;55258;:28;55254:408;;55411:44;;;;;;10626:19:1;;;10661:12;;;10654:28;;;10698:12;;55411:44:0;;;;;;;;;;;;55401:55;;;;;;55386:70;;55254:408;;;55601:44;;;;;;10626:19:1;;;10661:12;;;10654:28;;;10698:12;;55601:44:0;;;;;;;;;;;;55591:55;;;;;;55576:70;;55254:408;-1:-1:-1;55188:3:0;;;;:::i;:::-;;;;55150:523;;47787:589;-1:-1:-1;;;;;47993:18:0;;47989:187;;48028:40;48060:7;49203:10;:17;;49176:24;;;;:15;:24;;;;;:44;;;49231:24;;;;;;;;;;;;49099:164;48028:40;47989:187;;;48098:2;-1:-1:-1;;;;;48090:10:0;:4;-1:-1:-1;;;;;48090:10:0;;48086:90;;48117:47;48150:4;48156:7;48117:32;:47::i;:::-;-1:-1:-1;;;;;48190:16:0;;48186:183;;48223:45;48260:7;48223:36;:45::i;48186:183::-;48296:4;-1:-1:-1;;;;;48290:10:0;:2;-1:-1:-1;;;;;48290:10:0;;48286:83;;48317:40;48345:2;48349:7;48317:27;:40::i;67333:120::-;67400:7;67427:3;:11;;67439:5;67427:18;;;;;;;;:::i;:::-;;;;;;;;;67420:25;;67333:120;;;;:::o;6007:716::-;6431:23;6457:69;6485:4;6457:69;;;;;;;;;;;;;;;;;6465:5;-1:-1:-1;;;;;6457:27:0;;;:69;;;;;:::i;:::-;6541:17;;6431:95;;-1:-1:-1;6541:21:0;6537:179;;6638:10;6627:30;;;;;;;;;;;;:::i;:::-;6619:85;;;;-1:-1:-1;;;6619:85:0;;26037:2:1;6619:85:0;;;26019:21:1;26076:2;26056:18;;;26049:30;26115:34;26095:18;;;26088:62;-1:-1:-1;;;26166:18:1;;;26159:40;26216:19;;6619:85:0;25835:406:1;64559:414:0;64622:4;66752:19;;;:12;;;:19;;;;;;64639:327;;-1:-1:-1;64682:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;64865:18;;64843:19;;;:12;;;:19;;;;;;:40;;;;64898:11;;64639:327;-1:-1:-1;64949:5:0;64942:12;;39698:1053;39853:4;-1:-1:-1;;;;;39874:13:0;;15369:20;15417:8;39870:874;;39927:175;;-1:-1:-1;;;39927:175:0;;-1:-1:-1;;;;;39927:36:0;;;;;:175;;23670:10;;40021:4;;40048:7;;40078:5;;39927:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39927:175:0;;;;;;;;-1:-1:-1;;39927:175:0;;;;;;;;;;;;:::i;:::-;;;39906:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40289:13:0;;40285:389;;40332:108;;-1:-1:-1;;;40332:108:0;;;;;;;:::i;40285:389::-;40624:6;40618:13;40609:6;40605:2;40601:15;40594:38;39906:783;-1:-1:-1;;;;;;40166:55:0;-1:-1:-1;;;40166:55:0;;-1:-1:-1;40159:62:0;;39870:874;-1:-1:-1;40728:4:0;40721:11;;36261:321;36391:18;36397:2;36401:7;36391:5;:18::i;:::-;36442:54;36473:1;36477:2;36481:7;36490:5;36442:22;:54::i;:::-;36420:154;;;;-1:-1:-1;;;36420:154:0;;;;;;;:::i;65149:1420::-;65215:4;65354:19;;;:12;;;:19;;;;;;65390:15;;65386:1176;;65765:21;65789:14;65802:1;65789:10;:14;:::i;:::-;65838:18;;65765:38;;-1:-1:-1;65818:17:0;;65838:22;;65859:1;;65838:22;:::i;:::-;65818:42;;65894:13;65881:9;:26;65877:405;;65928:17;65948:3;:11;;65960:9;65948:22;;;;;;;;:::i;:::-;;;;;;;;;65928:42;;66102:9;66073:3;:11;;66085:13;66073:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;66187:23;;;:12;;;:23;;;;;:36;;;65877:405;66363:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;66458:3;:12;;:19;66471:5;66458:19;;;;;;;;;;;66451:26;;;66501:4;66494:11;;;;;;;65386:1176;66545:5;66538:12;;;;;49890:1002;50170:22;50220:1;50195:22;50212:4;50195:16;:22::i;:::-;:26;;;;:::i;:::-;50232:18;50253:26;;;:17;:26;;;;;;50170:51;;-1:-1:-1;50386:28:0;;;50382:328;;-1:-1:-1;;;;;50453:18:0;;50431:19;50453:18;;;:12;:18;;;;;;;;:34;;;;;;;;;50504:30;;;;;;:44;;;50621:30;;:17;:30;;;;;:43;;;50382:328;-1:-1:-1;50806:26:0;;;;:17;:26;;;;;;;;50799:33;;;-1:-1:-1;;;;;50850:18:0;;;;;:12;:18;;;;;:34;;;;;;;50843:41;49890:1002::o;51187:1079::-;51465:10;:17;51440:22;;51465:21;;51485:1;;51465:21;:::i;:::-;51497:18;51518:24;;;:15;:24;;;;;;51891:10;:26;;51440:46;;-1:-1:-1;51518:24:0;;51440:46;;51891:26;;;;;;:::i;:::-;;;;;;;;;51869:48;;51955:11;51930:10;51941;51930:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;52035:28;;;:15;:28;;;;;;;:41;;;52207:24;;;;;52200:31;52242:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;51258:1008;;;51187:1079;:::o;48677:221::-;48762:14;48779:20;48796:2;48779:16;:20::i;:::-;-1:-1:-1;;;;;48810:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;48855:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;48677:221:0:o;18026:229::-;18163:12;18195:52;18217:6;18225:4;18231:1;18234:12;18195:21;:52::i;36918:382::-;-1:-1:-1;;;;;36998:16:0;;36990:61;;;;-1:-1:-1;;;36990:61:0;;21797:2:1;36990:61:0;;;21779:21:1;;;21816:18;;;21809:30;21875:34;21855:18;;;21848:62;21927:18;;36990:61:0;21595:356:1;36990:61:0;37071:16;37079:7;37071;:16::i;:::-;37070:17;37062:58;;;;-1:-1:-1;;;37062:58:0;;16506:2:1;37062:58:0;;;16488:21:1;16545:2;16525:18;;;16518:30;16584;16564:18;;;16557:58;16632:18;;37062:58:0;16304:352:1;37062:58:0;37133:45;37162:1;37166:2;37170:7;37133:20;:45::i;:::-;-1:-1:-1;;;;;37191:13:0;;;;;;:9;:13;;;;;:18;;37208:1;;37191:13;:18;;37208:1;;37191:18;:::i;:::-;;;;-1:-1:-1;;37220:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37220:21:0;-1:-1:-1;;;;;37220:21:0;;;;;;;;37259:33;;37220:16;;;37259:33;;37220:16;;37259:33;36918:382;;:::o;19242:632::-;19412:12;19484:5;19459:21;:30;;19437:118;;;;-1:-1:-1;;;19437:118:0;;18681:2:1;19437:118:0;;;18663:21:1;18720:2;18700:18;;;18693:30;18759:34;18739:18;;;18732:62;-1:-1:-1;;;18810:18:1;;;18803:36;18856:19;;19437:118:0;18479:402:1;19437:118:0;15369:20;;19566:60;;;;-1:-1:-1;;;19566:60:0;;24905:2:1;19566:60:0;;;24887:21:1;24944:2;24924:18;;;24917:30;24983:31;24963:18;;;24956:59;25032:18;;19566:60:0;24703:353:1;19566:60:0;19700:12;19714:23;19741:6;-1:-1:-1;;;;;19741:11:0;19760:5;19781:4;19741:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19699:97;;;;19814:52;19832:7;19841:10;19853:12;19814:17;:52::i;:::-;19807:59;19242:632;-1:-1:-1;;;;;;;19242:632:0:o;22165:777::-;22315:12;22344:7;22340:595;;;-1:-1:-1;22375:10:0;22368:17;;22340:595;22489:17;;:21;22485:439;;22752:10;22746:17;22813:15;22800:10;22796:2;22792:19;22785:44;22485:439;22895:12;22888:20;;-1:-1:-1;;;22888:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:386::-;685:8;695:6;749:3;742:4;734:6;730:17;726:27;716:55;;767:1;764;757:12;716:55;-1:-1:-1;790:20:1;;-1:-1:-1;;;;;822:30:1;;819:50;;;865:1;862;855:12;819:50;902:4;894:6;890:17;878:29;;962:3;955:4;945:6;942:1;938:14;930:6;926:27;922:38;919:47;916:67;;;979:1;976;969:12;916:67;603:386;;;;;:::o;994:186::-;1053:6;1106:2;1094:9;1085:7;1081:23;1077:32;1074:52;;;1122:1;1119;1112:12;1074:52;1145:29;1164:9;1145:29;:::i;1185:260::-;1253:6;1261;1314:2;1302:9;1293:7;1289:23;1285:32;1282:52;;;1330:1;1327;1320:12;1282:52;1353:29;1372:9;1353:29;:::i;:::-;1343:39;;1401:38;1435:2;1424:9;1420:18;1401:38;:::i;:::-;1391:48;;1185:260;;;;;:::o;1450:328::-;1527:6;1535;1543;1596:2;1584:9;1575:7;1571:23;1567:32;1564:52;;;1612:1;1609;1602:12;1564:52;1635:29;1654:9;1635:29;:::i;:::-;1625:39;;1683:38;1717:2;1706:9;1702:18;1683:38;:::i;:::-;1673:48;;1768:2;1757:9;1753:18;1740:32;1730:42;;1450:328;;;;;:::o;1783:666::-;1878:6;1886;1894;1902;1955:3;1943:9;1934:7;1930:23;1926:33;1923:53;;;1972:1;1969;1962:12;1923:53;1995:29;2014:9;1995:29;:::i;:::-;1985:39;;2043:38;2077:2;2066:9;2062:18;2043:38;:::i;:::-;2033:48;;2128:2;2117:9;2113:18;2100:32;2090:42;;2183:2;2172:9;2168:18;2155:32;-1:-1:-1;;;;;2202:6:1;2199:30;2196:50;;;2242:1;2239;2232:12;2196:50;2265:22;;2318:4;2310:13;;2306:27;-1:-1:-1;2296:55:1;;2347:1;2344;2337:12;2296:55;2370:73;2435:7;2430:2;2417:16;2412:2;2408;2404:11;2370:73;:::i;:::-;2360:83;;;1783:666;;;;;;;:::o;2454:315::-;2519:6;2527;2580:2;2568:9;2559:7;2555:23;2551:32;2548:52;;;2596:1;2593;2586:12;2548:52;2619:29;2638:9;2619:29;:::i;:::-;2609:39;;2698:2;2687:9;2683:18;2670:32;2711:28;2733:5;2711:28;:::i;:::-;2758:5;2748:15;;;2454:315;;;;;:::o;2774:254::-;2842:6;2850;2903:2;2891:9;2882:7;2878:23;2874:32;2871:52;;;2919:1;2916;2909:12;2871:52;2942:29;2961:9;2942:29;:::i;:::-;2932:39;3018:2;3003:18;;;;2990:32;;-1:-1:-1;;;2774:254:1:o;3033:978::-;3126:6;3134;3187:2;3175:9;3166:7;3162:23;3158:32;3155:52;;;3203:1;3200;3193:12;3155:52;3243:9;3230:23;-1:-1:-1;;;;;3268:6:1;3265:30;3262:50;;;3308:1;3305;3298:12;3262:50;3331:22;;3384:4;3376:13;;3372:27;-1:-1:-1;3362:55:1;;3413:1;3410;3403:12;3362:55;3449:2;3436:16;3471:4;3495:60;3511:43;3551:2;3511:43;:::i;:::-;3495:60;:::i;:::-;3577:3;3601:2;3596:3;3589:15;3629:2;3624:3;3620:12;3613:19;;3660:2;3656;3652:11;3708:7;3703:2;3697;3694:1;3690:10;3686:2;3682:19;3678:28;3675:41;3672:61;;;3729:1;3726;3719:12;3672:61;3751:1;3742:10;;3761:169;3775:2;3772:1;3769:9;3761:169;;;3832:23;3851:3;3832:23;:::i;:::-;3820:36;;3793:1;3786:9;;;;;3876:12;;;;3908;;3761:169;;;-1:-1:-1;3949:5:1;3986:18;;;;3973:32;;-1:-1:-1;;;;;;3033:978:1:o;4016:1507::-;4237:6;4245;4253;4261;4269;4277;4285;4293;4346:3;4334:9;4325:7;4321:23;4317:33;4314:53;;;4363:1;4360;4353:12;4314:53;4403:9;4390:23;-1:-1:-1;;;;;4473:2:1;4465:6;4462:14;4459:34;;;4489:1;4486;4479:12;4459:34;4528:89;4609:7;4600:6;4589:9;4585:22;4528:89;:::i;:::-;4636:8;;-1:-1:-1;4502:115:1;-1:-1:-1;4724:2:1;4709:18;;4696:32;;-1:-1:-1;4740:16:1;;;4737:36;;;4769:1;4766;4759:12;4737:36;4808:91;4891:7;4880:8;4869:9;4865:24;4808:91;:::i;:::-;4918:8;;-1:-1:-1;4782:117:1;-1:-1:-1;5006:2:1;4991:18;;4978:32;;-1:-1:-1;5022:16:1;;;5019:36;;;5051:1;5048;5041:12;5019:36;5090:91;5173:7;5162:8;5151:9;5147:24;5090:91;:::i;:::-;5200:8;;-1:-1:-1;5064:117:1;-1:-1:-1;5288:2:1;5273:18;;5260:32;;-1:-1:-1;5304:16:1;;;5301:36;;;5333:1;5330;5323:12;5301:36;;5372:91;5455:7;5444:8;5433:9;5429:24;5372:91;:::i;:::-;4016:1507;;;;-1:-1:-1;4016:1507:1;;-1:-1:-1;4016:1507:1;;;;;;5482:8;-1:-1:-1;;;4016:1507:1:o;5528:902::-;5612:6;5643:2;5686;5674:9;5665:7;5661:23;5657:32;5654:52;;;5702:1;5699;5692:12;5654:52;5742:9;5729:23;-1:-1:-1;;;;;5767:6:1;5764:30;5761:50;;;5807:1;5804;5797:12;5761:50;5830:22;;5883:4;5875:13;;5871:27;-1:-1:-1;5861:55:1;;5912:1;5909;5902:12;5861:55;5948:2;5935:16;5971:60;5987:43;6027:2;5987:43;:::i;5971:60::-;6053:3;6077:2;6072:3;6065:15;6105:2;6100:3;6096:12;6089:19;;6136:2;6132;6128:11;6184:7;6179:2;6173;6170:1;6166:10;6162:2;6158:19;6154:28;6151:41;6148:61;;;6205:1;6202;6195:12;6148:61;6227:1;6218:10;;6237:163;6251:2;6248:1;6245:9;6237:163;;;6308:17;;6296:30;;6269:1;6262:9;;;;;6346:12;;;;6378;;6237:163;;;-1:-1:-1;6419:5:1;5528:902;-1:-1:-1;;;;;;;5528:902:1:o;6435:245::-;6502:6;6555:2;6543:9;6534:7;6530:23;6526:32;6523:52;;;6571:1;6568;6561:12;6523:52;6603:9;6597:16;6622:28;6644:5;6622:28;:::i;6685:180::-;6744:6;6797:2;6785:9;6776:7;6772:23;6768:32;6765:52;;;6813:1;6810;6803:12;6765:52;-1:-1:-1;6836:23:1;;6685:180;-1:-1:-1;6685:180:1:o;6870:970::-;6963:6;6971;7024:2;7012:9;7003:7;6999:23;6995:32;6992:52;;;7040:1;7037;7030:12;6992:52;7076:9;7063:23;7053:33;;7105:2;7158;7147:9;7143:18;7130:32;-1:-1:-1;;;;;7177:6:1;7174:30;7171:50;;;7217:1;7214;7207:12;7171:50;7240:22;;7293:4;7285:13;;7281:27;-1:-1:-1;7271:55:1;;7322:1;7319;7312:12;7271:55;7358:2;7345:16;7381:60;7397:43;7437:2;7397:43;:::i;7381:60::-;7463:3;7487:2;7482:3;7475:15;7515:2;7510:3;7506:12;7499:19;;7546:2;7542;7538:11;7594:7;7589:2;7583;7580:1;7576:10;7572:2;7568:19;7564:28;7561:41;7558:61;;;7615:1;7612;7605:12;7558:61;7637:1;7628:10;;7647:163;7661:2;7658:1;7655:9;7647:163;;;7718:17;;7706:30;;7679:1;7672:9;;;;;7756:12;;;;7788;;7647:163;;;7651:3;7829:5;7819:15;;;;;;;6870:970;;;;;:::o;7845:245::-;7903:6;7956:2;7944:9;7935:7;7931:23;7927:32;7924:52;;;7972:1;7969;7962:12;7924:52;8011:9;7998:23;8030:30;8054:5;8030:30;:::i;8095:249::-;8164:6;8217:2;8205:9;8196:7;8192:23;8188:32;8185:52;;;8233:1;8230;8223:12;8185:52;8265:9;8259:16;8284:30;8308:5;8284:30;:::i;8349:450::-;8418:6;8471:2;8459:9;8450:7;8446:23;8442:32;8439:52;;;8487:1;8484;8477:12;8439:52;8527:9;8514:23;-1:-1:-1;;;;;8552:6:1;8549:30;8546:50;;;8592:1;8589;8582:12;8546:50;8615:22;;8668:4;8660:13;;8656:27;-1:-1:-1;8646:55:1;;8697:1;8694;8687:12;8646:55;8720:73;8785:7;8780:2;8767:16;8762:2;8758;8754:11;8720:73;:::i;8989:184::-;9059:6;9112:2;9100:9;9091:7;9087:23;9083:32;9080:52;;;9128:1;9125;9118:12;9080:52;-1:-1:-1;9151:16:1;;8989:184;-1:-1:-1;8989:184:1:o;9178:316::-;9255:6;9263;9271;9324:2;9312:9;9303:7;9299:23;9295:32;9292:52;;;9340:1;9337;9330:12;9292:52;-1:-1:-1;;9363:23:1;;;9433:2;9418:18;;9405:32;;-1:-1:-1;9484:2:1;9469:18;;;9456:32;;9178:316;-1:-1:-1;9178:316:1:o;9499:385::-;9585:6;9593;9601;9609;9662:3;9650:9;9641:7;9637:23;9633:33;9630:53;;;9679:1;9676;9669:12;9630:53;-1:-1:-1;;9702:23:1;;;9772:2;9757:18;;9744:32;;-1:-1:-1;9823:2:1;9808:18;;9795:32;;9874:2;9859:18;9846:32;;-1:-1:-1;9499:385:1;-1:-1:-1;9499:385:1:o;9889:268::-;9941:3;9979:5;9973:12;10006:6;10001:3;9994:19;10022:63;10078:6;10071:4;10066:3;10062:14;10055:4;10048:5;10044:16;10022:63;:::i;:::-;10139:2;10118:15;-1:-1:-1;;10114:29:1;10105:39;;;;10146:4;10101:50;;9889:268;-1:-1:-1;;9889:268:1:o;10162:184::-;10203:3;10241:5;10235:12;10256:52;10301:6;10296:3;10289:4;10282:5;10278:16;10256:52;:::i;:::-;10324:16;;;;;10162:184;-1:-1:-1;;10162:184:1:o;10721:274::-;10850:3;10888:6;10882:13;10904:53;10950:6;10945:3;10938:4;10930:6;10926:17;10904:53;:::i;:::-;10973:16;;;;;10721:274;-1:-1:-1;;10721:274:1:o;11000:1300::-;11277:3;11306:1;11339:6;11333:13;11369:3;11391:1;11419:9;11415:2;11411:18;11401:28;;11479:2;11468:9;11464:18;11501;11491:61;;11545:4;11537:6;11533:17;11523:27;;11491:61;11571:2;11619;11611:6;11608:14;11588:18;11585:38;11582:165;;;-1:-1:-1;;;11646:33:1;;11702:4;11699:1;11692:15;11732:4;11653:3;11720:17;11582:165;11763:18;11790:104;;;;11908:1;11903:320;;;;11756:467;;11790:104;-1:-1:-1;;11823:24:1;;11811:37;;11868:16;;;;-1:-1:-1;11790:104:1;;11903:320;28436:1;28429:14;;;28473:4;28460:18;;11998:1;12012:165;12026:6;12023:1;12020:13;12012:165;;;12104:14;;12091:11;;;12084:35;12147:16;;;;12041:10;;12012:165;;;12016:3;;12206:6;12201:3;12197:16;12190:23;;11756:467;;;;;;;12239:55;12264:29;12289:3;12281:6;12264:29;:::i;:::-;-1:-1:-1;;;10411:20:1;;10456:1;10447:11;;10351:113;12239:55;12232:62;11000:1300;-1:-1:-1;;;;;11000:1300:1:o;12830:499::-;-1:-1:-1;;;;;13099:15:1;;;13081:34;;13151:15;;13146:2;13131:18;;13124:43;13198:2;13183:18;;13176:34;;;13246:3;13241:2;13226:18;;13219:31;;;13024:4;;13267:56;;13303:19;;13295:6;13267:56;:::i;:::-;13259:64;12830:499;-1:-1:-1;;;;;;12830:499:1:o;13613:632::-;13784:2;13836:21;;;13906:13;;13809:18;;;13928:22;;;13755:4;;13784:2;14007:15;;;;13981:2;13966:18;;;13755:4;14050:169;14064:6;14061:1;14058:13;14050:169;;;14125:13;;14113:26;;14194:15;;;;14159:12;;;;14086:1;14079:9;14050:169;;;-1:-1:-1;14236:3:1;;13613:632;-1:-1:-1;;;;;;13613:632:1:o;14831:230::-;14980:2;14969:9;14962:21;14943:4;15000:55;15051:2;15040:9;15036:18;15028:6;15000:55;:::i;15478:414::-;15680:2;15662:21;;;15719:2;15699:18;;;15692:30;15758:34;15753:2;15738:18;;15731:62;-1:-1:-1;;;15824:2:1;15809:18;;15802:48;15882:3;15867:19;;15478:414::o;22369:356::-;22571:2;22553:21;;;22590:18;;;22583:30;22649:34;22644:2;22629:18;;22622:62;22716:2;22701:18;;22369:356::o;24285:413::-;24487:2;24469:21;;;24526:2;24506:18;;;24499:30;24565:34;24560:2;24545:18;;24538:62;-1:-1:-1;;;24631:2:1;24616:18;;24609:47;24688:3;24673:19;;24285:413::o;26246:355::-;26448:2;26430:21;;;26487:2;26467:18;;;26460:30;26526:33;26521:2;26506:18;;26499:61;26592:2;26577:18;;26246:355::o;27345:545::-;27438:4;27444:6;27504:11;27491:25;27598:2;27594:7;27583:8;27567:14;27563:29;27559:43;27539:18;27535:68;27525:96;;27617:1;27614;27607:12;27525:96;27644:33;;27696:20;;;-1:-1:-1;;;;;;27728:30:1;;27725:50;;;27771:1;27768;27761:12;27725:50;27804:4;27792:17;;-1:-1:-1;27855:1:1;27851:14;;;27835;27831:35;27821:46;;27818:66;;;27880:1;27877;27870:12;27895:275;27966:2;27960:9;28031:2;28012:13;;-1:-1:-1;;28008:27:1;27996:40;;-1:-1:-1;;;;;28051:34:1;;28087:22;;;28048:62;28045:88;;;28113:18;;:::i;:::-;28149:2;28142:22;27895:275;;-1:-1:-1;27895:275:1:o;28175:183::-;28235:4;-1:-1:-1;;;;;28260:6:1;28257:30;28254:56;;;28290:18;;:::i;:::-;-1:-1:-1;28335:1:1;28331:14;28347:4;28327:25;;28175:183::o;28489:128::-;28529:3;28560:1;28556:6;28553:1;28550:13;28547:39;;;28566:18;;:::i;:::-;-1:-1:-1;28602:9:1;;28489:128::o;28622:120::-;28662:1;28688;28678:35;;28693:18;;:::i;:::-;-1:-1:-1;28727:9:1;;28622:120::o;28747:168::-;28787:7;28853:1;28849;28845:6;28841:14;28838:1;28835:21;28830:1;28823:9;28816:17;28812:45;28809:71;;;28860:18;;:::i;:::-;-1:-1:-1;28900:9:1;;28747:168::o;28920:125::-;28960:4;28988:1;28985;28982:8;28979:34;;;28993:18;;:::i;:::-;-1:-1:-1;29030:9:1;;28920:125::o;29050:258::-;29122:1;29132:113;29146:6;29143:1;29140:13;29132:113;;;29222:11;;;29216:18;29203:11;;;29196:39;29168:2;29161:10;29132:113;;;29263:6;29260:1;29257:13;29254:48;;;-1:-1:-1;;29298:1:1;29280:16;;29273:27;29050:258::o;29313:380::-;29392:1;29388:12;;;;29435;;;29456:61;;29510:4;29502:6;29498:17;29488:27;;29456:61;29563:2;29555:6;29552:14;29532:18;29529:38;29526:161;;;29609:10;29604:3;29600:20;29597:1;29590:31;29644:4;29641:1;29634:15;29672:4;29669:1;29662:15;29698:135;29737:3;-1:-1:-1;;29758:17:1;;29755:43;;;29778:18;;:::i;:::-;-1:-1:-1;29825:1:1;29814:13;;29698:135::o;29838:112::-;29870:1;29896;29886:35;;29901:18;;:::i;:::-;-1:-1:-1;29935:9:1;;29838:112::o;29955:127::-;30016:10;30011:3;30007:20;30004:1;29997:31;30047:4;30044:1;30037:15;30071:4;30068:1;30061:15;30087:127;30148:10;30143:3;30139:20;30136:1;30129:31;30179:4;30176:1;30169:15;30203:4;30200:1;30193:15;30219:127;30280:10;30275:3;30271:20;30268:1;30261:31;30311:4;30308:1;30301:15;30335:4;30332:1;30325:15;30351:127;30412:10;30407:3;30403:20;30400:1;30393:31;30443:4;30440:1;30433:15;30467:4;30464:1;30457:15;30483:127;30544:10;30539:3;30535:20;30532:1;30525:31;30575:4;30572:1;30565:15;30599:4;30596:1;30589:15;30615:118;30701:5;30694:13;30687:21;30680:5;30677:32;30667:60;;30723:1;30720;30713:12;30667:60;30615:118;:::o;30738:131::-;-1:-1:-1;;;;;;30812:32:1;;30802:43;;30792:71;;30859:1;30856;30849:12
Swarm Source
ipfs://9888ce390e888c581d6e9a41368c7e5a90c8e883943c593b92c6bb0579e828cb
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.